c++ - 关于指向数组的指针的困惑

标签 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::cout << (*pa) << std::endl;

    return 0;
}

令人惊讶的是,所有四个输出都给出了相同的地址,类似于 '006AF784',这意味着 a == &apa == *pa。这对我来说没有任何意义!

我当然理解 'a' 是指向第一个元素的指针,而 '&a' 是指向整个数组的指针,所以 'a+ 1' 不同于'&a+1'。但是一个变量等于它的地址,一个指针等于它指向的内容,这对我来说是无法理解的。我想知道 C 和编译器中到底发生了什么。

最佳答案

这背后是隐式转换和“数组退化为指针”。

让我们绘制这个数组。假设它从地址 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 是一个数组,被转换为指向其第一个元素的指针。

关于c++ - 关于指向数组的指针的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39302598/

相关文章:

c++ - 错误“调用纯虚拟方法”,当此方法已被覆盖时

python - 将数组写入 csv python(一列)

javascript - 将数组项复制到另一个数组中

c++ - 选择值/指针/引用是否有一个规则或优先级?

c - 对指向结构数组的指针执行算术运算时出错

c++ - 抓取字符串的一部分,如 substr

c++ - (错误) 'operator>>' 中的 'std::cout >> namesArray(counter)(0)' 不匹配

c++ - 如何解耦 C++ 项目 header 依赖项?

C++ 通过引用传递数组