Turbo-C
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
터보-C 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
Lua 게시판
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C/C++ Q/A
[3161] Re:C언어 문법 질문(고수님 필독(
Starlet [starlet5] 1292 읽음    2004-01-10 21:15
안녕하세요.
먼저 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));
: }

+ -

관련 글 리스트
3160 C언어 문법 질문(고수님 필독( 김광수 1377 2004/01/10
3161     Re:C언어 문법 질문(고수님 필독( Starlet 1292 2004/01/10
3162         Re:Re: 이해가 잘... 김광수 1177 2004/01/10
3163             Re:Re:Re: 이해가 잘... Starlet 1187 2004/01/10
3164                 Re:Re:Re:Re: 이해가 잘... 김광수 1141 2004/01/10
3170                     Re:Re:Re:Re:Re: 이해가 잘... Starlet 1238 2004/01/13
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.