所以我有以下(非常简单的)代码:
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 ++中我很少做我认为我在做的事情):
这一切都是正确的吗?
答案 0 :(得分:10)
你的第二个陈述是错误的。您从堆中分配新的int。编译时常量“32”没有地址,因此您无法接受它。您创建一个值为32的int。这不是一回事。
int* pInt1 = new int(32);
int* pInt2 = new int(32);
pInt1和pInt2不相等。
哦,最后一件事--C ++是一种非常强类型的语言,并且使用类型数据前缀变量名称是非常必要的。这被称为匈牙利表示法,它在Microsoft C库和样本中很常见,但在这里通常是不必要的。
答案 1 :(得分:2)
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
答案 2 :(得分:0)
语句B打印pInt指向的对象的值。它指向一个值为32的int,因此它打印32。
语句A和C未定义。在两种情况下打印的对象都是指针,在机器级别是指针的存储器地址。大多数编译器都会打印一个十六进制数字,但不能保证它会这样做。该值还取决于对象的存储位置。例如,我计算机上的32位Windows Vista中的g ++打印:
0x900ee8
32
0x22ff1c
Borland印刷品:
016E33B0
32
0012FF50
Visual C ++打印
00131D10
32
0028FE24
您可能会得到不同的结果。第一个数字是新的int()从堆中分配的地址并保存在pInt中。它分配了一个4字节的数组,在那里存储数字32并将地址存储在pInt中。第二个数字是存储的值,解释为int。第三个数字是pInt的地址(在堆栈上)。