본문 바로가기

Data Structure [C]/문돌이도 할 수 있는 [C언어 자료구조]

#11 [C 자료구조] 이중 포인터: 나를 가르키는 너를 가르키는 타인

포인터는 포인터를 가리키는 포인터가 있다.

변수 <- 포인터 <- 포인터의 포인터 의 구조가 있다는 말이다. 물론 이렇게 쭉 이어지는 것은 아니다.

포인터 변수도 하나의 기억공간으로 봐서 이 포인터를 구할 수 있다. 이를 이중 포인터라고 한다. 다행히 삼중 사중은 없다.

이중포인터의 표기는

**pp 이렇게 *를 두개 붙인다. 직관 끝판왕.

 

그래서 값을 abc 라고 두면

*p = abc

*pp = p

**pp = abc

&abc = p

&p = pp

이러한 식을 도출해낼 수 있다.


 

 

 

void 포인터

int형 변수의 포인터를 void 포인터로 형변환을 시킬 수 있다.

무슨 말이냐?

void *vp;

라고 지정해두면 vp가 가르키는 변수는 아직 정해지지 않았지만 일단 포인터를 만들었다는 뜻이다.

이는 추후에 지정하기 위함이다. 예를 들어 vp = &num 요로케!

자료형과 상관 없이 포인터를 붙일 수 있다는 장점이 있다.

그러나 반대로 void 포인터가 가리키는 곳의 값을 사용하려면 다시 형변환을 해야한다.

말인 즉슨,

 

int main(void) {
  int num = 1182;
  void *p

  p = &num

  printf("%d", *p);
  return 0;
}

이런 식으로 컴파일을 하게 되면 오류가 생긴다. *p의 자료형이 없어서 얼만큼의 Byte를 읽어와야하는지 모르기 때문이다!멍청

 

따라서 우리는 수고스럽게 다음과 같이 만들어줘야한다.

int main(void) {
  int num = 1182;
  void *p

  p = &num

  printf("%d", *(int*)p);
  return 0;
}

이렇게 해야 p포인터가 가르키는 변수가 int라는 것을 알고 불러오게 된다.

 

오늘은 여기까지! 이제 포인터를 끝내고 다음 단계로 넘어가본다!!