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: