배열은 1차원 배열, 2차원 배열, ... 다차원 배열을 선언하여 사용할 수 있습니다. 배열은 차원이 증가할 수록 마치 직선, 면적, 부피처럼 표현이 됩니다. 그래서 배열은 차원이라는 용어로 표현을 합니다. 그런데, 포인터는 단일 포인터, 2중포인터, 3중 포인터, ... 등 다중포인터라고 표현을 합니다. (아, 어려워....;;;)
다중 포인터는 *의 갯수로 n중 포인터로 결정이 됩니다.
int *ptr; // 단일 포인터
int **pptr; // 이중 포인터
int ***ppptr; // 삼중 포인터
위와 같이 *의 갯수가 2개 이상으로 선언된 포인터를 다중 포인터라라고 합니다.
int *ptr; // 단일 포인터
위의 변수 ptr은 ptr에 int type의 데이터가 저장된 위치를 저장한다는 의미입니다. 따라서 ptr을 사용할 때에는
ptr = (int *)malloc(sizeof(int) * 100);
처럼 100개의 int 데이터를 저장할 수 있는 공간을 할당하여 사용합니다.
int **pptr; // 이중 포인터
위의 변수 pptr은 int * 타입의 데이터를 저장하고 있는 번지를 저장합니다.
따라서 사용할 때에,
pptr = (int **)malloc(sizeof(int *) * 100);
처럼 2차원 배열의 row부분의 크기를 할당받습니다.
그리고
pptr[0] ~ pptr[99]까지 사용이 가능한 데, pptr[0]의 type은 int * 상태가 되므로
pptr[0] = (int *)malloc(sizeof(int) * 200);
pptr[1] = (int *)malloc(sizeof(int) * 100);
...
위와 같이 배열과는 다르게 각각의 row에 크기를 다르게 설정할 수 있습니다.
또한 배열은 전체가 연속적인 메모리 공간에 할당되지만, 포인터는 각각 할당된 영역이 연속적인 공간이 아니고 malloc()함수에 의해서 할당된 메모리 위치는 어떤 곳이 할당될 지 알 수 없으며, 연속성을 가지 않습니다.
그리고 데이터에 대한 접근은
pptr[0][0] = 1000;
...
2차원 배열 처럼 사용할 수 있습니다.
다 사용후에 메모리를 해제하려면,
int n;
for(n = 0; n < 100; n++)
{
free(pptr[n]);
}
free(pptr);
위와 같이 항목 하나 하나를 먼저 해제하고, 마지막으로 전체 겁데기인 pptr의 메모리를 해제합니다.
'C언어 > 문법' 카테고리의 다른 글
25. 포인터(Pointer) - 함수 포인터 (2) | 2019.12.02 |
---|---|
24. 포인터(Pointer) - void * 포인터 (0) | 2019.12.02 |
22. 포인터(Pointer)와 배열(Array) (6) | 2019.11.27 |
21. 포인터(Pointer) - 동적 메모리 할당 (0) | 2019.11.26 |
20. 포인터(Pointer) - Call by value와 Call by Reference (4) | 2019.11.23 |