[英]Confusion about pointer to an array
关于指针和数组我有一个非常基本但令人难以忘怀的问题:
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;
}
令人惊讶的是,所有四个输出都给出相同的地址,例如'006AF784'
,这意味着a == &a
和pa == *pa
。 这对我没有任何意义!
我理解当然'a'
是指向第一个元素的指针,而'&a'
是指向整个数组的指针,因此'a+1'
与'&a+1'
。 但是变量等于它的地址,并且指针等于指向的内容对我来说是不可理解的。 我想知道在C和编译器中究竟发生了什么。
你几乎回答了自己的问题。 你想知道为什么a
, &a
是相同的:正如你所注意到的,指定数组的第一个表达式求值为指向第一个元素的指针,另一个表达式指向指向整个元素的指针。 但两者都是相同的地址:第一个元素位于数组的基址。 那为什么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;
a
被转换为指向其第一个元素的指针 - 它相当于
std::cout << &a[0] << std::endl;
如上所示,它具有与指向数组的指针相同的数值。
同样,当你打印
std::cout << (*pa) << std::endl;
*pa
,作为一个数组,被转换为指向其第一个元素的指针。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.