C++数组名与&array地址一致疑问:*(&x)与x表现差异解析
C++数组名与数组地址的逻辑解析
先看你给出的代码及运行结果:
int main() { int x[] = {1, 2, 3, 4}; cout << "x = " << x << endl; cout << "&x = " << &x << endl; cout << "*(&x) = " << *(&x) << endl; cout << "*x = " << *x << endl; cout << "**(&x) = " << **(&x) << endl; }
运行输出:
x = 0x7ffd179e9060 &x = 0x7ffd179e9060 *(&x) = 0x7ffd179e9060 *x = 1 **(&x) = 1
问题1:为何x与&x的地址值相同?
数组名x在多数语境下会隐式转换为指向数组首元素的指针,类型是int*,指向的是数组第一个元素x[0]的地址。&x是整个数组的地址,类型是int(*)[4](指向包含4个int的数组的指针)。
数组的首元素地址和整个数组的起始地址本来就是同一个位置——数组从首元素开始存放,所以两者的地址数值完全相同,但类型截然不同,这是核心区别。
问题2:为何x等于1,而(&x)却等于数组地址?
*x:x被转换为int*类型指针,指向首元素x[0],解引用后得到首元素的值1。*(&x):&x是int(*)[4]类型指针,解引用它得到整个数组本身。而数组名在输出时会再次隐式转换为指向首元素的指针,所以最终打印的还是数组首元素的地址值。
简单说,*(&x)等价于数组名x,输出结果自然和x一致。
问题3:为何**(&x)结果为1,能正常运行?
&x是int(*)[4]类型指针,第一次解引用*(&x)得到整个数组,数组随即隐式转换为int*类型的首元素指针;第二次解引用*就是对这个首元素指针解引用,最终得到首元素的值1。
拆解逻辑:**(&x) = *(*(&x)) = *(x) = x[0] = 1
这看起来是二级指针操作,但本质是两次不同类型的解引用,并非真正的二级指针用法。
内容的提问来源于stack exchange,提问作者M a m a D
相关产品推荐
相关产品推荐

