63.2 void 포인터 질문있습니다
, 장 무경님이 작성코드 일부분을 발췌한것인데요
case TYPE_CHAR: // 문자면 char *로 변환한 뒤 역참조하여 값을 서로 바꿈 { char temp; temp = *(char *)ptr1; *(char *)ptr1 = *(char *)ptr2; *(char *)ptr2 = temp; break;
temp = *(char *)ptr1; 이 부분이 동작원리가 어떻게 되는건가요?
어디서 본것 같은데 제가 놓친것 같습니다 혹시 강의에 나온적 있다면 나온 강의도 가르쳐 주실수 있나요?
Re: 63.2 void 포인터 질문있습니다
, 도장_ 관리자님이 작성형변환이기 때문에 UNIT 16, 34 등에서부터 설명되어 있습니다.
(형식)
이라는 문법으로 원하는 형식으로 변환할 수 있습니다.
변환에 대한 책임은 프로그래머가 집니다.
그림 16-1을 보면 알지만, 표현 범위가 넓은 쪽으로 변환할 때는 리스크가 없으므로 자동 변환, 즉 암묵적인 변환이 됩니다. 그러나 반대로 long을 int로 변환한다면 표현 범위가 좁아지므로 데이터를 일부 소실할 가능성이 생깁니다. 이 경우에는 명시적인 변환을 하게 됩니다.
(형식) 문법에서 형식은 무엇이든 쓸 수 있지만, 안전한 형식만을 프로그래머가 판단해서 사용하면 됩니다.
void swapValue(void *ptr1, void *ptr2, enum TYPE t) // 반환값 없음, void 포인터 매개변수 두 개와
{ // 변수의 자료형을 알려줄 열거형을 받음
switch (t)
{
case TYPE_CHAR: // 문자면 char *로 변환한 뒤 역참조하여 값을 서로 바꿈
{
char temp;
temp = *(char *)ptr1;
*(char *)ptr1 = *(char *)ptr2;
*(char *)ptr2 = temp;
break;
}
인자 ptr1은 void * 형식입니다. CHAR 타입으로 변환해서 처리하고 싶다면
(char*)ptr1 문법을 사용해서 void * -> char * 형식으로 변환합니다.
*(char*)ptr1은 char *을 *로 역참조해서 char 값을 가져옵니다.
char temp이니 temp는 char이고,
char = char가 되게 하려면 *(char*)ptr1이 되겠지요. 규칙에 따라 코드를 작성하는 것이지 어떤 특별한 문법이 있는 것은 아닙니다.