프로그래밍/C

C언어 함수 포인터

swedu 2023. 1. 19. 01:00
728x90
반응형

2023.1.18. 최초 작성

 

 

 

포인터 변수는 직접 데이터를 기억하는 것이 아니라 데이터가 기억된 공간의 주소를 기억하는 방식이다.

 

포인터 변수의 핵심은 주소를 기억하는 것이지 그 주소에 반드시 데이터가 있어야 하는 것은 아니다.

함수 포인터는 함수의 주소를 기억하여 원할 때 포인터를 이용해 함수를 호출할 수 있다.

함수의 주소를 포인터로 관리하면 좋은 점은 다른 함수를 호출할 때 함수 포인터를 전달하여 사용할 수 있다는 것이다.

 

아래 코드는 포인터 변수를 사용하는 예제이다.

#include <stdio.h>
void f01() {
	puts("f01함수 실행");
}
int f02(int a) {
	puts("f02함수 실행");
	return a + 10;
}
int f03(void(*pf)()) {
	puts("f03함수 실행");
	pf();
}
void main() {
	void(*pf)();
	pf = f01;
	printf("pf 값 : %p\n", pf);
	printf("f01 주소 : %p\n", &f01);
	pf();
	puts("----------------------------");
	int(*pf2)(int a);
	pf2 = f02;
	printf("pf2 값 : %p\n", pf2);
	printf("f02 주소 : %p\n", &f02);
	printf("f02 리턴값 : %d\n", pf2(100));
	puts("----------------------------");
	f03(pf);
}

[실행 결과]

pf : 00007FF77F8113C5

f01 주소 : 00007FF77F8113C5

f01함수 실행

----------------------------

pf2 : 00007FF77F8113CF

f02 주소 : 00007FF77F8113CF

f02함수 실행

f02 리턴값 : 110

----------------------------

f03함수 실행

f01함수 실행

 

 

 

아래 코드는 함수 포인터를 이용해 매개변수로 받는 문자열을 필터링하는 함수를 전달하는 예제이다.

 

문자열 필터를 전문적으로 하는 개발자가 필터를 개발하는 동안 다른 개발자는 필터가 있다고 생각하고 미리 약속된 형태로 필터를 함수 포인터로 받아 호출하는 구조로 기본적인 프로그램을 만들면 된다.

 

이러한 형태의 예제는 여러 명의 개발자가 함수를 나누어 개발하여 조립하는 구조를 만들 수 있다.

#include <stdio.h>
#include <string.h>
int filter01(char* msg) {
	puts("filter01 함수 실행");
	char* result = strstr(msg, "xxx");
	if (result != NULL) {
		puts("필터링 감지됨");
		return 1;
	}
	else {
		puts("필터링 이상없음");
		return 0;
	}
}
int filter02(char* msg) {
	puts("filter02 함수 실행");
	char* result = strstr(msg, "yyy");
	if (result != NULL) {
		puts("필터링 감지됨");
		return 1;
	}
	else {
		puts("필터링 이상없음");
		return 0;
	}
}
void message(int(*filter)(char* msg), char* msg) {
	puts("---------------------------");
	puts("message 함수 실행");
	printf("입력한 메시지 : %s\n", msg);
	if (filter(msg)) {
		puts("적절하지 않은 메시지를 삭제하였습니다.");
	}
	else {
		printf("message : %s\n", msg);
	}
}
void main() {
	int(*msgFilter)(char* msg);
	msgFilter = filter01;
	message(msgFilter, "hello world");
	message(msgFilter, "helloxxxworld");
	msgFilter = filter02;
	message(msgFilter, "helloxxxworld");
	message(msgFilter, "hello world yyy");
}

[실행 결과]

---------------------------

message 함수 실행

입력한 메시지 : hello world

filter01 함수 실행

필터링 이상없음

message : hello world

---------------------------

message 함수 실행

입력한 메시지 : helloxxxworld

filter01 함수 실행

필터링 감지됨

적절하지 않은 메시지를 삭제하였습니다.

---------------------------

message 함수 실행

입력한 메시지 : helloxxxworld

filter02 함수 실행

필터링 이상없음

message : helloxxxworld

---------------------------

message 함수 실행

입력한 메시지 : hello world yyy

filter02 함수 실행

필터링 감지됨

적절하지 않은 메시지를 삭제하였습니다.

 
 
728x90
반응형

 

728x90
반응형

'프로그래밍 > C' 카테고리의 다른 글

C언어 동적할당 malloc, calloc, realloc, free  (0) 2023.01.20
C언어 구조체 포인터  (0) 2023.01.19
C언어 포인터 배열과 배열 포인터  (0) 2023.01.19
C언어 구조체  (0) 2023.01.17
C언어 문자열 다루기  (0) 2023.01.17