2013-09-23 5 views
-2

간단한 프로그램을 실행 중입니다.다른 유형의 변수에 대한 포인터 지정

다음은 코드입니다.

#include<stdio.h> 
#include<conio.h> 

int main(){ 
char c,*cc; 
int i; 
long l; 
float f; 

c='z'; 
i=15; 
l=77777; 
f=3.14; 
cc=&c; 

printf("c=%c cc=%u\n",*cc,cc); 
cc=&i; 
printf("i=%d cc=%u\n",*cc,cc); 
cc=&l; 
printf("l=%ld cc=%u\n",*cc,cc); 
cc=&f; 
printf("f=%f cc=%u\n",*cc,cc); 

return (getch()); 
} 

그래서 내 지식에 따라 정수의 크기는 내가 CC는 문자 포인터이기 때문에 정수 변수의 첫 번째 바이트를 가리켜 야를 포인터는 char 정수 변수를 할당하고 그래서 문자보다 더 남아있다. 그래서 출력을 실행할 때 첫 번째 printf 줄만 올바른 출력을 주어야하며 다른 줄은 일부 주소 나 일부 쓰레기 값을 인쇄해야합니다.

내 경우에는 두 번째 줄 printf 또한 15 정수 값에 할당 된 올바른 값을 제공합니다. 가비지를 줄 필요가 있다고 생각하지만 value.please가 어떻게되는지 알려주시겠습니까?

여기 내 결과물입니다.

c=z cc=2686791 
i=15 cc=2686780 
l=-47 cc=2686776 
f=0.000000 cc=4199093 

답변

5

내가 그것을 변수 정수의 첫 번째 바이트

그럼 왜이 두 번째 줄 15 인쇄 것은 놀라운 일이다 가리켜 야 포인터는 char 정수 변수를 할당하고 할 때? 숫자 15는 int의 최하위 바이트 인 1 바이트에 맞습니다. 그리고 컴퓨터가 리틀 엔디 언 (아마도 그리고 분명히) 인 경우 LSB는 가장 낮은 메모리 주소를 가진 바이트입니다.


그리고 포인터를 인쇄하는 %p를 사용 %u는 부호없는 정수입니다. printf()의 문서를 읽으십시오.

+0

그래서 (주소 &i의 바이트 부호있는 바이트로 해석 할 때 -24을 인 0xe8입니다) 그러면 오류가 발생합니까? 내가 맞습니까? –

+0

@google 오류가 발생하지 않습니다. 숫자를 모듈로 256으로 자릅니다. (또는 'char'이 8 비트를 초과하는 것으로 보이는 경우 다른 숫자가 표시됩니다.) –

+0

나중에 미안하지만 내 의견은 잘못되었습니다. 다른 번호를 인쇄 할 것입니다. –

2

15의 바이트 레이아웃은 [0x0f][0x00][0x00][0x00]이므로 cc을 참조 할 때 첫 번째 바이트의 내용 (15가됩니다)이 표시됩니다.

이 경우 i=1000을 시도, 차이를 확인하려면 당신이 -24을 볼 수 내가 정수의 큰 값을 할당 할 경우

+0

플로트의 경우 어떻게됩니까? –

+0

@google 수레는 일반적으로 [IEEE 754 표준 형식] (http://grouper.ieee.org/groups/754/)과 함께 저장됩니다. – SheetJS

관련 문제