본문 바로가기

프로그래밍/C

[study] 함수 포인터

 

함수 포인터란? 

- '함수를 가리킬 수 있는 포인터'를 의미한다.

- 함수도 주소를 가지고 있으며, 함수명 앞에 &를 해보면 주소를 확인할 수 있다.

- 주소를 가지고 있다는 것은 포인터도 선언할 수 있다는 것이다.

 

[기본형태]

-> 반환값자료형 (*함수포인터이름)();

 

예시)

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
Recent Posts
Popular Posts
Recent Comments