C 언어 포인터 사용 요약

7609 단어 C 언어포인터

전언


이 블로그는 @qyuhen 대신이 유명한 C99 학습 노트를 옮겨 싣고 그 중에서 지침 내용에 대한 소개를 총괄하였다.
프로젝트에 대량의 c프로그래밍이 필요하기 때문에 학습의 기회를 빌려 독서 노트를 기록합니다.

포인터 상수


포인터 상수란 '형식이 상수인 포인터' 를 가리키며 초기화 후 수정할 수 없으며 메모리 주소를 고정적으로 가리킨다.즉, 우리는 바늘 자체의 값을 수정할 수 없지만 바늘이 목표를 가리키는 값을 수정할 수 있다.
int x[] = {1, 2, 3, 4};
int* const p = x;

for (int i = 0; i < 4; i ++) {
    int v = *(p + i);
    *(p + i) = ++v;

    printf("%d
"
, v); // p ++; // Compile Error! }

상수 지침


상수 포인터는 상수 데이터를 가리키는 포인터로 포인터가 가리키는 목표는 상수로 처리되어 포인터를 통해 값을 부여할 수 없다.바늘 자체는 비상량으로 다른 위치를 가리킬 수 있지만 값을 부여할 수 없다.
int x = 1, y = 2;

const int *p = &x;
// *p = 100; // Compile Error!

p = &y;
printf("%d
"
, *p); // *p = 100; // Compile Error!

지침의 상량과 상량을 구별하는 방법은 매우 간단하다. const가 수식한 사람이 누구인지, 즉 *const의 왼쪽에 있는지 오른쪽에 있는지 보자.
4
  • int* constp: const 코스메틱 포인터 변수 p.포인터 상수입니다.

  • 4
  • int const*p: const는 포인터가 가리키는 내용*p를 수식합니다.상수 지침입니다.

  • 4
  • const int* constp: 상수를 가리키는 포인터 상수

  • 바늘의 바늘


    바늘 자체도 메모리 영역의 데이터 변수이기 때문에 자연히 다른 바늘로 그것을 가리킬 수도 있다.
    int x = 10;
    int* p = &x;
    int** p2 = &p;
    
    printf("p = %p, *p = %d
    "
    , p, *p); printf("p2 = %p, *p2 = %x
    "
    , p2, *p2); printf("x = %d, %d
    "
    , *p, **p2);

    출력:
    p=0x7fff2a16934c, *p=10
    p2=0x7fff2a169350, *p2=2a16934c
    x=10, 10

    이를 통해 알 수 있듯이 p2는 지침p의 주소를 저장하기 때문에 지침의 지침이 있다.

    배열 포인터


    숫자 포인터는 '그룹을 가리키는 포인터' 를 가리킨다.여기서 주의해야 할 것은 절대로'수조 지침'과'수조 이름'을 혼동해서는 안 된다는 것이다. 그들 둘의 차이는 다음과 같다.
    4
  • 그룹 이름: 그룹의 원소를 가리키는 바늘 상수입니다.배열 이름은 포인터 상수이므로 자가 또는 자감 작업을 수행할 수 없습니다

  • 4
  • 수조 바늘: 수조를 가리키는 바늘로 전체 수조를 하나의 대상으로 삼는 것이지 그 중의 구성원이 아니다
  • int x[] = {1, 2, 3, 4};
    
    int* p1 = x; //         ,  p            
    int (*p2)[] = &x; //     
    
    for (int i = 0; i < 4; i ++) {
        printf("%d, %d
    "
    , *(p1 + i), (*p2)[i]); }

    p1의 형식은 int*입니다. 이것은 그룹 이름 x로 지정됩니다. 즉, 그룹의 첫 번째 원소를 가리키는 바늘 상수입니다.p2는 수조 지침으로 수조를 하나의 전체로 간주한다. 유형의 측면에서 볼 때 수조 유형과 수조 원소 유형은 두 가지 개념이다. 따라서'p2=&x'에서 x는 수조 자체를 대표하고 수조의 첫 번째 원소 주소가 아니라 &x가 취한 것은 수조 지침이다.
    자신의 이해:
    4
  • 수조명 x, x+1이 가리키는 다음 원소

  • 4
  • 수조 포인터 p, p+1은 전체 수조의 편이를 직접 추가한 것으로 현재 수조를 넘어섰다

  • 포인터 배열


    요소 유형이 포인터인 배열을 포인터 배열이라고 합니다.
    int x[] = {1, 2, 3, 4};
    int* ps[] = {x, x + 1, x + 2, x + 3}; //     
    
    for (int i = 0; i < 4; i ++) {
        printf("%d
    "
    , *(ps[i])); }

    기본값은 그룹의 첫 번째 원소를 가리키는 바늘 상수입니다. 그러면 x+n은 자동으로 후속 원소의 바늘을 가져옵니다.
    바늘 수조는 보통 엇갈린 수조 (수조라고도 불리는 수조) 를 처리하는데, 가장 흔히 볼 수 있는 것은 문자열 수조이다.
    void test(const char** x, int len)
    {
        for (int i = 0; i < len; i ++) {
            printf("test : %d = %s
    "
    , i, *(x + i)); } } int main(void) { char* a = "aaa"; char* b = "bbb"; char* ss[] = {a, b}; for (int i = 0; i < 2; i ++) { printf("%d = %s
    "
    , i, ss[i]); } test(ss, 2); return 0; }

    함수 포인터


    기본적으로 함수 이름은 이 함수를 가리키는 바늘 상수입니다.
    void inc(int* x)
    {
        *x += 1;
    }
    
    int main(void)
    {
        void (*f)(int *) = inc; //  inc       f
        int i = 100;
        f(&i);
        printf("%d
    "
    , i); return 0; }

    함수 바늘의 설명이 보기 싫다면 typedef로 다시 쓸 수 있습니다.참고:
    4
  • 함수 포인터 유형 정의: typedef void () (int) inct; 또는 typedef void(inc t)(int)후자는 더 많이 쓰지만 전자는 더 잘 이해한다

  • 4
  • 함수 유형 정의: typedef void(inc t)(int*)
  • 좋은 웹페이지 즐겨찾기