正在打印什么?C++指向整数的指针

What is being printed? C++ pointer to an integer

本文关键字:整数 指针 C++ 打印 什么      更新时间:2023-10-16

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

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. 语句 A 打印值 '32' 的地址
  3. 语句 B 打印我的指针指向的整数值(这样做是因为我取消引用指针,从而允许我访问它所指向的内容)。
  4. 语句C 打印指针本身的地址(而不是整数值 '32' 的地址)。

这一切都正确吗?

你的第二种说法是错误的。从堆中分配一个新的 int。编译时常量"32"没有地址,因此不能使用它。创建一个值为 32 的 int。这不是一回事。

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

pInt1 和 pInt2 不相等。

哦,最后一件事 - C++是一种非常强类型的语言,并且没有必要在变量名称前面加上类型数据。这称为匈牙利符号,在Microsoft C 库和示例中很常见,但在这里通常是不必要的。

  • 打印 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

语句 B 打印 pInt 指向的对象的值。它指向值为 32 的 int,因此打印 32。

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

0x900ee8
32
0x22ff1c

博兰德印花:

016E33B0
32
0012FF50

视觉C++打印

00131D10
32
0028FE24

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