본문 바로가기

C&C++_Basic/C_Pointer

# C언어 포인터 : 이중 포인터 기초 1

#include<stdio.h>


int main()

{

    int i =20;
    int *pi = &i;
    int **dpi = &pi; 

    /*
    
    int *pi = &i; 는 다음과 같이 표현할 수도 있다.
	
	>> 
	int *pi;
	pi = &i;
	즉, 다시 말해서, pi 는 i 의 주소값을 가리키는 포인터이다.
	그러므로 출력시 *pi = i , 즉, i 의 상수값이 출력된다.
	
	이번에는 int **dpi 를 살펴보자
	int **dpi = &pi; 도 다른 식으로 표현될 수 있다.
	
	>>
	int **dpi ;
	dpi = &pi;
	
	이제 **dpi 즉, 이와 같이 **가 2개 붙으면, 이중 포인터라고 생각하면 된다.
	이중 포인터 dpi 는 포인터 pi 의 주소값을 가리키는 것.
	그러므로 *dpi 는, 포인터 pi 의 '값'을 가리킬 것인데, 여기서 pi 의 '값'이란  pi 이다. 즉, *dpi = pi 이다.
	그런데, pi  = &i, 즉, 포인터 pi 는 또다시, i의 주소값을 가리킨다.
	결국 *dpi = pi = &i 라고 할 수 있다.
	
	한번 더 나아가서
	**dpi 는 pi에 *를 하나더 붙여서 *pi가 된다.  
	그리고 위에서 말했듯이 *pi = i  로, i의 '값'을 나타낸다.
	따라서 
	**dpi = *pi = i 라고 표현할 수 있다.
	 */
    	printf("%p %p %p\n",&i,pi,*dpi);


    *pi = i+2 ; 
	// i = i+2 와 같은 코드이다. 왜냐하면 *pi = i 이기 때문에
	// i + 2  = 22 가 되는데, 아래 보면 printf(" %p ") 를 적었다. 
	// %d 는 10진수의 '값'을, ' %p 는 10진수 값의 '주소값' 을 출력해줄 때 쓴다라는 차이점이 있다.  
 
		printf("%p %p %p\n",i,*pi,**dpi);
	// 여기서는 %d 를 썼다면, 22 가 출력됬을 것이지만, %p 를 썼기 때문에 10진수 값 22의 주소값이 출력된다.  

    **dpi = *pi +2;
	// i = i+2 와 같은 값, 위와 같은 원리.  

    	printf("%p %p %p\n",i,*pi,**dpi);

		return 0;

}