함수포인터와 void 포인터

NOAH·2021년 2월 23일
0

함수도 사실 포인터다.

int fct(int n)
{
...
}

int main()
{
fct(3);
return 0;
}

컴퓨터는 main함수가 실행되고 fct(3)를 만나면 어떻게 읽어들일까?
함수의 이름 또한 함수가 저장된 메모리 공간을 가르키는 상수 포인터이기 때문에 가능하다.fct를 받으면 미리 정해진 주소값으로 이동하여 함수를 실행하는 것이다.

함수의 이름이 의미하는 함수 포인터 변수를 선언하여 저장할 수 있다.
함수 포인터 변수를 선언하려면 포인터 타입을 알아야 한다.
위의 fct는 에는 사실 주솟값과 타입정보가 담겨있다.

fct(3)는 반환형을 int이고 매개변수는 정수형 1개인 포인터 타입이다.

함수 포인터 변수를 선언하는 방법

반환형이 int 이고 매개변수가 int 2개인 함수 포인터 선언의 예시

#include <stdio.h>

void SimpleAdder(int n1, int n2)
{
   printf("%d + %d = %d \n", n1, n2, n1+n2 );
}

void ShowString(char * str)
{
   printf("%s \n", str);
}
int main(void)
{
   char * str = "Function pointer";
   int num1 = 10, num2 = 20;
   
   // 함수포인터 변수를 포인터 타입에 맞추어 선언하고 할당까지.
   
   void (*fptr1)(int,int) = SimpleAdder;
   void (*fptr2)(char *) = ShowString;
   
   
   // 함수 포인터 변수에 의한 호출
   
   fptr1(num1, num2);
   fptr2(str);
   
   return 0;
}

10 + 20 = 30 
Function pointer 

형이 존재하는 Void 포인터

  • 어떠한 주솟값도 저장이 가능하다. Int도, 함수도, char도 모두 저장가능
  • 형 정보가 존재하지 않는(void) 포인터변수이기 때문에 * 연산은 불가능

0개의 댓글