(1) 포인터 배열
: 배열에 메모리 주소 값을 저장할 수 있는 배열. 즉, 포인터를 요소로 지니는 배열이다.

int *arr1[5];

- arr1이라는 이름의 배열을 선언하고 있다.
- 배열의 길이는 10이고, 요소의 자료형은 int형 포인터(int*)이다.
- arr의 포인터 타입은 int형 더블 포인터(int **)이다.

[ *arr[0] ]   [ *arr[1] ]   [ *arr[2] ]   [ *arr[3] ]   [ *arr[4] ]
    ↓                 ↓               ↓                ↓                ↓
  [   ]             [   ]           [   ]             [   ]            [   ]

포인터 배열은 말 그대로 '포인터를 모아놓은 배열' 입니다.
변수의 배열은 많은 수의 변수를 생성할 때 사용합니다.
마찬가지로 포인터 배열은 많은 수의 포인터를 생성할때 사용합니다.

[CODE]
#include<stdio.h>

int main()
{
    char *arr[3] = {
        "Fervent-lecture",
        "TCP/IP",
        "Socket Programming"
    };

    printf("%s\n",arr[0]);
    printf("%s\n",arr[1]);
    printf("%s\n",arr[2]);

    return 0;

}

[RESULT]
Fervent-lecture
TCP/IP
Socket Programming


- arr[0]의 출력 : Fervent-lecture
- *arr의 출력 : Fervent-lecture
- *arr+1의 출력 : ervent-lecture
- *(arr+1)의 출력 : TCP/IP


(2) 배열 포인터
: 배열을 가리킬 수 있는 포인터.

int arr[2][4];    // 2차원 배열

int (*pArr)[4];  // 배열 포인터

- (*pArr) : pArr이 포인터 선언임을 말한다.
- int : 가리킬 수 있는 대상에 대한 정보(즉, int형 변수를 가리키는 포인터)를 말한다.
- [4] : 포인터 연산에 따른 증가 혹은 감소의 폭을 말한다. (+1 시 int형이니까 4byte * 4 = 16바이트 이동)

결론적으로 pArr은 int arr1[2][4], int arr2[3][4]와 같은 배열을 가리킬 수 있는 포인터 이다.

   *pArr[0]
     [●]-----------------> [ ][ ][ ][ ][ ][ ][ ][ ]
배열 포인터

- *pArr[1] 의 경우 녹색[ ]의 주소를 가리킨다.

● Example source



(3) 차이점
○ 포인터 배열 : 각각의 포인터마다 관계가 없는 서로 다른 주소값을 가리킬 수 있다.
○ 배열 포인터 : 연속적인 메모리만 가리킬 수 있다.

by 민트앤라떼 2011. 10. 27. 11:54