안녕하세요.
먼저 struct tag_ccc에서 x는 int* 인데 y는 그냥 int군요. 그리고 왜 cs.y의 주소를 wndparam에 넣는지 이해가 가지 않는군요. 일단 소스의 의미는 알수 없지만 오타가 없다고 보고 설명드리겠습니다.
wndparam=*((tag_param *)(cs.y));
여기에서는 cs.y에 해당하는 integer값을 (tag_param *)으로 형변환을 합니다. (tag_param *)에서 중요한건 * 즉, 포인터입니다. cs.y에 5가 들어있다면 (tag_param *)(cs.y)의 의미는 메모리 주소 0x00000005부터 기록된 tag_param 형식으로 저장되어 있는 데이터를 가리킵니다. 따라서 wndparam=*((tag_param *)(cs.y)) 는 메모리에서 cs.y위치에 있는 데이터를 tag_param 구조체인 wndparam에 매치시키는것입니다. 단, 여기서 wndparam 역시 포인터 형이 되어야 정상적으로 동작합니다.
wndparam=(tag_param)cs.y;
위 코드는 cs.y를 tag_param 구조체로 형변환을 하려고 합니다. integer형의 단지 하나의 정수를 구조체로 형변환을 할 수 없습니다. 만약 tag_ccc에서 y가 *y라면 cs.y는 어딘가의 주소를 가리키게 되고 위의 코드는 다음과 같이 수정되어야 합니다.
wndparam=(tag_param *) cs.y;
여기서도 마찬가지로 wndparam은 tag_param wndparam;로 정의될것이 아니라 tag_param *wndparam 이렇게 포인터형으로 정의되어야 합니다.
참고로, *가 붙은 포인터형은 Windows에서 항상 메모리를 4Bytes 잡아먹습니다. 메로리를 가리키는 주소가 4 Bytes기 때문이죠. char *a 가 char형이라고 1 Byte만 차지하는것이 아니라 4Bytes를 차지합니다. 구조체도 마찬가지로 아래의 wndparam도 현재 소스 같으면 19Bytes를 차지하지만 포인터로 쓰면 4 Bytes를 차지합니다. 이 4Bytes의 포인터는 어딘가의 19 Bytes의 tag_param형식으로 기록되어 있는곳의 메모리의 주소를 가지고 있겠죠.
길게 설명했지만 제가 알기쉽게 설명하는데 부족하여 이해가 잘되지 않으실지도 모르겠습니다. 이해가 안되시는 부분을 다시 질문해 주시면 다시 답변을 해드리겠습니다.
김광수 님이 쓰신 글 :
: 아래 소스 중에서요
: 맨 밑에
: wndparam=*((tag_param *)(cs.y));
:
: 이 부분을
: wndparam=(tag_param)cs.y;
:
: 왜 이렇게 바꾸면 에러가 나조?
: 문법적으로 자세히좀 설명 부탁드립니다.....초보라서요..
: 둘다 포인터는 아닌거 같은대.. 왜 포인터형으로 형변환을 해주는지..
: 왜 저렇게 하면 안되는지...자세히좀 설명해주세요
:
: #include<stdio.h>
: struct tag_param{
: int x;
: int y;
: char mex[11];
: };
: struct tag_ccc{
: int *x;
: int y;
: char mex[11];
: };
: void main()
: {
: tag_ccc cs;
: tag_param wndparam;
: wndparam=*((tag_param *)(cs.y));
: }
|