为什么A [0],&A和*A的值输出相同?

pcc*_*pcc -1 c++

我正在做一个小实验.

#include<cstdio>
#include<iostream>
using namespace std;
int main()
{

  int A[5][5];
  cout<<A[0]<<"  "<<&A<<"   "<<*A;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

它为所有情况打印相同的值.有人可以解释为什么会这样吗?

Dav*_*eas 6

首先要了解的是您要打印的内容:

 cout<<A[0]<<"  "<<&A<<"   "<<*A;
Run Code Online (Sandbox Code Playgroud)

表达式A[0]lvalue表达式,其类型int[5]引用内部的第一个内部数组A,&Aint (*)[5][5]指向数组的类型的rvalue表达式A.最后*A相当于A[0],这是类型的左值表达式int[5].

没有在语言中定义的运算符(也不能提供它们)将转储a int[5]或a int (*)[5][5],因此编译器会尝试找到它可以找到的最佳匹配,并发现有一个运算符可以打印void*.int[5]可以腐烂成一个int*指的A[0][0],并且它本身可以转换成一个void*.int (*)[5][5]是指针,因此可以转换为void*,因此重载对两种情况都有效.

语言定义存储阵列的布局,特别是它要求阵列和阵列的第一个元素在同一个内存地址摆出来,所以如果你要打印的地址&A&A[0]将打印相同值,因为&A[0]也是在其第一个元素的相同内存位置,&A[0][0]也指同一个地址.

回到上面的代码,你打印的是:

cout<<         static_cast<void*>(&A[0][0]) 
    << "  " << static_cast<void*>(&A)
    << "  " << static_cast<void*>(&A[0][0]);
Run Code Online (Sandbox Code Playgroud)

按照上述推理,必须具有相同的精确值,即使在第二种情况下类型不同.