Void 포인터 복습
Coddy C 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 61개 중 49번째.
void*는 C에서 "무언가를 가리키는 포인터이지만, 그것이 무엇인지는 말하지 않겠다"라고 표현하는 방식입니다. 이 포인터는 int, float, 구조체 또는 그 밖의 어떤 데이터 유형의 주소든 저장할 수 있습니다. 따라서 C에서 제네릭 코드를 작성하는 기반이 됩니다.
문제는 void*를 직접 역참조할 수 없다는 것입니다. 컴파일러는 읽어야 할 바이트 수나 해당 바이트를 해석하는 방법을 알지 못합니다. 데이터를 사용하려면 올바른 유형으로 다시 캐스팅해야 합니다.
void print_int(void* data) {
int* p = (int*)data;
printf("%d\n", *p);
}
int main() {
int x = 42;
print_int(&x);
return 0;
}이러한 유연성에는 책임이 따릅니다. 잘못된 유형으로 캐스팅해도 컴파일러는 이를 막아 주지 않지만, 프로그램은 엉뚱한 값을 출력하거나 충돌할 수 있습니다. 그렇기 때문에 제네릭 함수는 종종 void*를 유형 표시자(enum이나 flag 등)와 함께 사용하여, 함수가 데이터를 올바르게 해석하는 방법을 알 수 있도록 합니다.
다음 레슨에서는 void*를 사용하여 모든 유형의 데이터를 저장할 수 있는 컨테이너를 만들고, 진정으로 재사용 가능한 데이터 구조를 구현하게 됩니다.
챌린지
쉬움print_value라는 함수를 작성하세요. 이 함수는 두 개의 매개변수를 받습니다. 하나는 data를 가리키는 void* pointer이고, 다른 하나는 int type flag입니다. 함수는 type flag에 따라 data를 해석하고 출력해야 합니다.
- type flag가
0이면 pointer를int*로 변환하고 정수 값을 출력합니다. - type flag가
1이면 pointer를float*로 변환하고 소수점 이하 2자리까지 float 값을 출력합니다.
프로그램은 두 개의 입력을 받습니다.
- type flag (정수인 경우
0, float인 경우1) - 숫자 값
type flag에 따라 적절한 변수 type에 값을 저장한 다음, 해당 변수에 대한 pointer와 type flag를 사용하여 print_value를 호출하세요.
입력이 0과 42일 때의 출력 예시:
42입력이 1과 3.14일 때의 출력 예시:
3.14입력이 0과 -17일 때의 출력 예시:
-17입력이 1과 99.5일 때의 출력 예시:
99.50직접 해보기
#include <stdio.h>
// TODO: 여기에 print_value 함수를 작성하세요
int main() {
int type_flag;
scanf("%d", &type_flag);
if (type_flag == 0) {
int int_value;
scanf("%d", &int_value);
// TODO: int_value에 대한 포인터와 타입 플래그로 print_value를 호출하세요
} else if (type_flag == 1) {
float float_value;
scanf("%f", &float_value);
// TODO: float_value에 대한 포인터와 타입 플래그로 print_value를 호출하세요
}
return 0;
}이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 C 컴파일러