포인터공부4 - 이중포인터
포인터 변수도 메모리를 차지하고 있으므로 이 변수도 당연히 번지가 있다.
따라서 이 번지를 가리키는 또 다른 포인터 변수를 선언할 수 있는 것이다.
이중 포인터 변수를 선언할 때는 * 구두점을 두 번 연속해서 쓴다.
ex) int **ppi;
#include <stdio.h> #include <string.h> #include <stdlib.h> void main() { int i; int *pi; int **ppi;
i=1234; pi=&i; ppi=π
printf("%d\n",**ppi); } |
옆 소스코드를 그림으로 표현하면 |
이중포인터 **ppi를 조금 더 살펴보면
다음의 수식들은 모두 동등한 대상을 나타낸다 (위 예제 참고)
i=*pi=**ppi
&i=pi=*ppi
*&i=*&*pi=*&**ppi
이중포인터의 실제 활용 예제에 대해서 알아보자
#include <stdio.h> #include <string.h> #include <stdlib.h> void InputName(char **pName) { *pName=(char *)malloc(12); strcpy(*pName,"Cabin"); }
void main() { char *Name;
InputName(&Name); printf("이름은 %s입니다\n",Name); free(Name); } |
이름의 길이가 얼마나 되는지 입력 전에는 알 수 없기 때문에 이중포인터의 활용이 필요하다
1. main 함수에서 char *형 변수 Name 선언 2. Name 포인터의 번지(= char **형 변수.이중포인터)를 InputName함수로 전달 (**pName가 받음) 3. InputName함수는 필요한 메모리를 동적할당 (여기서는 12로 가정) 4. 할당된 번지를 *pName에 대입 5. 할당된 번지에 Name을 복사
이를 이해하기 쉽게 그림으로 표현하면
InputName 함수는 main의 Name 포인터 변수를 참조하고 Name에 직접 메모리를 할당하고 이 번지에 scanf로 이름을 입력한 것이다 InputName이 리턴되었을 때 Name은 12바이트 길이로 할당된 번지를 가리키며
[참고사항] * strcpy : 문자열 복사 함수. 여기서는 scanf로 받은 이름이 'Cabin'이라고 가정한 것이다 strcpy함수의 원형 char* strcpy(char * dest, char* src); src에 들어있는 문자열을 dest로 복사. src = char 형 포인터 src의 주소로 가서 문자를 복사하다 NULL문자가 나오면 복사 중단 [출력] 이름은 Cabin입니다. |
여기서 잘못생각하여 InputName함수가 char * 형을 받도록 작성하면 제대로 동작하지 않는다
void InputName(char *pName) { pName=(char *)malloc(12); strcpy(pName,"Cabin"); }
void main() { char *Name;
InputName(Name); printf("이름은 %s입니다\n",Name); free(Name); }
|
-------------------------------------------------------------------- 1. main 함수에서 Name을 선언 2. 초기화되지 않은 Name의 값을 InputName함수의 pName으로 전달 3. pName에 메모리가 할당되고 이름도 복사된다 4. pName의 이름이 main함수의 Name에 전달되지 않는다! |
참조사이트 : http://www.soen.kr