2011-05-12 80 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. 创建一个指向整数,把它品脱
  2. statementA打印值“32”的
  3. statementB打印整数值的地址正在被我的指针指向(这是因为我对指针进行了引用,因此使我可以访问它指向的内容)。
  4. statementC打印指针本身的地址(不是整数值'32'的地址)。

这一切是否正确?

回答

10

你的第二个陈述是错误的。你从堆中分配一个新的int。编译时常量“32”没有地址,因此你不能接受它。你创建一个值为32的int。这不是一回事。

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

pInt1和pInt2是不相等的。

噢,最后一件事情--C++是一种相当强类型的语言,而且很有必要在变量名称前加上类型数据。这被称为匈牙利符号,它在Microsoft C库和样本中很常见,但在此通常不必要。

+0

如果变量被定义为int *值= 32;你会是对的。然而,在构造函数中包含常量使其成为一个对象。如果你这样做,那么该变量将被优化为一个const int *。 – monksy 2011-05-12 19:13:53

+0

你是什么意思“使它成为一个对象”? – 2011-05-12 19:18:57

+6

这是一个非常微妙的区别,但为了全面理解,有必要指出。我认为正确的措辞是“2. statementA打印包含值”32“的”int“的地址。 – 2011-05-12 19:24:22

0

语句B打印pInt指向的对象的值。它指向一个int值为32,所以它打印32.

语句A和C是未定义的。在这两种情况下打印的对象都是一个指针,它在机器级别是一个内存地址。大多数编译器将打印一个十六进制数字,尽管不能保证它会这样做。该值还将取决于对象的存储位置。例如,G ++在32位Windows Vista上的我的电脑打印:

0x900ee8 
32 
0x22ff1c 

Borland的打印:

016E33B0 
32 
0012FF50 

的Visual C++打印

00131D10 
32 
0028FE24 

你可能会得到不同的结果。第一个数字是堆中由new int()分配的地址并保存在pInt中。它分配了一个4字节的数组,将数字32存储在那里,并将地址存储在pInt中。第二个数字是存储的值,解释为int。第三个数字是pInt的地址(在堆栈上)。

2
  • 打印品脱的存储器地址,它指向的存储器(4个字节)的区域包含值32:

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

  • 打印该存储器地址的内容:

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

  • 打印指针本身的存储器地址:

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