티스토리 뷰

함수 포인터

 

함수 포인터 이해

기본 개념

1)함수 포인터란? : 함수의 주소를 저장하는 변수
2)필요성 :

  • 프로그램 코드 간결화
  • 배열로 처리함으로써 중복 코드 제거 가능
  • 상황에 따른 함수 호출
  • 함수를 데이터 형태로 처리 ->함수의 보관과 전달이 용이

3)형식 : 리턴타입(*함수 포인터명)(매개변수리스트);

함수 포인터 형식

[1]리턴과 매개변수가 없는 함수에 대한 함수 포인터

#include  
void hello()
{
    printf(“Hello, world!\n”);
}

void good()
{
    printf(“Good morning!\n”); 
}
int main()
{
    void(*fp)();

    fp = hello;
    fp();

    fp = good;
    fp();

    return 0;
}

 

[2]리턴과 매개변수가 있는 함수에 대한 함수 포인터

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

int sub(int a, int b)
{
    return a - b;
}

int main()
{
    int(*fp)(int, int);

    fp = add;
    printf("%d\n", fp(10, 20));

    fp = sub;
    printf("%d\n", fp(10, 20));
    
    return 0;
}

 

[3]함수 포인터 배열

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

int sub(int a, int b)
{
    return a - b;
}
7
함수 포인터
함수 포인터 이해
함수 포인터 형식
2
함수 포인터 배열
3
#include 
int add(int a, int b)
{
return a + b;
}
int sub(int a, int b)
{
return a - b;
}

int main()
{
    int funcNumber;
    int num1, num2;
    int (*fp)(int, int) = NULL;

    printf(“함수 번호와 계산할 값을 입력하세요: ”);
    scanf(“%d %d %d”, &funcNumber, &num1, &num2);

    switch (funcNumber) {
    case 1:
        fp = add;
        break;
    case 2:
        fp = sub;
        break; 
    }

    printf(“%d\n”, fp(num1, num2));
    return 0; }

 

[4]구조체 멤버

#include 

struct Calc {
    int (*fp)(int, int);
};
int add(int a, int b)
{
    return a + b;
}
*구조체가 함수를 포함하는 형태로 구현 가능*

 

[5]함수의 매개변수

#include 
int add(int a, int b)
{
    return a + b;
}
void calc(int (*fp)(int, int))
{
    printf(“%d\n”, fp(10, 20));
}
int main()
{
    calc(add);
    return 0;
}

 

함수 포인터 활용

qsort()

  • qsort는 stdlib.h를 include 해야 함
  • qsort는 테이블의 자료를 퀵정렬하는 함수임
  • 비교함수는 처리할 자료형에 맞게 직접 구현해야 함
  • 항목 내용
    함수원형 void qsort (void* base, size_t num, size_t size,
    int (*compar)(const void*,const void*));
    헤더 stdlib.h
    기능 테이블의 자료를 퀵 정렬로 내림이나 오름차순으로 정렬
    매개변수 void *base -> 테이블의 포인터 주소
    size_t num -> 테이블에 들어 있는 실제 데이터 개수
    size_t size -> 한 개 요소의 크기
    int (*compar)(const void *, const void *)
    -> 두 요소를 비교하기 위한 함수 포인터
    반환값 void
    구현 비교함수는 직접 구현해야 함 (배열의 자료형과 비교방식이 다르기 때문)
#include 
#include 
    
int values[] = { 40, 10, 100, 90, 20, 25 };
int compare (const void * a, const void * b)
{
    return ( *(int*)a - *(int*)b );
}
int main ()
{
    int n;
    qsort (values, 6, sizeof(int), compare);
    for (n=0; n<6; n++)
        printf (“%d ”,values[n]);
    return 0;
}

 

댓글
© 2018 webstoryboy