이중 포인터
포인터 변수를 가리키는 포인터
= 포인터의 포인터
포인터 변수도 메모리를 차지하고 있으므로 이 변수도 당연히 번지가 있다.
그래서 이중포인터를 선언할 수 있다.
이중 포인터 변수를 선언할 떄는 * 구두점을 두 번 연속해서 쓴다.
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
'C,C++' 카테고리의 다른 글
[C#] Class 클래스 사용_Random 과 List (0) | 2019.04.11 |
---|---|
[C,C++] 배열과 포인터 (0) | 2019.02.28 |
[C,C++] 포인터 동적 메모리 할당 (0) | 2019.02.25 |
[C,C++] 포인터 연산 (0) | 2019.02.25 |
[C,C++] 포인터의 정의 , 포인터 란? (1) | 2019.02.25 |