数组名是首元素地址?为何这段C++代码输出不同地址?
关于C++指针数组名与首元素地址的困惑
我学到的知识说数组名代表其首元素的地址,但在下面的C++代码中,输出的指针数组arp的地址和&s01的地址并不相同。
antarctica_years_end s01, s02, s03; s01.year = 1998; antarctica_years_end* pa = &s02; pa->year = 1999; antarctica_years_end trio[3]; // array of 3 structures trio[0].year = 2003; antarctica_years_end* arp[3] = { &s01, &s02, &s03 }; std::cout << arp << " " << &s01 << std::endl;
执行以下代码行:
std::cout << arp << " " << &s01 << std::endl;
输出结果为:
0000007AFB0FFC68 0000007AFB0FFBB4
我原本以为arp和&s01应该相等,因为arp是指针数组的数组名,&s01是该数组首元素的地址。但把代码改成:
std::cout << arp[0] << " " << &s01 << std::endl;
之后,输出的地址就相同了:
0000008517DBF8E4 0000008517DBF8E4
我刚接触C++编程,对此感到困惑,希望得到解答。
问题解答
arp是指针数组,数组名arp代表的是数组首元素的地址,但这里的首元素是一个antarctica_years_end*类型的指针变量。也就是说,arp指向的是数组第一个元素(存储&s01的那个指针)所在的内存地址,而非&s01本身。- 直接输出
arp时,打印的是这个指针数组在内存中的起始位置,也就是第一个指针元素的存储地址。 arp[0]等价于*(arp + 0),作用是取出数组首元素的内容——这个内容就是初始化时存入的&s01,所以输出arp[0]和&s01的地址自然完全一致。
简单类比:把arp看成一个装地址的盒子,arp的地址是盒子放在桌上的位置,arp[0]是盒子第一个格子里装的&s01地址。你直接看arp是看盒子在哪,看arp[0]才是看盒子里装的东西。
内容的提问来源于stack exchange,提问作者Johnny
相关产品推荐
相关产品推荐

