为什么这两个C++语句在内存中给出两个不同的位置

问题描述 投票:0回答:1

使用以下代码,打印出两个不同的地址。谁能解释为什么?我不是最精通指针,但我认为他们会给出相同的地址。

float (*arrayName)[2][4][4]

auto address1 = (**arrayName)[1]; // 0x10
auto address2 = (*arrayName)[1][0]; // 0x40
std::cout << "Address1: " << address1 << std::endl;
std::cout << "Address2: " << address1 << std::endl;

0x40 是我要找的地址。只是不明白为什么我得到两个不同的答案。

我本以为两者都会给我 0x40 的答案,但其中一个没有。在在线 C++ 编译器上尝试了这段代码,两者都给了我 0x10 的地址。然而,在我的开发 RHEL7 虚拟机上,我得到 0x10 和预期的 0x40 地址。

c++ arrays pointers logic
1个回答
0
投票

表达式

*x
(x)[0]
是可以互换的,所以让我们将所有内容转换为一种形式:

(**arrayName)[1] = (*(arrayName[0]))[1] = arrayName[0][0][1]
(*arrayName)[1][0] = (arrayName[0][1][0]

这两种表达方式明显不同。

© www.soinside.com 2019 - 2024. All rights reserved.