我有一个关于指针和数组的非常基本但令人困扰的问题:
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 和编译器中到底发生了什么。
最佳答案
这背后是隐式转换和“数组退化为指针”。
让我们绘制这个数组。假设它从地址 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/