플로렌스라는 개발자

C언어 함수 포인터와 void 포인터

프로그래밍/C 2019.04.18 댓글 0 Plorence

목차

    함수 포인터

    함수의 이름은 포인터입니다. 마치 배열의 이름이 포인터인듯이 함수의 이름도 포인터입니다.
    이걸 함수 포인터라고 하고 배열의 이름과 마찬가지로 상수 형태입니다.

     

    함수 포인터의 특징

    • 함수의 이름은 함수가 저장된 메모리 공간을 가리키는 포인터이다(함수 포인터).
    • 함수의 이름이 의미하는 주소 값은 함수 포인터 변수를 선언해서 저장할 수 있다.
    • 함수 포인터 변수를 선언할려면 함수 포인터의 형(type)을 알아야한다.

    함수 포인터의 형

    함수 포인터의 형 정보에는 반환형과 매개변수 선언에 대한 정보를 담기로 약속합니다.
    즉, 함수의 반환형과 매개변수 선언이 동일한 두 함수의 함수 포인터 형은 일치합니다.
    함수 포인터의 형을 함수 시그니처(function signature)라고도 부르는데,이건 C++ 함수 오버로딩에서 설명합니다.

     

    함수 포인터 변수의 선언

    ReturnType (*Name) (FunctionSignature)

    문법은 위와 같습니다.

    예시를 하나 들어보자면

    int fet (int num) {
        return num;
    }

    위와같은 함수가 있을때

    int (*ptr) (int);

    함수 포인터는 이렇게 선언합니다.

    #include <stdio.h>
    int fet(int num) {
           return num;
    }
    int main(void) {
           int(*ptr) (int) = fet;
           printf("%d \n", ptr(10));
           printf("%d \n", fet(10));
    }

    포인터랑 똑같이 함수의 주소를 포인터에 대입하여 사용합니다.

     

    쓰는 이유

    C언어에서 직접적으로 사용한적은 없는데 이와 비슷한 기능을 하는 것을 타 언어에서 써본적이 있습니다.

    지금 당장은 필요없으신분이 99.9%겠지만 함수 포인터가 필요할 정도로 언어를 배웠다면 그때 찾아보셔도 금방 습득이 가능합니다.

    그래도 알고싶다면 아래 링크를 참고하세요.

     

    함수포인터를 사용하는 근본적인 이유가 무엇이라고 생각하시나요? | KLDP

    굳이 함수포인터를 사용할 필요가 있는건지 궁금합니다. 초기 언어 개발 시에 함수포인터라는 개념을 왜 사용하게 되었는지 궁금하네용

    kldp.org

    void 포인터

    형 정보가 존재하지 않은 포인터 변수이기에 타입에 상관없이 어떠한 주소 값도 저장이 가능합니다.
    포인터는 주소값 + 타입이 있어야 하고,일치하여야 합니다.
    형 정보가 없기 때문에 *연산자로 역 참조는 불가능합니다.

    #include <stdio.h>
    int main(void) {
           double d = 3.14;
           int i = 10;
           void * ptr = &d;
           ptr = &d;
           *ptr = 10; //에러 발생
    }

    댓글

    0