C++中数组与指针:解析数组地址含义及代码输出疑问
数组地址与C++ cout输出解析
先看你给出的代码:
char d[] {"Ashish"}; std::cout << d << std::endl; std::cout << &d << std::endl; std::cout << &d[0] << std::endl; std::cout << (void*)&d[0] << std::endl;
各语句输出说明
- 第一条语句:输出字符串
Ashish。C++中char数组名d会隐式转换为指向首元素的char*指针,cout对char*的默认行为是输出从该地址开始的连续字符,直到遇到字符串结束符\0("Ashish"会自动在末尾添加这个结束符)。 - 第二条语句:输出数组
d的起始内存地址(十六进制格式,例如0x7ffeefbff5a0)。&d是指向整个数组的指针,类型为char(*)[7](数组包含6个可见字符加1个结束符,共7个元素),cout处理这类非char*的指针时,会自动转换为void*并输出地址值。 - 第三条语句:输出字符串
Ashish。&d[0]是数组首元素的地址,类型为char*,和第一条语句的逻辑一致,cout会解析并输出对应字符串。 - 第四条语句:输出数组首元素的起始内存地址(十六进制格式,和第二条语句的输出值完全相同)。这里通过
(void*)将char*类型的&d[0]强制转换为void*,cout对void*的处理是直接输出地址值,而非解析字符串。
第二条与第四条输出相同的原因
数组的起始地址和它的首元素地址在内存中是同一个位置:数组是连续存储的元素集合,数组本身的地址就是其第一个元素的地址。
&d作为指向整个数组的指针,它的数值就是数组的起始地址;(void*)&d[0]是首元素地址转换为void*后的结果,数值同样是数组的起始地址。
两者指向的内存位置完全重合,因此cout输出的地址值完全一致。
内容的提问来源于stack exchange,提问作者Ashish
相关产品推荐
相关产品推荐

