출처 : http://kin.naver.com/browse/db_detail.php?d1id=1&dir_id=10104&docid=285334
void 형변환에 관하여 %p
#include
int multi[2][4];
int main()
{
printf("\nmulti = %p",(void *)multi); /* -----------
1
printf("\nmulti[0] = %p",(void *)&multi[0]); /* ----------
2
printf("\nmulti[0] = %p",(void *)multi[0]); /* ----------
3
printf("\n&multi[0][0] = %p\n",(void *)&multi[0][0]); /* ----------
4
return 0;
}
요기에 보면.. void로 형변환 해주자나여.. 이게 맞는 거는 알겠는데, 왜
void 형변환을 꼭 해줘야 하는지..
형변환 안하고, 그냥 %u 쓰구 컴파일하면,
warning: unsigned int format, pointer arg (arg 2) 이런 경고 메시지가
뜨더라구여..
void 포인터가 뭔지는 아는데요..
가령 1번 줄에서, multi 를 (void *)multi 로 형변환해주면, multi가 가지고
있는 bit(표현이 맞나?)에
어떤 변화가 생기는건지 궁금하구, 또 왜 그렇게 형변환을 해줘야 하는지요..
그것은 %p라는 것은 void* 형을 다룹니다.
[질문자 평]
사실, 제가 VC++로 컴파일로 하니.. 에러는 발견되지가 않더군요..
아마 컴파일러랑 라이브러리의 영향을 받는 warning 증상 같습니다...^^;
그런데, 조금 좋군요..ㅋㅋㅋ;
%p는 (void*)를 취급하며, 그것의 주소를 화면의 출력을 하는 구조입니다.
%u는 그것을 unsigned int 정수형으로 출력을 하라는 것이구요..
실제 구현상에는 돌아갈때는 아무런 변화가 있을수도 있고, 없을 수도 있습니다.
int 형은 32 bit인데 char형은 8 bit에다 넣을 려면은 어떻게 해야할까요?
이중에서 해당하는 하위 8 bit를 넣어야 겠죠.. 이런식의 변화는 있을수 있습니다.
또 실수형을 정수형으로 넣을경우는? 거기의 맞는 특별한 연산을 해줘야 겠죠?
물론, (void*)는 영향이 없고, 단순히 시작주소만을 가집니다.. 즉, 모형를 모른다는 것입니다.
모형의 요소 - 할당바이트, 데이터 저장 형식(실수, 정수, 문자..)
다시 정리하면은 %p는 (void*)로 받도록 약속을 하였습니다. 그래서 형변환을 해줘야 warning을 뜨지않고, 프로그래머가 의도적으로
한것이구나를 컴파일러가 알아서 거기의 맞는 동작을 하겠죠? 그래서 형변환을 하였습니다.^^;
그래서 어떠한 포인터를 삭제할때
struct del{
void operator()(void * ptr){
delete ptr;
}
};
이 가능하다
'프로그래밍(Programming) > c++, 11, 14 , 17, 20' 카테고리의 다른 글
객체 지향과 영어표기&주석 (0) | 2012.10.31 |
---|---|
C++ virtual base 클래스 (0) | 2012.10.31 |
상속, 포함관계 의 생성자 소멸자 호출 관계. (0) | 2012.10.31 |
랜덤함수와 씨드값 (0) | 2012.10.31 |
char 을 BSTR 로 변환 (0) | 2012.10.31 |