함수 포인터 & void 포인터
Intro
이 글은 함수 포인터에 대한 개념과 설명을 다룹니다.
포인터의 개념
우선 포인터가 말 그대로 무언가를 지시한다는 점을 알아 둘 필요가 있다.
포인터는 어떤 변수의 주소에 접근 하여 그 주소 안에 들어 있는 값을 참조하는 연산을 의미한다.
함수 포인터는 이러한 포인터의 개념처럼 함수의 주소를 참조하여 연산을 수행하는 것을 의미한다.
함수 포인터의 개념
사실 함수도 메모리에 저장된다는 것을 안다면, 함수도 주소가 있는 것이 당연하다.
함수의 주소는 과연 어떻게 참조할 수 있을까?
바로 함수를 선언할 때 사용한 함수의 이름이 바로 함수가 저장된 메모리의 시작 주소이다.
그렇기에 함수 포인터에 함수명을 대입하면 함수를 호출할 수 있는 것이다.
// 함수 포인터 선언 예시
int (*fp)(int, int);
함수 포인터는 변수명 앞에 *를 붙여 포인터임을 표시한다.
그리고 가리키는 함수의 형태를 반환형과 매개변수로 나누어 적는다.
이 때 반드시 변수명을 *와 함께 괄호로 묶어야 한다.
괄호가 없으면 주소를 반환하는 함수 선언이 되기 때문이다.
함수 포인터 활용
#include <stdio.h>
int sum(int, int);
int main(void)
{
int (*fp)(int, int);
int res;
fp = sum;
res = fp(10,20);
printf("result : %d\n", res);
return 0;
}
int sum(int a, int b)
{
return (a + b);
}
void 포인터
void 포인터는 가리키는 자료형이 정해지지 않은 포인터를 의미한다.
가리키는 자료형이 다른 경우라면 void 포인터를 사용한다.
void 포인터 사용 예시
#include <iostream>
int main(void)
{
int a = 10;
double b = 3.5;
void *vp;
vp = &a;
printf("a : %d\n", *(int *)vp);
vp = &b;
printf("b : &.1lf\n", *(double *)vp);
return 0;
}
이처럼 void 포인터는 형 변환을 통해 각기 다른 자료형의 주소를 가리킬 수 있다.
여기서 malloc함수를 선언할 때 함수 앞에 형변환을 선언하는 것은
malloc함수의 원형이 void포인터라는 것 때문이 아닐까 추론을 해보았다.