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

C/C++ Q/A
[3170] Re:Re:Re:Re:Re: 이해가 잘...
Starlet [starlet5] 1237 읽음    2004-01-13 20:03
안녕하세요. 오늘에야 올려주신 소스를 한번 돌려보네요.
먼저 wndparam = *((tag_param *)(cs.y)) 의 의미를 살펴봅시다.
cs.y 값이 0이라면 (tag_param *) 0  이 되어서 0x00000000의 주소를 가리키게 됩니다. 제일 앞에 * 가 또 있으므로 메모리 0x00000000에 있는 값을 가져와 wndparam.x에 저장합니다. x에 저장되는 이유는 wndparam의 첫번째 멤버인 x와 구조체를 가리키는 wndparam가 주소가 같기 때문입니다. wndparam이라고 쓴것은 wndparam.x와 같은 의미를 가집니다. 최종적으로 위 코드에서 wndparam.x에 저장되는값은 메모리 0x00000000에 있는 값입니다. 그러나 만약 cs.y의 값이 접근할수 없는 메모리 주소를 가리키는 값이라면 오류가 나올것입니다.
두번째로 wndparam=(tag_param)cs.y;가 안되는 이유는 앞서 설명 드렸듯이 cs.y 라는 integer형을 tag_param이라는 구조체로 형변환 할수 없기 때문입니다. unsigned int나 float처럼 integer형에서 충분히 변환 가능한 형식이 아닌 구조체이기 때문에 형변환이 불가능합니다. 답변이 되셨나 모르겠네요.
혹시 또 부족한게 있으시면 질문해 주세요~ 그럼 이만..


김광수 님이 쓰신 글 :
: 아..내..답변고맙습니다.포인터에 대한 기본개념이군요.^^
: 제가 질문을 정확히 하지 못한거 같군요..
:
: 제가 첨에 올려드림 소스 컴파일해보시면 에러없이 잘 돌아갑니다.
:
: 그리고
: wndparam=*((tag_param *)(cs.y));
:
: 님께서 답변하신걸 토대로 보면
: 다시 질문드리자면,,
: wndparam=*((tag_param *)(cs.y));
: 여기서 cs.y에 저장된 곳을 주소형식으로 형변환하자나요(tag_param *)
: 포인터가 있으니까 포인터형으로 바꺼준거겟조..
:
: 근대 원본소스 보시면 wndparam은 단지
: tag_param wndparam으로 된 그냥 구조체변수일뿐이지 포인터변수가 아니자나요..
:
: 만약 tag_param *wndparam 으로 선언되어있었다면
: 님 말씀대로
: wndparam=((tag_param *)cs.y;  //이렇게 * 를 하나 뺏을 겁니다.
: 물론 이렇게 바꺼서 컴파일해봐도 애러없이 잘 컴파일 되더군요. 님 말씀이 맞았습니다.
:
: 하지만 문제는
: 단시 tag_param wndparam으로 변수선언이 되어있는대
:
: wndparam=(tag_param)cs.y;
: 왜 이렇게 할수가 없느냐는 겁니다.
: wndparam이 포인터변수였다면 당연히 위에 처럼
: wndparam=(tag_param *)cs.y; 이렇게 했고
: 당연히 이번엔 wndparam이 그냥 변수니까
: wndparam=(tag_param)cs.y;이렇게 하는게 맞지 않느냐는 겁니다
: 왜 *를 두개나 가따 붙여야 하는거냐 이말입니다
:
: 그러니까
: tag_param wndparam ; 이렇게 선언될때
: 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언어 문법 질문(고수님 필독( 김광수 1376 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: 이해가 잘... 김광수 1140 2004/01/10
3170                     Re:Re:Re:Re:Re: 이해가 잘... Starlet 1237 2004/01/13
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.