프로그래밍 언어/C

05. 함수 포인터 (Function pointer)와 void 포인터

coding-l7 2025. 6. 27. 11:09

✅ 함수 포인터 (Function Pointer)

함수 이름도 배열 이름처럼 주소를 의미한다.

즉, 함수의 이름은 해당 함수가 저장된 메모리 공간의 시작 주소를 의미하며,

함수를 가리키는 포인터를 선언하고 사용할 수 있다.


📌 선언 방법

int Function(int a, int b);  // 함수 선언
int (*fptr)(int, int) = Function;  // 함수 포인터 선언 및 초기화

📌 함수 호출 방식

int result = fptr(10, 5);     // 함수 호출
// 또는 (*fptr)(10, 5); 도 가능

🔹 함수 포인터를 사용하면 콜백 함수, 배열 내 함수 테이블, 동적 함수 선택 등에 활용할 수 있다.


✅ void 포인터 (Void Pointer)

void *ptr;

void 포인터는 어떠한 타입의 포인터도 저장 가능한 범용 포인터이다.


📌 특징

  • 어떤 자료형의 주소도 저장할 수 있음
    int a = 10;
    void *ptr = &a;
  • 하지만 자료형 정보가 없기 때문에 직접 역참조하거나 연산은 불가능

📌 타입 캐스팅 후 사용

int a = 10;
void *ptr = &a;
printf("%d\n", *(int*)ptr);  // ✅ 올바르게 타입 캐스팅 후 역참조

📌 활용 예시: 동적 메모리 할당

int *arr = (int*)malloc(sizeof(int) * 5);
  • malloc은 void*를 반환하기 때문에,
  • 필요한 타입으로 형변환(casting) 해서 사용해야 함

📌 void 포인터는 언제 쓰이나?

  • 다양한 타입을 하나의 포인터로 관리하고 싶을 때
  • 함수 인자로 어떤 타입이 올지 미리 알 수 없을 때
  • 동적 메모리 할당 함수(malloc, realloc 등)의 반환 값 처리

✅ 요약 정리

구분 설명
함수 포인터 함수를 가리키는 포인터, 콜백 함수 등에 활용
void 포인터 자료형 정보 없이 모든 주소 저장 가능, 연산 불가능

 

💡 함수의 이름과 배열의 이름은 모두 “주소”를 의미한다.

💡 void*는 주소만 저장하고, 타입 정보는 나중에 정해서 처리하는 "범용 포인터"이다.