2011-05-12 5 views
8

그래서 나는 다음 (매우 간단) 코드가 : 그래서 여기인쇄 대상이 무엇입니까? 정수로 C++ 포인터

int* pInt = new int(32); 

std::cout<< pInt << std::endl; //statement A 
std::cout<< *pInt << std::endl; //statement B 
std::cout << &pInt << std::endl; //statement C 

을 나는 C++에서 내가 거의 이제까지 내가 생각하는 일을하지 오전 내가 배운 (내가 뭐하는 거지 생각 무엇입니까 내가)하고 있어요 : 정수에 대한 포인터를 생성 및 호출

  1. statementA는
  2. statementB는 정수 값을 인쇄 '32'값의 주소를 인쇄 파인트 그 내 포인터에 의해 가리키고있다. (나는 포인터를 역 참조하기 때문에 포인터가 가리키는 포인터에 접근 할 수있다.)
  3. statementC는 포인터 자체의 주소 (정수 값 '32'의 주소가 아님)를 인쇄합니다.

이 모든 것이 맞습니까?

답변

10

두 번째 설명이 잘못되었습니다. 힙에서 새로운 int를 할당합니다. 컴파일 타임 상수 "32"에는 주소가 없으므로 가져올 수 없습니다. 값이 32 인 int를 만듭니다. 이것은 같은 것이 아닙니다.

int* pInt1 = new int(32); 
int* pInt2 = new int(32); 

pInt1과 pInt2는 동일하지 않다.

오, 최후의 한가지 - C++는 매우 강하게 입력 된 언어이며 변수 이름 앞에 형식 데이터를 접두어로 붙이는 것은 거의 필요하지 않습니다. 이것은 헝가리 표기법 (Hungarian Notation)이라고하며, Microsoft C 라이브러리 및 샘플에서는 매우 일반적이지만 일반적으로 여기에서는 불필요합니다.

+0

변수가 정의 된 경우 INT * 값 = 32; 너는 옳을거야. 그러나 생성자에 상수를 포함하면 객체가됩니다. 그렇게했다면 변수는 const int *로 최적화 될 것입니다. – monksy

+0

"그것을 대상으로"한다는 것은 무엇을 의미합니까? –

+6

이것은 매우 미묘한 차이입니다. 그러나이를 완전히 이해하려면 그것을 지적해야합니다. 정확한 문언은 "2. statementA는 값 '32'"을 포함하는'int'의 주소를 출력합니다. –

0

문 B는 pInt가 가리키는 객체의 값을 인쇄합니다. 값이 32 인 int를 가리켜 32를 인쇄합니다.

문 A 및 C는 정의되지 않습니다. 두 경우 모두 인쇄되는 객체는 기계 수준에서 메모리 주소 인 포인터입니다. 대부분의 컴파일러는 16 진수를 출력하지만, 그렇게 할 것이라는 보장은 없습니다. 값은 오브젝트 저장 위치에 따라 달라집니다. 예를 들어, g ++ 내 컴퓨터 인쇄에 32 비트 Windows Vista에서 :

0x900ee8 
32 
0x22ff1c 

볼랜드 인쇄 :

016E33B0 
32 
0012FF50 

비주얼 C++ 인쇄

00131D10 
32 
0028FE24 

당신은 아마 다른 결과를 얻을 것이다. 첫 번째 숫자는 힙에서 새로운 int()에 의해 할당 된 주소이며 pInt에 저장됩니다. 4 바이트 배열을 할당하고 거기에 32를 저장하고 주소를 pInt에 저장합니다. 두 번째 숫자는 저장된 값으로 int로 해석됩니다. 세 번째 숫자는 pInt의 (스택상의) 주소입니다.

std::cout<< pInt << std::endl; //statement A

  • 인쇄하는 메모리 어드레스의 함유량 : 32 값을 포함

2
  • 인쇄 메모리 (4 바이트)의 영역을 가리키는 파인트의 메모리 어드레스, :

std::cout<< *pInt << std::endl; //statement B, which should print 32

,451,515,
  • 인쇄 포인터 자체의 메모리 어드레스 :

std::cout << &pInt << std::endl; //statement C