C++ 设置为下一个数组元素的循环中的变量始终具有相同的内存地址? 让我们考虑一下这样的小程序: #include <iostream> using namespace std; typedef struct { int i, j, k; } ThreeDPoint; int main() { ThreeDPoint p[10]; for (int i = 0; i < 10; i++) { p[i].i = i * 3; p[i].j = i * 3 + 1; p[i].k = i * 3 + 2; } for (int i = 0; i < 10; i++) { cout << "i = " << i << endl; ThreeDPoint lp = p[i]; cout << "&p[" << i << "] = " << (long) &lp << endl; cout << "&p[" << i << "].i = " << (long) &lp.i << endl; cout << "p[" << i << "].i = " << (long) lp.i << endl; cout << "&p[" << i << "].j = " << (long) &lp.j << endl; cout << "p[" << i << "].j = " << (long) lp.j << endl; cout << "&p[" << i << "].k = " << (long) &lp.k << endl; cout << "p[" << i << "].k = " << (long) lp.k << endl; } }

C++ 设置为下一个数组元素的循环中的变量始终具有相同的内存地址? 让我们考虑一下这样的小程序: #include <iostream> using namespace std; typedef struct { int i, j, k; } ThreeDPoint; int main() { ThreeDPoint p[10]; for (int i = 0; i < 10; i++) { p[i].i = i * 3; p[i].j = i * 3 + 1; p[i].k = i * 3 + 2; } for (int i = 0; i < 10; i++) { cout << "i = " << i << endl; ThreeDPoint lp = p[i]; cout << "&p[" << i << "] = " << (long) &lp << endl; cout << "&p[" << i << "].i = " << (long) &lp.i << endl; cout << "p[" << i << "].i = " << (long) lp.i << endl; cout << "&p[" << i << "].j = " << (long) &lp.j << endl; cout << "p[" << i << "].j = " << (long) lp.j << endl; cout << "&p[" << i << "].k = " << (long) &lp.k << endl; cout << "p[" << i << "].k = " << (long) lp.k << endl; } },c++,pointers,C++,Pointers,名为lp的变量更新为数组中的结构值,并在循环中使用i变量进行更新。我期望,例如,如果第一个元素p[0]从内存位置100开始,那么第二个元素p[1]将从112开始,假设sizeofint==4为真 但事实并非如此:打印的值告知变量实际上一直在更新以包含下一个结构值,但出于某种原因,它似乎对i=0&p[i]具有相同的内存地址。i==100,对于i=1&p[i]。i==100。有趣的是,如果删除中间变量lp并直接访问p[i],那么我可以看到i=0&p[i].i==100,i=1&p[i].i==112

名为lp的变量更新为数组中的结构值,并在循环中使用i变量进行更新。我期望,例如,如果第一个元素p[0]从内存位置100开始,那么第二个元素p[1]将从112开始,假设sizeofint==4为真

但事实并非如此:打印的值告知变量实际上一直在更新以包含下一个结构值,但出于某种原因,它似乎对i=0&p[i]具有相同的内存地址。i==100,对于i=1&p[i]。i==100。有趣的是,如果删除中间变量lp并直接访问p[i],那么我可以看到i=0&p[i].i==100,i=1&p[i].i==112的预期内存地址。以下是日志:

i=0

&p[0]=140736159721040

&p[0].i=140736159721040

p[0].i=0

&p[0].j=140736159721044

p[0].j=1

&p[0].k=140736159721048

p[0].k=2

i=1

&p[1]=140736159721040

&p[1].i=140736159721040

p[1].i=3

&p[1].j=140736159721044

p[1].j=4

&p[1].k=140736159721048

p[1].k=5

i=2

&p[2]=140736159721040

&p[2].i=140736159721040

p[2].i=6

&p[2].j=140736159721044

p[2].j=7

&p[2].k=140736159721048

p[2].k=8


为什么呢?为什么更新了值,但内存位置相同?这是在变量使用分析之后执行的某种g++优化吗?

您打印的是变量的地址,而不是数组元素的地址。变量和数组显然不具有相同的地址,这是非常合理的,但不能保证每次循环中都会为变量重用相同的地址

要打印数组元素的地址,请尝试以下操作

cout << "&p[" << i << "] = " << &p[i] << endl;
以某种方式使lp指向数组元素。但是它没有,它复制数组元素并在变量中存储一个副本。

ThreeDPoint lp=p[i];-lp变量是它自己的实体。执行该语句后,它与p数组没有关联;您将p[i]的竞赛复制到三点lp,因此,您的代码将打印与本地vairalbe lp相关的地址。如果不复制,请考虑复制运算符,structure ThreeDPoint尝试复制数组中每个项的指针:ThreeDPoint*lp=p+i;
ThreeDPoint lp = p[i];