繁体   English   中英

关于指向数组的指针的困惑

[英]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 == &apa == *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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM