포인터 배열(Pointer Array)


1. 포인터 배열과 배열 포인터의 차이점
int (*ptr)[3]int* arr[3]의 차이점은 무엇일까?
C언어에서는 []와 *연산자 중 []의 우선순위가 높다. 따라서 *를 먼저 처리하는 경우 ()를 사용해서 우선순위를 높여줘야 한다. 따라서 int (*ptr)[3]은 ()로 인해 *의 우선순위가 높다. 따라서 ptr은 우선 포인터이다. 그리고 뒤에 [3]이 있으므로 열의 크기가 3인 2차원 배열을 가리키는 포인터이다.

int* arr[3]은 배열이다. 바로 int 형 포인터를 3개 저장할 수 있는 배열을 나타내는 것이다. 그렇다면 둘의 차이점은 무엇일까? 실제로 이 둘은 사용하면서도 종종 혼동된다. 하지만 사용시 선언된 변수 내 연산자 우선순위가 어느 쪽이 높은지만 안다면 쉽게 구별할 수 있다.

다시 정리하면, int (*ptr)[3]은 열의 크기가 3인 2차원 배열의 시작주소를 가리키는 포인터 하나를 의미한다. int* arr[3]은 int형 포인터 3개를 저장할 수 있는 배열인 것이다.


2. 문자열과 포인터 배열
2차원 배열을 사용해 문자열을 저장해 보자.
int i;
char name[3][20];

strcpy(name[0], "im su jung");
strcpy(name[1], "ryu won");
strcpy(name[2], "song hye kyo");

for (i=0; i<3; i++)
     printf("%s \n", name[i]);

위 프로그램을 실행시켜 보면 다음과 같은 출력을 얻을 수 있다.

im su jung
ryu won
song hye kyo

name[0], name[1], name[2]는 각각 1,2,3 번째 행의 시작주소를 가리키는 포인터 상수가 된다. 정리하면 다음과 같은 관계가 성립하게 된다.
          name == name[0] == &name[0][0]
          name[1] == &name[1][0]
          name[2] == &name[2][0]


name[0]은 행의 시작주소를 가리키므로 다음과 같이 *연산을 사용해 실제 값에 접근 가능하다.
          *name[0] == name[0][0] == 'i'
          *name[1] == name[1][0] == 'r'
          *name[2] == name[2][0] == 's'


하지만 위와 같이 미리 선언해 둔 배열에 문자열을 할당하게 되면 사용하지 않는 부분이 남게 된다. 20개의 문자를 저장할 수 있는 배열에 "ryu won"과 같이 7개의 문자를 저장하면 12개의 공간이 남게된다.
 
이러한 문제점을 해결하기 위해서는 2차원 배열 대신 포인터 배열을 사용해야 한다.
char* strdup2(const char* src);
int main()
{
    int i;
     char* name[4];
     name[0] = strdup2("im su jung");
     name[1] = strdup2("ryu won");
     name[2] = strdup2("song hye kyo");

     for (i=0; i<4; i++)
          printf("%s\n", name[i]);

     for (i=0; i<4; i++)
          free(name[i]);
    return 0;
}

char* strdup2(const char* src)
{
     char* ptr = NULL;
     ptr = (char*) malloc(sizeof(char) * strlen(str)+1);
     strcpy(ptr, src);
     return ptr;
}


Reference : C/C++ 개발자를 위한 KIM 포인터 실무


[프로그래밍/_ C/C++] - [C언어] 포인터와 const 키워드
[프로그래밍/_ C/C++] - [C언어] 널포인터(NULL)
[프로그래밍/_ C/C++] - [C언어] 포인터의 포인터
Posted by Proneer

댓글을 달아 주세요

  1. 2차 배열을 가리키는 포인터를 만들고 싶어, 정보 찾는 중에 들렸습니다.
    잘 보고 갑니다.

    2010.01.20 16:27 신고 [ ADDR : EDIT/ DEL : REPLY ]