2014-04-17 2 views
2

나는 일식이 코드를 넣어

main() 
{ 
    int *p, *q, *r; 
    int a = 10, b = 25; 
    int c[4] = {6,12,18,24}; 

    p = c; 

    printf("p = %d\n" ,p); 
} 

내가 얻을 출력을 실행 할당되지 않은 C에서 변수를 인쇄하는 것입니다 P = 대표하는 가정이 숫자가 무엇인지 2,358,752

? 그것은 변수의 주소입니까?

위의 내용이 사실이라면 다음 질문에 대한 내 대답이 맞습니까?

그래서 너무 라인

p = c; 

는 5014 것 것 다음 위치

address  variables 

5000   p 

5004   q 

5008   r 

500C   a 

5010   b 

5014  c[0] 

5018  c[1] 

501C  c[2] 

5020  c[3] 

에 저장되어 다음과 같은 말을 할 수 있습니다?

+0

질문에 대한 답변 : 예, 예. –

+1

'% d'을 (를) 사용하여 포인터를 인쇄하는 것은 정의되지 않은 동작입니다. 포인터 값을 포함하는 메모리가 int를 포함하고있는 것처럼 해석됩니다. 시스템이 플랫 메모리 모델과 비 트래핑 int 및 기타 일반적인 가정을 사용하고 sizeof (int *) == sizeof (int)를 사용하면 주소가 제대로 표시됩니다. 하지만 당신은'* p'를 사용하고 신뢰할 수있는'void * '로 캐스트합니다. –

+1

@MattMcNabb : '% p'을 (를) 사용하고'void * ''(으)로 캐스팅하셨습니까? 나는 그 분석에 동의 할 것이다. 그리고 대부분의 64 비트 시스템에서는 sizeof (int)! = sizeof (int *)이므로 주소를 출력하기 위해'% d '를 사용하는 것은 본질적으로 이식성에 대한 책임입니다. –

답변

1

예, p은 의 주소와 동일한 c의 주소입니다. 그리고 네, 두 번째 예에서 p는 5014

+0

나는 왜 p = c가 c [0]의 주소를 제공하는지 또 다른 질문이 있습니까? 그것이 배열의 첫 번째 요소이기 때문입니까? – user3393513

+0

예, 절대적으로! C에서는 배열의 메모리 위치와 첫 번째 요소의 메모리 위치간에 차이가 없습니다. – slaadvak

+0

설명해 주셔서 감사합니다. – user3393513

2
int *p, 

위의 문은 정수에 대한 포인터로 p을 정의로 동일하다. 아래 문에서 c은 암시 적으로 배열 a의 첫 번째 요소에 대한 포인터로 변환됩니다.

p = c; 
// equivalent to 
p = &c[0]; 

따라서 p에는 배열의 첫 번째 요소의 주소가 포함됩니다. 또한 주소를 인쇄하는 변환 지정자는 %p입니다.

printf("p = %p\n", (void *)p); 
// prints the same address 
printf("c = %p\n", (void *)c);