2012-04-01 2 views
4

이 C 코드를 C++ 코드로 변환하고 싶습니다. 나는 printf와 출력이 그처럼 실행하면 그것은 포인터의 printf형식 cout for pointer

int n = 44; 
//printf("n = %d \t &n = %x\n", n, &n); 
cout<<"n ="<<n<< "\t" <<"&n ="<<hex<<int(&n)<<endl; 

에 관한 것입니다 :

n=44 &n=22ff1c 

을 나는 COUT 출력이 그런 식이다 실행할 때 :

n=44 &n=22ff0c 

왜을 두 버전은 n의 주소에 대해 다른 값을 출력합니까?

+1

16 진수는 변수의 메모리 주소입니다. 프로그램을 실행할 때마다 다른 값을 가질 수 있습니다. – Topo

+0

printf를 실행할 때마다 동일한 답변 (& n = 22ff1c)을 제공합니다. 동일한 방법으로 cout 프로그램은 동일한 결과를 얻습니다. (& n = 22ff0c) – cadyT

+0

편집 : 2C는 44 진수입니다. –

답변

11

컴파일러는 스택에 할당 된 변수를 다른 버전의 프로그램에서 다른 위치에 배치합니다.

똑같은 포인터로 작동하도록 printf와 cout 버전을 동일한 프로그램에 포함시켜보십시오. 그러면 두 버전이 같은 방식으로 작동하는 것을 볼 수 있습니다. 씨 리스터가 올바르게 지적한대로의 printf에 포인터를 인쇄 할 때

int n = 44; 
printf("n = %d \t &n = %x\n", n, &n); 
cout<<"n ="<<n<< "\t" <<"&n ="<<hex<<int(&n)<<endl; 

, 당신은 % p 나 형식 문자열을 사용합니다.

+3

'% x'을 (를) 사용하여 포인터를 printf하지 말아야한다는 의견이 없습니까? 너희들 실망시켜. –

+0

@ Mr Lister Fair point는 질문의 요점에 집중하고있었습니다. –

0

공백 차이가 없다고 가정합니다. 스택에 n이 할당 된 주소는 프로그램 실행마다 다릅니다. 그렇지 않으면, 그것은 나에게 모두 좋아 보인다!

1

n이 메모리에있는 것을 제어하지 않습니다. 컴파일러는 관련없는 것으로 보이는 다른 사안에 따라 사물이 배치되는 방식을 변경할 수 있습니다. 그것은 중요하지 않습니다. 당신은 n가 어디에 가야하는지 말할 권리가 없습니다; 이미 다른 것을 넣고 싶을 수도 있습니다.