42 Seoul

[42Seoul] 함수 포인터

jaewpark 2021. 5. 8. 12:31

 함수 포인터를 만들거나, 구조체에 함수 포인터를 넣거나 반환 값으로 함수포인터를 줄 수도 있다.

 함수 포인터는 함수를 저장하는 포인터를 뜻하며, 함수 포인터를 주고 받거나 함수 포인터로 함수를 호출할 수 있다.

 

1. 반환값과 매개변수가 없는 함수 포인터 ▶ void (*fp)();

void hello()
{
	printf("Hello, World!\n");
}

int main()
{
	void (*fp)();
    
	fp = hello;
	fp();
    
	return (0);
}

2. 반환값과 매개변수가 있는 함수 포인터 ▶ int (*fp)(int, int);

int add(int a, int b)
{
	return a + b;
}

int mul(int a, int b)
{
	return a * b;
}

int main()
{
	int (*fp)(int, int);
    
	fp = add;
	printf("%d\n", fp(10, 20));
    
	fp = mul;
	printf("%d\n", fp(10, 20));
    
	return (0);
}

위의 사항을 응용하기

int add(int a, int b)
{
	return a + b;
}

int mul(int a, int b)
{
	return a * b;
}

int main()
{
	int funcNumber;
	int num1, num2;
	int (*fp)(int, int) = NULL;
    
	printf("함수 번호와 계산할 값 입력 : )"
	scanf("%d %d %d\n", &funcNumber, &num1, &num2);
    
	switch (funcNumber)
	{
	case 0:
		fp = add;
		break;
	case 1:
		fp = mul;
		break;
	}
    
	printf("%d\n", fp(num1, num2));
    
	return (0);
}
int add(int a, int b)
{
	return a + b;
}

int mul(int a, int b)
{
	return a * b;
}

int main()
{
	int funcNumber;
	int num1, num2;
	int (*fp[2])(int, int);
    
	// int (*fp[2])(int, int) = {add, mul};
    
	fp[0] = add;
	fp[1] = mul;
    
	printf("함수 번호와 계산할 값 입력 : )"
	scanf("%d %d %d\n", &funcNumber, &num1, &num2);
        
	printf("%d\n", fp(num1, num2));
    
	return (0);
}
struct Calc {
	int (*fp)(int, int);
};

int add(int a, int b)
{
	return a + b;
}

int main()
{
	struct Calc c;
    
	c.fp = add;
    
	printf("%d\n", c.fp(10, 20));
    
	return (0);
}

★ 함수 포인터를 함수의 매개변수로 사용하기

void executer(int (*fp)(int, int))
{
}
int add(int a, int b)
{
    return a + b;
}

void executer(int (*fp)(int, int))    
{
    printf("%d\n", fp(10, 20));    
}

int main()
{
    executer(add);  
    
    return 0;
}

함수 포인터를 함수의 반환값으로 사용하기

int (*getAdd())(int, int)
{
}
int add(int a, int b)   
{
    return a + b;
}

int (*getAdd())(int, int)   
{
    return add;    
}

int main()
{
    printf("%d\n", getAdd()(10, 20));    // 30: getAdd를 호출한 뒤 반환값으로 add 함수 호출

    return 0;
}

매개변수가 있는 함수에서 함수 포인터 반환하기

int (*getAdd(int x, int y))(int, int)    // 함수 포인터 반환, int형 매개변수 두 개
{
    printf("%d %d\n", x, y);    // x, y는 getAdd 함수의 매개변수
    return add;
}

int main()
{
    printf("%d\n", getAdd(8, 9)(10, 20));    // 8, 9는 getAdd에 전달
                                             // 10, 20은 getAdd에서 반환된 add에 전달

    return 0;
}

typedef 반환값자료형 (*함수포인터별칭)(매개변수자료형1, 매개변수자료형2);

typedef int (*FP)(int, int);
int add(int a, int b)    // int형 반환값, int형 매개변수 두 개
{
    return a + b;
}

typedef int (*FP)(int, int);    // FP를 함수 포인터 별칭으로 정의

struct Calc {
    FP fp;   // 함수 포인터 별칭을 구조체 멤버 자료형으로 사용
};

void executer(FP fp)    // 함수 포인터 별칭을 매개변수 자료형으로 사용
{
    printf("%d\n", fp(70, 80));
}

int main()
{
    FP fp1;      // 함수 포인터 별칭으로 변수 선언
    fp1 = add;
    printf("%d\n", fp1(10, 20));     // 30

    FP fp[10];   // 함수 포인터 별칭으로 배열 선언
    fp[0] = add;
    printf("%d\n", fp[0](30, 40));   // 70

    struct Calc c;
    c.fp = add;
    printf("%d\n", c.fp(50, 60));   // 110
    
    executer(add);    // 150: executer를 호출할 때 add 함수의 메모리 주소를 전달

    return 0;
}

https://dojang.io/mod/page/view.php?id=591

 

C 언어 코딩 도장: 68.0 함수 포인터 사용하기

C 언어에서 함수는 이름이 정해져 있죠. 그래서 함수를 호출하려면 함수 이름으로 직접 호출했습니다. void hello() { printf("Hello, world!\n"); } int main() { hello(); // 함수 이름으로 함수를 직접 호출 return

dojang.io