C:Function Pointer

aiden·2023년 4월 11일
0

C

목록 보기
18/28

Function Pointer

프로그래머가 정의한 함수들은 모두 프로그램 실행시 메인메모리에 저장되어 실행된다. 함수의 이름은 메모리 상에 저장된 함수의 주소값을 의미한다. 함수의 주소값 또한 양의 정수이므로 포인터 변수에 저장할 수 있다. 이러한 포인터 변수를 함수 포인터 변수라 한다.

함수 포인터의 형은 리턴타입과 매개변수의 정보를 가진다.
함수 포인터는 다음과 같이 선언한다.

int Func(int num){ //리턴타입이 int, 매개변수가 int인 함수
 ...
}

int (*ptr) (int); //리턴타입이 int, 매개변수가 int인 함수 포인터
ptr = Func;
ptr(10);
int Func(int num1, int num2){
	...
}

int (*ptr) (int, int);
ptr = Func;
ptr(3, 5);

함수의 매개변수로 함수 포인터 변수가 전달될 수 있다. 다음의 예제를 참고하면 쉽게 이해할 수 있다.

#include <stdio.h>
int BiggerOrSmaller(int num1, int num2, int (*cmp)(int, int));
int Bigger(int num1, int num2);
int Smaller(int num1, int num2);

int main(void) {
	int num1, num2;

	printf("두 정수를 입력하시오 : ");
	scanf("%d %d", &num1, &num2);

	printf("%d와 %d 중 큰 수는 %d\n", num1, num2, BiggerOrSmaller(num1, num2, Bigger));
	printf("%d와 %d 중 작은 수는 %d", num1, num2, BiggerOrSmaller(num1, num2, Smaller));

	return 0;
}

int BiggerOrSmaller(int num1, int num2, int (*cmp)(int, int)) {
	return cmp(num1, num2);
}

int Bigger(int num1, int num2) {
	int bigger = (num1 > num2) ? num1 : num2;
	return bigger;
}

int Smaller(int num1, int num2) {
	int smaller = (num1 < num2) ? num1 : num2;
	return smaller;
}

두 정수를 입력하시오 : 50 10
50와 10 중 큰 수는 50
50와 10 중 작은 수는 10

void 포인터

void 포인터는 형이 존재하지 않는 포인터 변수이다. 다음과 같이 선언한다.

void *ptr;

이렇게 선언한 void 포인터 변수에는 어떠한 변수의 주소값이나 함수의 주소값을 저장할 수 있다.

하지만 형을 명시하지 않았기 때문에 void 포인터를 이용한 포인터 연산이나 값의 변경, 참조가 불가하다.

메모리 동적 할당과 관계를 가진다.

main 함수로의 인자 전달

지금까지 main함수는 int main(void)와 같이 선언했다.
하지만 다음과 같이 선언할 수 있다.

int main(int argc, char *argv[])

이러한 매개변수를 가진 main함수는 어떻게 동작하는지 다음 예시를 보자.




profile
파인애플 좋아하세요?

0개의 댓글