C++ 为什么使用'int(*p)[5]`的结果如此令人困惑?

C++ 为什么使用'int(*p)[5]`的结果如此令人困惑?,c++,pointers,pointer-to-array,C++,Pointers,Pointer To Array,我知道int(*p)[5]表示指向5个int数组的指针。 因此,我将此程序编码如下: #include <iostream> using namespace std; int main() { int a[5]={0,1,2,3,4}; int (*q)[5]=&a; cout<<a<<endl; cout<<q<<endl; cout<<*q<<endl;

我知道
int(*p)[5]
表示指向5个int数组的指针。 因此,我将此程序编码如下:

#include <iostream>
using namespace std;

int main()
{
  int a[5]={0,1,2,3,4};
  int (*q)[5]=&a;
  cout<<a<<endl;         
  cout<<q<<endl;
  cout<<*q<<endl;        
  cout<<**q<<endl;
  return 0;
}
我可以理解
*q
表示
a[0]
的地址,
**q
表示
a[0]
的值,但是为什么
q
a
*q
的值相同呢?在我可怜的心里,这应该是他们的地址!我完全糊涂了。谁来帮帮我。求你了

这样看:

   q == &a
   *q == a
   **q == *a
您没有尝试打印
&a
。如果这样做,您将看到它与
a
具有相同的值。由于传递性
q==a
,和
q==a
,以及
*q==a
,因此


如果您想知道为什么
&a==a
,请查看,因为
数组
自动转换为
指针
,该指针只有
数组
的地址值。因此,当您试图打印
数组时,使用
q
&a
打印数组是指向数组的指针


*q
a
是“数组”。但是您不能真正地将数组传递给函数(而
std::ostream::operator这是否意味着
&a==a=&a[0]
?@zyc,不是,但它们都从同一个地址开始。@zyc:是和否,这被称为
衰减
,即在大多数上下文中,数组会衰减为指针,而指针的值只是它的第一个元素的地址,它恰好也是数组本身的地址。是的,但我只想打印它的地址。
   q == &a
   *q == a
   **q == *a