什么是印刷品? C ++指向整数的指针

时间:2011-05-12 19:08:39

标签: c++ pointers

所以我有以下(非常简单的)代码:

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. 创建指向整数的指针并将其调用为pInt
  2. statementA打印值'32'
  3. 的地址
  4. statementB打印我的指针指向的整数值(这是因为我取消引用指针,因此可以访问它所指向的内容)。
  5. statementC打印指针本身的地址(不是整数值'32'的地址)。
  6. 这一切都是正确的吗?

3 个答案:

答案 0 :(得分:10)

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

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

pInt1和pInt2不相等。

哦,最后一件事--C ++是一种非常强类型的语言,并且使用类型数据前缀变量名称是非常必要的。这被称为匈牙利表示法,它在Microsoft C库和样本中很常见,但在这里通常是不必要的。

答案 1 :(得分:2)

  • 打印pInt的内存地址,指向包含值32的内存区域(4个字节):

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的地址(在堆栈上)。