a
이 경우 실제로는(x86의 경우) 아무 일도 일어나지 않습니다. CPU레벨에서 보면 보통 주소는 정수형 숫자거든요. 다만 C언어의 관점에서 보면 int 형과 int * 형은 다른 형입니다.
위에서 코드를
exam(addr)
형변환은 언어수준에서 일어나는 일인데, 경우에 따라서는 실제 instruction을 필요로 하는 경우가 있습니다.
정수형의 표현방법과 주소의 표현방법이 다른경우라던가, float -> int, 혹은 int -> float 편환따위가 그것입니다.
컴파일한 코드를 disassemble하거나, gcc -S 등의 옵션을 주셔서 어떤 코드가 생성되는지 확인해보시면 좀 더 이해가 쉬울 것 같습니다.
언제나 삽질 - http://tisphie.net/typo/ 프로그래밍 언어 개발 - http://langdev.net
0x11이 아니라 0xB가 되지 않나요
printf(" %x ", para) 하면 11이 찍히나요? b가 찍히는게 아니고욤?? 어떻게 11이 나오죠?? ~~ --; ㅋㅋ
거진 맞는말인듯~ 타입캐스팅해서 상수로 값을 넘길것이냐 & 주소를 보낼것이냐
문제가 되겟죠.. ㅋㅋ
파라미터와 캐스팅을 보실때에는
1. 전달하는 data의 크기 (실제로넘어가는 정보의 크기) 2. 전달되는 물리적인 값. (bit 열) 3. 함수 내부에서 사용하는 형 type (어떻게 해석 되는가?)
정도만 고려하시면 됩니다.
exam((int*)...) 라고 해 봐야 호출하는 쪽의 (int*)는 없어도 됩니다. (기계적으로는요) 의미를 확실하게 하여 빌드시 에러나 경고를 막기위한 조치이고 코드를 정확하게 읽기위한 조치일 뿐이고.
실제 의미는 사용하는 exam 내부를 봐야만 알수 있죠.
질문하고 답 얻으면 질문을 지운다? 그런 예의 없는 짓을 하면 아니됩니다.
세벌 https://sebuls.blogspot.kr/
텍스트 포맷에 대한 자세한 정보
<code>
<blockcode>
<apache>
<applescript>
<autoconf>
<awk>
<bash>
<c>
<cpp>
<css>
<diff>
<drupal5>
<drupal6>
<gdb>
<html>
<html5>
<java>
<javascript>
<ldif>
<lua>
<make>
<mysql>
<perl>
<perl6>
<php>
<pgsql>
<proftpd>
<python>
<reg>
<spec>
<ruby>
<foo>
[foo]
이 경우
이 경우 실제로는(x86의 경우) 아무 일도 일어나지 않습니다. CPU레벨에서 보면 보통 주소는 정수형 숫자거든요.
다만 C언어의 관점에서 보면 int 형과 int * 형은 다른 형입니다.
위에서 코드를
라고 쓰면 gcc에서는 warning이 생기지만 컴파일은 됩니다.
형변환은 언어수준에서 일어나는 일인데,
경우에 따라서는 실제 instruction을 필요로 하는 경우가 있습니다.
정수형의 표현방법과 주소의 표현방법이 다른경우라던가,
float -> int, 혹은 int -> float 편환따위가 그것입니다.
컴파일한 코드를 disassemble하거나, gcc -S 등의 옵션을 주셔서 어떤 코드가 생성되는지 확인해보시면
좀 더 이해가 쉬울 것 같습니다.
언제나 삽질 - http://tisphie.net/typo/
프로그래밍 언어 개발 - http://langdev.net
언제나 삽질 - http://tisphie.net/typo/
프로그래밍 언어 개발 - http://langdev.net
해답을 찾은것 같긴 한데...
a
addr값이..
0x11이 아니라 0xB가 되지 않나요
printf(" %x ", para) 하면
printf(" %x ", para) 하면 11이 찍히나요?
b가 찍히는게 아니고욤??
어떻게 11이 나오죠?? ~~ --; ㅋㅋ
거진 맞는말인듯~
타입캐스팅해서 상수로 값을 넘길것이냐
& 주소를 보낼것이냐
문제가 되겟죠..
ㅋㅋ
파라미터와 캐스팅을
파라미터와 캐스팅을 보실때에는
1. 전달하는 data의 크기 (실제로넘어가는 정보의 크기)
2. 전달되는 물리적인 값. (bit 열)
3. 함수 내부에서 사용하는 형 type (어떻게 해석 되는가?)
정도만 고려하시면 됩니다.
exam((int*)...) 라고 해 봐야 호출하는 쪽의 (int*)는 없어도 됩니다. (기계적으로는요)
의미를 확실하게 하여 빌드시 에러나 경고를 막기위한 조치이고 코드를 정확하게 읽기위한 조치일 뿐이고.
실제 의미는 사용하는 exam 내부를 봐야만 알수 있죠.
질문하고 답 얻으면 질문을 지운다?
질문하고 답 얻으면 질문을 지운다?
그런 예의 없는 짓을 하면 아니됩니다.
세벌 https://sebuls.blogspot.kr/
댓글 달기