2학년/C

[C]포인터(2)

CS_student 2023. 7. 25. 14:47

이중포인터

 포인터 변수를 가리키는 포인터를 의미한다. 참조 연산자(*)를 두 번 사용하여 선언한다.

  ex) int num = 10; 

        int* ptr= &num

        int** pptr = &ptr; 

        num = *ptr = **pptr

 

void 포인터

 일반적인 포인터 변수와는 달리 대상이 되는 데이터의 타입을 명시하지 않은 포인터. 따라서 변수,

 함수, 포인터 등 어떠한 값도 가리킬 수 있지만, 포인터 연산이나 메모리 참조와 같은 작업은 할 수 없다.

 즉, void포인터는 주소값을 저장하는 것 이외에는 아무것도 할 수 없는 포인터이다. 따라서 실제로 포인터

 로써의 기능을 진행할 때엔 반드시 주소값을 저장해둔 변수의 자료형에 알맞게 캐스팅 해주어야한다.

 

포인터 변수의 크기 

  어떤 자료형의 포인터인지와 무관하게, 메모리상에서 해당 프로그램이 실행되는 CPU의 1워드만큼의 공간을

  차지한다. 

 

나선규칙

 C언어에서 복잡한 선언문을 만났을 때 적용할 수 있는, 연산자의 우선, 결합순위에 의해 일반화된 공식이다.

     1. 선언된 식별자를 찾은 후, 식별자(변수명 또는 함수명)을 기준으로 시작된다.

     2. 식별자를 기준으로 오른쪽에 기호 "()" 가 있다면 함수 선언, "[]"를 발견한 경우 배열이라 볼 수 있다. 이후

         더 이상 기호가 존재하지 않을 때까지 조사한다.

     3. 식별자 왼쪽에 있는 기호를 보았을 때 *인 경우 포인터가 되며 2.에서 언급된 것이 아닌 경우 있는 그대로 해석

          한다. 왼쪽으로 * 또는 ** 또는 여는 괄호 등 아무것도 발견되지 전까지 이동하며 해석한다.

 

ex) int* p[];

1) 식별자를 찾는다.   (변수명 혹은 함수명) 
          int* p[]; 
      --> p이다.
2) 오른쪽으로 이동했을때 발견된 기호를 찾는다.
           int* p
[];
     --> p는 배열이다.
3) 더 이상 오른쪽에 기호가 존재하지 않으므로 
왼쪽을 탐색한다.
           int* p[];
     --> p는
포인터의 배열이다.
4) 계속 왼쪽으로 이동해서 기호 또는 키워드를 찾는다. 
            int* p[];
     --> p는 int형 포인터 배열이다.