关于指向数组的指针的混淆
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'
不同。但是变量等于它的地址,指针等于指向的内容,这对我来说是不可理解的。
是隐式转换和"数组衰变成指针"的原因。
我们来画这个数组。假设它是从地址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
作为数组,被转换为指向其第一个元素的指针。
你基本上回答了你自己的问题。您想知道为什么a
和&a
是相同的:正如您注意到的那样,指定数组的第一个表达式的计算结果是指向第一个元素的指针,而另一个表达式的计算结果是指向整个元素的指针。但是它们是相同的地址:第一个元素位于数组的基址。那么为什么pa
是一样的?为什么,因为你在它的声明中从&a
初始化了它;它的值来自&a
。*pa
也一样,因为pa
是指向数组的指针,所以*pa
是数组。但是数组的计算结果是指向第一个元素的指针:您已经在a
中看到了这一点。表达式*pa
指定了与a
相同的对象,具有相同的类型和计算方式。
重要的是要理解a
不是指针。在C语言的语义中,数组名可以转换为指针,但除此之外只是数组第一个元素地址的别名。
当涉及到pa
时,你只是说这个指针应该是a
的地址,所以当然当你打印它的值时,它应该是一样的。当然,由于*pa
是一个数组(它的数组名),它只是别名它的第一个元素的地址-这也是a
的。
- 指向指向字符数组的指针数组的指针
- 通过指向指针数组的指针访问子类的属性
- C++,指针数组,指向双链表中的条目
- 在C++中,如何初始化指向wchar_t*的指针数组(生成wchar_t**)
- C++从函数指针数组调用函数
- 关于指向指针数组的指针
- 将返回值存储在函数指针数组的指针中是如何工作的?
- 将链表转换为指针数组时出错
- C++ 对象指针数组的复制构造函数
- C++ - 循环访问指针数组会导致错误
- 删除指针数组 (C++) 中的元素
- 如何循环访问 cpp 中的函数返回的字符指针数组
- 将函数指针数组中的函数指针作为模板参数传递
- Google Or-Tools Glop:如何创建指向 const 对象的指针数组?
- 具有推导参数的模板函数指针数组变量
- 如何模板化堆栈分配的多态指针数组到接口,包括派生类型的相应点?
- C++指针数组到字符数组中的特定位置
- 如何在C++中复制指针数组的数据
- 初始化类中的指针数组,并在另一个类中检索它
- 尽管直接设置了指针数组,但仍为空