
함수 포인터란?
- '함수를 가리킬 수 있는 포인터'를 의미한다.
- 함수도 주소를 가지고 있으며, 함수명 앞에 &를 해보면 주소를 확인할 수 있다.
- 주소를 가지고 있다는 것은 포인터도 선언할 수 있다는 것이다.
[기본형태]
-> 반환값자료형 (*함수포인터이름)();
예시)
int (*f) (int a, int b)
일반 포인터와 마찬가지로 주소를 가리키기에 *을 사용하여 포인터라고 알려준다.
여기서 맨 앞의 int는 반환형이고, f는 포인터의 이름 (임의로 지정), a와 b는 매개변수를 의미한다.
void (*ff)()
함수명이 ff이고, 반환값은 void로 없고, 매개변수도 없는 함수포인터.
가리키고 싶은 함수의 '반환형, 매개변수' 타입과 포인터의 타입이 일치해야 그 주소값을 포인터에 저장가능하다.
#include <stdio.h>
int sum(int a, int b)
{
return (a + b);
}
int main()
{
int (*ptr)(int a, int b);
ptr = sum;
printf("sum 주소 : %p\n", sum);
printf("ptr 값 : %p", ptr);
return (0);
}
결과 )
sum 주소 : 0x5631bd0f1149
ptr 값 : 0x5631bd0f1149
ptr = &sum 으로 주소를 대입해도 되지만,
함수는 함수 이름 자체로 함수의 주소를 호출해주기에 &를 사용하지 않아도 동작한다.
#include <stdio.h>
void doyou_code()
{
printf("Do you coding?\n");
}
void hello_code()
{
printf("Hello coding!\n");
}
int main()
{
void (*fp)();
fp = doyou_code;
fp();
fp = hello_code;
fp();
return (0);
}
결과 )
Do you coding?
Hello coding!
반환값과 매개변수가 없는 두 함수를 선언해두고, main 문에서 함수포인터를 통해 불러오는 과정이다.
fp라는 마찬가지로 반환값과 매개변수가 없는 함수 포인터를 선언해주고,
doyou_code 함수의 메모리 주소를 함수 포인터 fp에 저장하고 fp를 호출해주면 해당 함수의 동작을 한다.
같은 함수 포인터 fp에 이번에는 hello_code 함수의 메모리 주소를 저장하고 호출하면 hello_code 함수의 동작을 한다.
함수 포인터를 사용해서 함수를 갈아끼우는 기능을 수행할 수 있다는 점이 돋보인다.
이러한 함수 포인터를 사용하는 주된 이유는, '콜백' 매커니즘을 구현하여 함수를 또 다른 함수의 인자로 넘겨주려고 사용한다.
(예를 들어, char *do_strmapi(char const *s, char (*f)(unsigned int, char)); 처럼 매개변수로 함수를 불러오는 것!)
일반적인 함수를 쓰듯이 *과 괄호 생략을 해도 상관없다.
'프로그래밍 > C' 카테고리의 다른 글
[library] isalnum 구현하기 (0) | 2024.03.13 |
---|---|
[study] 구조체 & 구조체 포인터 (0) | 2024.03.13 |
[study] file descriptor 와 open() (0) | 2024.03.12 |
[library] isdigit 구현하기 (0) | 2024.02.29 |
[library] isalpha 구현하기 (0) | 2024.02.29 |