C++ 关于数组指针的混淆

C++ 关于数组指针的混淆,c++,arrays,pointers,memory-address,C++,Arrays,Pointers,Memory Address,关于指针和数组,我有一个非常基本但困扰我的问题: int main() { int a[5] = { 1,2,3,4,5 }; int(*pa)[5] = &a; std::cout << a << std::endl; std::cout << &a << std::endl; std::cout << pa << std::endl; std::

关于指针和数组,我有一个非常基本但困扰我的问题:

int main() {

    int a[5] = { 1,2,3,4,5 };
    int(*pa)[5] = &a;

    std::cout << a << std::endl;
    std::cout << &a << std::endl;

    std::cout << pa << std::endl;   
    std::cout << (*pa) << std::endl;

    return 0;
}
intmain(){
int a[5]={1,2,3,4,5};
int(*pa)[5]=&a;

std::cout你几乎回答了你自己的问题。你想知道为什么
a
&a
是相同的:指定数组的第一个表达式的值是指向第一个元素的指针,而另一个表达式的值是指向整个对象的指针,正如你所注意到的。但这两个表达式的地址相同:第一个元素位于基地址数组的ess。那么为什么
pa
是相同的?为什么,因为您在声明中从
&a
初始化了它;它从
&a
获得了它的值。
*pa
是相同的,因为
pa
是指向数组的指针,所以
*pa
是数组。但是数组的计算结果是指向第一个元素的指针:和您已经在
a
中看到了这一点。表达式
*pa
指定了与
a
相同的对象,具有相同的类型和计算方式。

重要的是要理解
a
不是指针。在C的语义中,数组名称可以转换为指针,但在其他方面只是指针的别名数组第一个元素的地址

然后当谈到
pa
时,您只是说这个指针应该是
a
的地址,所以当您打印它的值时,它当然应该是相同的。 当然,由于
*pa
是一个数组(它的数组名),它只是别名它的第一个元素的地址,这也是
a
的地址。

隐式转换和“数组衰减为指针”是其背后的原因

让我们画一个数组,假设它是从地址0x98开始存储的

 +———————————————————+
 | 1 | 2 | 3 | 4 | 5 |
 +———————————————————+
 ^
 |
0x98
应该很清楚,数组的地址是0x98。
很明显,它的第一个元素的地址也是0x98

当你打印的时候

std::cout << a << std::endl;
如上所示,这与指向数组的指针具有相同的数值

同样,当您打印

std::cout << (*pa) << std::endl;

std::我想你的第一句话可能就是OP的问题所在。
a
是一个数组变量,正如你所说,它可以转换为指针,但只是保存数组的第一个元素是它的值。@DavidC.Rankin:是的,
a
是一个数组变量。更准确地说,
a
是数组的名称但是
a
不仅仅包含数组的第一个元素;
a
的值是整个数组对象的值,由其所有元素的值组成。在大多数上下文中,表达式
a
隐式转换为指针表达式,生成数组对象初始元素的地址。它是变量“a”很可能被认为是一个包含5个整数的对象。因此std::cout@Roy这不仅是可能的,也是事实。这就是数组。
std::cout << (*pa) << std::endl;