배열은 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 Programming Language 문법

1. C 프로그래밍 언어는? 2. C언어 개발 환경 (실습 환경) 3. C언어의 컴파일 과정 4. C 소스 파일 구성 5. 주석문(Comment) 6. 식별자 명명 규칙 7. C 프로그래밍의 시작 - 함수 8. 변수와 상수 (정수형) 9. 변..

www.it-note.kr

 

 

블로그 이미지

사용자 자연&사람

행복한 개발자 programmer since 1995.

Tag ,

댓글을 달아 주세요