#include <stdio.h>
enum TYPE{
TYPE_CHAR,
TYPE_INT,
TYPE_FLOAT
};
void swapValue(void *ptr1, void *ptr2, enum TYPE t){
switch(t){
case TYPE_CHAR:
{
char temp;
temp = *ptr1;
*ptr1 = *ptr2;
*ptr2 = temp;
break;
}
}
}
int main(){
char c1 = 'a';
char c2 = 'b';
swapValue(&c1, &c2, TYPE_CHAR);
printf("%c %c", c1, c2);
}
이런식의 코드를 짜면 오류가 납니다.
교재에서는
temp = *(char *)ptr1;
*(char *)ptr1 = *(char *)ptr2;
*(char *)ptr2 = temp;
이렇게 char *값으로 변경후 역참조하는데
char* 의 의미와 char*가 있고없고의 차이가 궁금합니다.
제 생각으로는 이미 c1과 c2가 char형으로 정의되고 선언이 되었기때문에 따로 char로 바꿔줄 필요가 없다고 생각했는데,
char*을 빼면 오류가 나네요..
설명해주신다면 감사하겠습니다.
void*는 범용 포인터이고, 역참조는 할 수 없습니다.
역참조하려면 해당 타입으로 변환한 후에 해야 합니다.
c1, c2의 타입은 char이지만,
&c1, &c2는 address of char 타입이고, address of는 전달될 때 포인터로 전달됩니다.
따라서 함수에 전달된 타입은 char가 아니라 pointer to char입니다.
void *는 범용 포인터이므로 이렇게 전달된 것을 받을 수 있으므로 함수 내부에서는 ptr1, ptr2가 void *이므로 void * 타입입니다. 원하는 타입으로 변환해서 역참조를 해야 합니다. 따라서 (char*)을 반드시 써야 합니다.