본문 바로가기

윤성우의 C Programming

Chapter 19. 함수 포인터와 void 포인터

함수 포인터

함수 포인터를 설명하기 위해, "초대장"이라는 비유를 사용해 보겠다.

상상해보자. 여러분이 파티에 가기 위한 초대장을 받았다. 이 초대장에는 파티 장소와 시간이 적혀 있고 파티에 가게 위해서는 이 초대장을 가지고 그 장소로 가야한다. 

 

이제 프로그래밍 언어인 C에서의 함수 포인터를 생각해보자. 여기서 "함수"는 파티, "포인터"는 초대장과 같다. 즉, 함수 포인터는 어떤 함수로 가기 위한 "초대장"과 같은 것이다. 이 초대장(함수 포인터)을 사용하면, 그 초대장이 가리키는 함수(파티)를 실행할 수 있다.즉,   함수의 주소 값 저장을 위한 포인터 변수를 별도로 선언할 수 있으며, 이러한 용도로 선언된 포인터 변수를 가리켜 '함수 포인터 변수'라 한다.또한  배열의 이름이 배열의 시작주소 값을 의미하듯, 함수의 이름도 함수가 저장된 메모리 공간의 주소 값을 의미한다. 

 

함수 포인터 변수 문법

# 문법
반환타입 (*포인터변수이름)(매개변수타입1, 매개변수타입2, ...);

# 예제
int (*funcPtr)(int, int);

 

함수포인터 예시 코드

#include <stdio.h>

// 두 정수를 더하는 함수
int add(int a, int b) {
    return a + b;
}

int main() {
    // 함수 포인터 선언: 반환 타입(*포인터 이름)(매개변수 타입)
    int (*funcPtr)(int, int);

    // 함수 포인터에 add 함수의 주소 할당
    funcPtr = add;

    // 함수 포인터를 사용하여 add 함수 호출
    int result = funcPtr(3, 4);
    printf("결과: %d\n", result);

    return 0;
}

void 포인터

void 포인터 설명을 위해서는 "택배 박스"라는 비유를 사용해 보겠다.

우체국에서 택배를 보낸다고 상상해보자. 박스에는 어떤 내용물이든 담을 수 있다. 택배를 보내기 전 어떤 물품을 보내는지 운송장에 적어야 한다. 또한 박스는 어떤 내용물이든 담을 수만 있을 뿐 안에 들어 있는 내용물을 변형할 수는 없다. 

 

C 프로그래밍에서 void 포인터는 바로 우체국에 판매되고 있는 택배 박스와 같다. void 포인터는 어떤 특정한 종류의 데이터를 가리키지 않는다. 그래서 이 포인터를 사용해서 어떤 종류의 데이터라도 가리킬 수 있다. 하지만, 실제로 그 데이터를 사용하기 전에는, 데이터가 어떤 종류인지 정확히 알려줘야 한다. void 포인터는  어떠한 타입의 데이터도 가리킬 수 있지만, 직접 그 데이터를 참조하거나 변경할 수는 없다. void 포인터의 주요 사용 사례는 임의의 타입의 데이터를 참조해야 할 때와 다양한 타입의 객체들을 하나의 포인터로 관리해야 할 때이다.

 

void 포인터 문법

# 문법
void *pointerName;

# 예시
void *ptr
#include <stdio.h>

int main() {
    int a = 5;
    float b = 5.5;
    
    // void 포인터 선언 및 초기화
    void *ptr;
    
    // void 포인터에 int 타입 변수의 주소 할당
    ptr = &a;
    printf("int 값: %d\n", *(int *)ptr);
    
    // void 포인터에 float 타입 변수의 주소 할당
    ptr = &b;
    printf("float 값: %f\n", *(float *)ptr);
    
    return 0;
}