본문 바로가기
공부/C언어

[C언어] 포인터 심화 – 함수 포인터, void 포인터, main 함수 인자 전달

by 현구원 2025. 5. 18.
반응형

포인터는 C언어의 강력한 기능 중 하나이며, 특히 함수 포인터와 void 포인터는 코드의 유연성과 확장성을 높여줍니다. 이번 포스팅에서는 이 두 가지 포인터 개념과 함께 main 함수에 인자를 전달하는 방법을 정리해보겠습니다.


I. 함수 포인터 📌

함수도 메모리에 저장되므로, 배열처럼 이름은 곧 주소를 의미합니다. 이 주소를 저장하는 포인터가 바로 함수 포인터입니다.

✅ 함수 포인터 선언 방식

반환형 (*포인터이름)(매개변수형1, 매개변수형2, ...);

예를 들어, 두 개의 정수를 받아 덧셈을 수행하는 함수의 포인터는 다음과 같이 선언합니다:

int Add(int a, int b) { return a + b; }

int (*fptr)(int, int) = Add;

✅ 함수 포인터로 함수 호출

int result = fptr(10, 20);  // Add(10, 20) 과 동일

✅ 함수 포인터를 인자로 전달

int Calc(int n1, int n2, int (*op)(int, int)) {
    return op(n1, n2);
}
int Sub(int a, int b) { return a - b; }

int main(void) {
    printf("결과: %d\n", Calc(10, 5, Sub));  // 결과: 5
    return 0;
}

II. void 포인터 🔄

void *는 형(type)이 없는 포인터로, 모든 자료형의 주소값을 저장할 수 있습니다.

✅ 선언 예시

void *ptr;
int num = 10;
ptr = #

❗ 주의점

  • void*는 직접 역참조가 불가능합니다.
  • 포인터 연산 (*, ptr++ 등) 역시 불가능합니다.
  • 특정 자료형으로 형 변환 후 사용해야 합니다.
printf("%d\n", *(int *)ptr);  // 형변환 후 역참조

✅ 활용 예

  • 함수의 인자로 어떤 타입이 올지 모를 때
  • 동적 메모리 할당 (예: malloc) 반환형
  • 다양한 자료형의 주소를 하나의 배열에 저장할 때

III. main 함수로의 인자 전달 🧭

C 프로그램은 main 함수에서 실행이 시작됩니다. 일반적으로는 다음과 같이 작성합니다:

int main(void) { ... }

하지만 프로그램 실행 시 인자 전달을 받을 수 있도록 아래처럼 정의할 수도 있습니다:

int main(int argc, char *argv[]) { ... }

✅ 매개변수 설명

매개변수 의미
argc 인자의 개수 (argument count)
argv 문자열 배열 (argument vector), 각각의 인자를 문자열로 저장
 

✅ 예시

int main(int argc, char *argv[]) {
    for (int i = 0; i < argc; i++) {
        printf("argv[%d] = %s\n", i, argv[i]);
    }
    return 0;
}

💡 실행 예: ./program hello world

argv[0] = ./program
argv[1] = hello
argv[2] = world

 


✅ 요약

개념 요약 설명
함수 포인터 함수 주소를 저장하는 포인터. 유연한 함수 호출에 사용
void 포인터 어떤 형도 담을 수 있는 포인터. 타입 미정일 때 유용
main 인자 전달 argc, argv를 통해 실행 시 인자 입력 처리 가능
 

함수 포인터는 콜백 함수, 전략 패턴 구현 등에, void 포인터는 범용 함수나 자료구조 구현에 자주 쓰입니다.

반응형