일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Zoom Lense
- 조건 제어문
- main 함수 인자 전달
- 프로그래머스 lv2
- 과초점거리
- 저조도
- 무게선별자동화
- 아이리스
- ASCCII
- 저장소와 동적메모리
- 렌즈
- image sensor
- Digital Slow Shutter
- Depth of Fileld
- Gain
- AppInventer
- Pixel Bit Format
- 변수의 초기화와 대입
- 이미지센서
- 간단한 앱만들어보기
- 변수
- Patch Cleaner
- c언어
- camera
- 카메라
- 심도
- 고정비트레이트
- CS Mount
- C Mount
- 실생활알고리즘
- Today
- Total
카메라 개발자 공부방(SW)
[21장] 함수 포인터 본문
다음은 함수 포인터에 대해 공부해보겠습니다.
함수가 익숙하지 않으시다면 사용자 함수 부분을 꼭 복습해주세요.
다음 코드를 보시겠습니다.
#include <stdio.h>
void Print()
{
printf("%p\n", Print);
}
void Add(int x, int y)
{
printf("%d+%d=%d\n", x, y, x + y);
}
int main()
{
printf("%p\n", Print);
printf("%p\n", Add);
printf("%p\n", main);
return 0;
}
// 실행결과
// function address
// function address
// function address
함수의 이름은 그 함수의 시작 주소입니다.
함수의 이름도 포인터기 때문에 포인터 변수에 저장할 수 있습니다.
함수의 포인터를 저장하기 위해선 함수의 선언을 알아야 됩니다.
void Print()
{
printf("%p\n", Print);
}
의 함수의 선언은 void Print()이고
void Add(int x, int y)
{
printf("%d+%d=%d\n", x, y, x + y);
}
의 함수의 선언은 void Add(int x, int y);입니다.
함수의 선언을 알면 함수 포인터를 선할 수 있습니다.
#include <stdio.h>
void Print()
{
printf("%p\n", Print);
}
void Add(int x, int y)
{
printf("%d+%d=%d\n", x, y, x + y);
}
int main()
{
void (*pPrint)();
pPrint = Print;
printf("%p %p %p\n", pPrint, *pPrint, Print);
void (*pAdd)(int, int)
pAdd = Add;
printf("%p %p %p\n", pAdd, *pAdd, Add);
return 0;
}
// 실행결과
// 000F129E 000F129E 000F129E
// 000F13A2 000F13A2 000F13A2
여기서 결과를 보시면 이상한 부분이 하나 있는데, 함수 포인터에 *를 붙여도 그대로 주소인 것을 알 수 있습니다.
변수 때는 메모리 그 자체가 되었죠?
*연산은 선언된 위치와 사용 용도에 따라서 기능이 달라집니다.
함수 포인터에선 *를 붙이면 그냥 함수의 시작주소를 의미합니다.
자 그 다음은 함수 호출에 대해서 다시 이야기해보겠습니다. 함수 호출은 함수의 이름()라고 이야기했었죠?
함수의 주소()로 함수 호출이 가능합니다.
#include <stdio.h>
void Print()
{
printf("%p\n", Print);
}
int main()
{
void (*pPrint)();
pPrint = Print;
Print();
pPrint();
*pPrint();
return 0;
}
// 실행결과
// Print
// Print
// Print
이 결과가 이해가 되시죠? () 앞에는 함수의 주소가 옵니다.
pPrint, (*pPrint), pPrint든 다 같은 주소 값이기 때문에 동일한 함수가 호출이 되는 것입니다.
그렇다면 함수 포인터는 어느 때에 사용할까요?
1) 함수의 주소를 이용하면 동일한 이름으로 함수를 호출시킬 수 있습니다.(인터페이스 제공)
2) 실행시간에 유저의 정책(함수)을 서버에 쉽게 반영할 수 있는 유연성을 제공합니다.
3) 콜백(CallBack) 메커니즘을 구현할 수 있습니다. 서버 단에서 client 정책을 반영시킬 수 있습니다.
서버 입장에서는 어떤 코드가 올지 모르는 상황이고 함수 포인터만 받아서 실행시킵니다.
당장에 이해가 안 돼도, 다음에 공부하면 다 알게 됩니다.
자 오늘은 여기까지
'Langauge > C' 카테고리의 다른 글
[23장] 파일 입출력 (0) | 2021.10.12 |
---|---|
[22장] 재귀함수 (0) | 2021.10.11 |
[20장] void 포인터 (0) | 2021.10.09 |
[19장] 2차원 배열 (0) | 2021.10.08 |
[18장] 구조체 (0) | 2021.10.07 |