Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- Pixel Bit Format
- AppInventer
- 고정비트레이트
- Patch Cleaner
- 아이리스
- main 함수 인자 전달
- Depth of Fileld
- 조건 제어문
- 실생활알고리즘
- 간단한 앱만들어보기
- 프로그래머스 lv2
- 과초점거리
- Zoom Lense
- 렌즈
- c언어
- CS Mount
- Digital Slow Shutter
- 변수
- C Mount
- camera
- 카메라
- ASCCII
- 무게선별자동화
- 저조도
- 저장소와 동적메모리
- 심도
- image sensor
- Gain
- 이미지센서
- 변수의 초기화와 대입
Archives
- Today
- Total
카메라 개발자 공부방(SW)
[13장] 포인터의 포인터(pointer of pointer) 본문
반응형
자 오늘은 포인터의 포인터를 공부해볼 시간입니다.
앞장의 포인터 변수를 꼭 공부를 한 후 찾아와 주세요.
포인터 변수도 어떤 값을 저장하는 메모리 공간(변수)이기 때문에 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