Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我们可以说cout只打印变量的第一个地址吗_C++_Memory Address - Fatal编程技术网

C++ 我们可以说cout只打印变量的第一个地址吗

C++ 我们可以说cout只打印变量的第一个地址吗,c++,memory-address,C++,Memory Address,下面是一段代码,它澄清了我的问题: int value = 5; int value2 = 7; cout << &value << "\n"; cout << &value2 << "\n"; 在我的机器中,整数是4个字节。因此,每个int保留4个内存地址。但是当cout打印时,它打印整数保留的第一个地址。这是我的观察。我是对还是错?如果我错了,请给我一点解释。我面临着很多困惑,尤其是当我的C++生命中出现数组时。 你是正确的。

下面是一段代码,它澄清了我的问题:

int value = 5;
int value2 = 7;
cout << &value << "\n";
cout << &value2 << "\n";

在我的机器中,整数是4个字节。因此,每个int保留4个内存地址。但是当cout打印时,它打印整数保留的第一个地址。这是我的观察。我是对还是错?如果我错了,请给我一点解释。我面临着很多困惑,尤其是当我的C++生命中出现数组时。

你是正确的。地址指向值占用的空间的起始位置。

< P>按ISOC++ 11,节<代码> 1.8 C++对象模型< /代码>(我的粗体):< /P> 6/除非对象是位字段或大小为零的基类子对象,否则该对象的地址就是它所占用的第一个字节的地址

所以你是对的,它会给你第一个字节的地址。如果您担心指向对象的指针与其地址之间可能存在断开连接,
5.3.1一元运算符
显示了这两个术语之间的连接


就可能与数组混淆而言,最好给出一个示例。假设你有:

int arr[3];
在四字节整数实现中,这可以存储为:

0x0000: | byte 0.0 | byte 0.1 | byte 0.2 | byte 0.3 |
0x0004: | byte 1.0 | byte 1.1 | byte 1.2 | byte 1.3 |
0x0008: | byte 2.0 | byte 2.1 | byte 2.2 | byte 2.3 |
0x000c:
这里,
&arr
&arr[0]
都将为您提供
0x0000
,因为这是存储整个数组和该数组的第一个元素的第一个字节


但是,
&arr[2]
实际上会给您
0x0008
,因为这里讨论的对象是数组的第三个元素。

没错。无论对象的大小,其地址的值都是其第一个字节的地址。如果你有一个int数组,你可以通过使用&array[1]、&array[2]等来获得后续元素的地址。它会给出比你机器上一个数组大4字节的值。

这个问题与c++11无关。我建议用C++标签来对它进行延迟,我们可以说它打印地址,地址被定义为第一个字节,在任何上下文中,不只是代码> cOUT/CORM>。我想3个字节大,第四个地址代表同一个数组的下一个元素:
0x0000: | byte 0.0 | byte 0.1 | byte 0.2 | byte 0.3 |
0x0004: | byte 1.0 | byte 1.1 | byte 1.2 | byte 1.3 |
0x0008: | byte 2.0 | byte 2.1 | byte 2.2 | byte 2.3 |
0x000c: