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;