C,C++

[C,C++] 이중 포인터

Acdong 2019. 2. 25. 17:12
728x90

이중 포인터

 

포인터 변수를 가리키는 포인터

= 포인터의 포인터

포인터 변수도 메모리를 차지하고 있으므로 이 변수도 당연히 번지가 있다.

그래서 이중포인터를 선언할 수 있다.

이중 포인터 변수를 선언할 떄는 * 구두점을 두 번 연속해서 쓴다.

int **ppi;

 

= 정수형 대상체를 가리키는 포인터 변수의 번지를 가리키는 포인터

 

int **ppi == (int *) *ppi;


ex) dbIPointer

{

int i;

int *pi;

int **ppi;

i = 1234;

pi = &i;

ppi = π

printf("%d\n",**ppi);

}

 

정수형 포인터 pi가 i의 번지를 가지고 정수형 이중 포인터 변수 ppi에는 pi의 번지를 대입해 놓고 ** 값을 읽으면 결국 i값이 읽혀진다.

i = *pi = **ppi

&i = pi = *ppi

*&i = *&*pi = *&**ppi

* 연산자와 & 연산자는 서로 반대되는 동작을 하는데 이 두 연산자에 의해 가리키고 끄집어 내오다보면 동등한 수식이 여러 개 생길 수있다.

*& 가 붙어있으면 상쇄된다.

ex) FuncAlloc

void inputName(char **pName)

{

*pName = (char *)malloc(12); // 동적메모리 할당

strcpy(*pName,"Cabin"); // "Cabin"이 가리키는 char 형 문자열을 *pName 이 가리키는 곳에 복사한다.

}

void main()

{

char *Name;

 

InputName(&Name);

 

printf("이름은 %s입니다\n",Name);

free(Name);

}

description )

main 에서 char *형의 변수 Name을 선언하고 이 포인터 변수의 번지, 즉 char **형의 이중 포인터를 InputName 함수로 전달했으며 이 함수는 이중 포인터를 형식 인수 pName으로 대입받는다.

 

 

 

 

 

Name은 함수 내부에서 값이 결정되는 출력용 인수이기 때문에 호출원에서 초기화 하지 않아도 상관없다.

 

이중 포인터를 쓰는 이유 ?

포인터 타입의 주소를 함수의 인자로 받으려고 사용한다.

 

 

 

 

 

참조 호출 // 위에 내용이해를 위한 포인터 호출

 

ex) 변수값을 1 증가시키는 plusref 함수

#include < studio.h >

 

void plusref(int *a) // 함수 선언

 

void main()

{

int i ;

i = 5;

plusref(&i);

printf("결과 = %d\n",i);

}

void plusref(int *a)

{

*a = *a + 1 ;

}

 

 

result )

결과 = 6

 

description )

참조 호출은 실인수의 값을 전달하는 것이 아니라 실인수의 번지를 전달하는 방식이다.

&i는 i가 들어있는 번지인데 이 번지를 plusref 함수로 전달했다.

plusref 함수는 이 번지를 a로 받아서 *a = *a+1; 연산을 수행했다.

 

 

 

 

 

 

re

반응형