반응형
포인터는 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 포인터는 범용 함수나 자료구조 구현에 자주 쓰입니다.
반응형
'공부 > C언어' 카테고리의 다른 글
[C언어] 입출력의 핵심 – 스트림(Stream)과 문자 입출력 함수 정리 (0) | 2025.05.20 |
---|---|
[C언어] 윤성우의 열혈 C 프로그래밍 - 도전! 프로그래밍3 (0) | 2025.05.19 |
[C언어] 포인터 심화 – 2차원 배열의 포인터 형식 (0) | 2025.05.17 |
[C언어] 포인터 심화 – 이중 포인터(double pointer) (0) | 2025.05.16 |
[C언어] 다차원 배열 개념과 활용 정리 (0) | 2025.05.15 |