카메라 개발자 공부방(SW)

[13장] 포인터의 포인터(pointer of pointer) 본문

Langauge/C

[13장] 포인터의 포인터(pointer of pointer)

luckmart 2021. 10. 2. 15:02
반응형

자 오늘은 포인터의 포인터를 공부해볼 시간입니다.

 

앞장의 포인터 변수를 꼭 공부를 한 후 찾아와 주세요.

포인터 변수도 어떤 값을 저장하는 메모리 공간(변수)이기 때문에 1바이트마다 주소가 있습니다.

 

다음 코드를 보시죠

#include <stdio.h>

int main()
{
    int n = 10;
    int *pn = &n;
    int **ppn = &pn;

    printf("%p %p %p %p\n", &n, pn, &pn, ppn); 
    return 0;
}

// 실행결과
// 008EF91C 008EF91C 008FF91C 008FF91C

ppn이란 이름의 메모리는 pn의 메모리 공간의 주소를 저장하고 있습니다.

int*의 address type만 저장시킬 수 있습니다.

(pn이란 이름의 메모리 공간은 int*의 address type만 저장시킬 수 있습니다.)

이중 포인터 메모리 그림

 

같은 논리로 triple pointer도 가능합니다.

#include <stdio.h>

int main()
{
    int    n = 10;
    int*   pn = &n;
    int**  ppn = &pn;
    int*** pppn = &ppn

    printf("%p %p %p %p %p %p\n", &n, pn, &pn, ppn, &ppn, pppn); 
    return 0;
}

// 실행결과
// 008EF91C 008EF91C 008FF91C 008FF91C 00CFF91C 00CFF91C

pppn은 int**의 address type만 저장할 수 있습니다.

 

그렇다면 더블 포인터는 도대체 어느 상황에 쓰는 것일까요?

(사실 거의 안 쓰긴 합니다.)

 

본래의 pn이 가리키는 메모리 자체가 매우 큰 상황에 사용됩니다.

이미지의 한 픽셀을 저장하는데 R, G , B, A 각각 int type이 필요하다고 가정해봅시다. 

그러면 1280 x 720 해상도의 크기는 이미지 한 장 당 1280 x 720 x 32 byte의 메모리 공간이 소요됩니다.

 

이렇게 큰 사이즈의 메모리는 메모리 자체를 할당, 소멸, Copy 비용이 어마 무지합니다.

 

C언어로 이런 영상 데이터를 처리한다고 할 땐, 필요할 때마다 메모리를 할당해서 사용하는 것보단
미리 메모리를 할당해 놓고 포인터로 가리키는 주소만 바꿔서 쓰는 것이 큰 이득입니다.

 

tripple 이상의 포인터는 거의 사용되지 않는다고 기억해주셔도 무방합니다! 

자 오늘은 여기까지입니다.

 

 

 

 

 

 

 

 

'Langauge > C' 카테고리의 다른 글

[15장] 문자열 라이브러리(string.h)  (0) 2021.10.04
[14장] 배열과 문자열  (0) 2021.10.03
[12장] 포인터와 배열  (0) 2021.10.01
[11장] 배열  (0) 2021.09.30
[10장] 포인터  (0) 2021.09.29
Comments