함수 포인터
함수 포인터를 설명하기 위해, "초대장"이라는 비유를 사용해 보겠다.
상상해보자. 여러분이 파티에 가기 위한 초대장을 받았다. 이 초대장에는 파티 장소와 시간이 적혀 있고 파티에 가게 위해서는 이 초대장을 가지고 그 장소로 가야한다.
이제 프로그래밍 언어인 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;
}
'윤성우의 C Programming' 카테고리의 다른 글
Chapter 22. 구조체와 사용자 정의 자료형1 (1) (0) | 2024.03.08 |
---|---|
main 함수로의 인자 전달 (3) | 2024.03.06 |
'배열 포인터' 와 '포인터 배열'을 혼동하지 말자 (0) | 2024.03.02 |
2차원 배열 arr, arr[0], arr[0][0] 의 차이 (0) | 2024.03.02 |
2차원 배열이름의 포인터 형 (0) | 2024.03.02 |