C언어 배열과 포인터 함수포인터

    2018-02-07 18:15:54 작성

    프로그램이 실행되면 변수만 메모리 공간에 저장되는 것이 아니라 함수도 메모리 공간에 저장되어 호출시 실행이 됩니다.
    함수의 이름도 배열의 이름과 같이 메모리 공간에 저장된 주소값을 의미합니다.
    함수포인터는 메모리 공간에 저장된 함수의 주소값을 저장하는 포인터입니다.
    다음과 같은 함수가 있다면

    int functionName (int args) { .... }
    • 반환형 : int
    • 함수명 : functionName
    • 매개변수 : int 1개

    여기에서 함수명은 함수의 주소값을 의미하는 특별한 상수 형태의 포인터가 됩니다.
    함수 포인터의 type은 반환형과 매개변수 선언을 통해 결정 되도록 약속 되어있습니다.
    다음과 같은 함수들이 있다면

    int func1 (int num) { .... }
    int func2 (int abc) { .... }
    double func3 (double size, int abc) { .... }
    double func4 (double len, int abc) { .... }

    func1과 func2는 반환자료형이 int 이고 매개변수로 int 자료형 1개 갖는 함수 type의 포인터 입니다.
    func3과 func4는 반환자료형이 double 이고 매개변수로 double 1개, int 1개를 갖는 함수 type의 포인터 입니다.
    위의 경우처럼 포인터 type을 약속했으므로 다음과 같이 함수 포인터를 선언할 수 있습니다.

    int (*ptr) (int);
    ptr = func1;
    ptr = func2;

    포인터 변수 ptr은 반환자료형이 int이고 매개변수로 int 자료형 1개를 갖는 함수를 가리킬수 있는 함수 포인터입니다.
    함수이름을 호출 형식이 아닌 함수이름을 변수처럼 대입하면 함수의 주소값을 전달할 수 있습니다.
    함수 포인터 ptr은 func1도 가리킬 수 있고, func2도 가리킬 수 있습니다.

    마찬가지로 func3과 func4를 가리킬수 있는 함수포인터는 다음과 같이 선언할 수 있습니다.

    double (*ptr) (double, int);
    ptr = func3;
    ptr = func4;

    다음은 함수포인터를 활용하는 예제입니다.

    #include <stdio.h>
    
    int min(int, int);
    int max(int, int);
    int comp(int(*order)(int, int)); // 함수포인터를 인자로받은 함수
    
    int main(void) {
    	int choice, result;
    	printf("1. 작은수 , 2.큰수 : ");
    	scanf("%d", &choice);
    	switch (choice)
    	{
    	case 1:
    		result = comp(min); // min 함수를 매개변수로 전달
    		printf("작은수는 : ");
    		break;
    	case 2:
    		result = comp(max); // max 함수를 매개변수로 전달
    		printf("큰수는 : ");
    		break;
    	}
    	printf("%d\n", result);
    	return 0;
    }
    // 작은수를 반환
    int min(int a, int b) {
    	return a < b ? a : b;
    }
    // 큰수를 반환
    int max(int a, int b) {
    	return a > b ? a : b;
    }
    // 두수를 입력받아 전달받은 함수의 결과를 반환
    int comp(int(*order)(int, int)) {
    	int num1, num2, result;
    	printf("두개의 정수를 입력 : ");
    	scanf("%d %d", &num1, &num2);
    	result  = order(num1, num2); // 인자로 전달받은 함수를 호출
    	return result;
    }



    이렇듯 함수포인터를 사용하면 프로그램 동작 방식의 유연성을 제공할 수 있습니다.


    연습문제

    위의 예제를 참고하여 사칙 연산을 수행하는 프로그램을 작성하세요.