You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

数组名是首元素地址?为何这段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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 20:56:19