Engineering/Data Sturcture

포인터공부4 - 이중포인터

대니ㅋ 2016. 3. 16. 11:15

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

따라서 이 번지를 가리키는 또 다른 포인터 변수를 선언할 수 있는 것이다. 

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


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=&pi;

 

     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