[c] 이중포인터

letsbebrave·2022년 5월 10일
0

C

목록 보기
5/7
post-thumbnail

포인터의 메모리 주소를 저장하고 싶을 때 **을 두 번 사용하면 포인터의 포인터(이중 포인터)를 선언할 수 있다.
포인터도 실제로는 변수이기 때문에 메모리 주소를 구할 수 있다. 하지만 포인터의 메모리 주소는 일반 포인터에 저장할 수 없고, int **numPtr2;처럼 이중 포인터에 저장해야 한다.

#include <stdio.h>

int main()
{
	int *numPtr1; // 단일 포인터 선언
    int **numPtr2; // 이중 포인터 선언
    int num1 = 10;
    
    numPtr1 = &num1; // num1의 주소값 저장
    
    numPtr2 = &numPtr1; // numPtr1의 주소값 저장
    
     printf("%d\n", **numPtr2);    // 20: 포인터를 두 번 역참조하여 num1의 메모리 주소에 접근 -> 10 출력됨
     printf("%d\n", *numPtr2);     // num1의 주소 출력됨
     
     return 0;

}

좀 더 알아보기 쉽게 정리

#include <stdio.h>

int main() {
    int a = 3;
    int* x = &a;  // a의 주소값 0x7
    int** y = &x; // x의 주소값 0x8
    // a의 값 = 3
    printf("a의 value = %d\n", a);
    // x의 값 = &a = 0x7
    printf("x의 value = %p\n", x);
    // a의 값 = 3
    printf("a의 value = %d\n", *x);
    // y = &x, *y = &a, **y = 3
    printf("a의 value = %d\n", **y);
    // y의 값(x의 주소값)의 값 = &a = 0x7
    printf("x의 value = a의 주소값(&a) = %p\n", *y);
    // y의 값 = &x = 0x8
    printf("y의 value = x의 주소값(&x) = %p\n", y);
  
    return 0;
}
  

profile
그게, 할 수 있다고 믿어야 해

0개의 댓글