数组是C++中的常量指针吗?
Are arrays a const pointer in C++?
C++是C++中的常量指针吗?
http://www.cplusplus.com/forum/articles/10/#msg1381
那么,如果x
和&x
是指针,为什么它们是相同的呢?
#include<iostream>
using namespace std;
int main() {
int x[5];
int *y = new int[5];
cout << "&x : " << &x << endl;
cout << "x : " << x << endl;
cout << endl;
cout << "&y : " << &y << endl;
cout << "y : " << y << endl;
return 0;
}
输出:
&x: 0xbfec4ccc
x : 0xbfec4ccc
&y: 0xbfec4ce0
y : 0x8961008
链接到上述代码的 ideone:http://ideone.com/3JRZd
格雷厄姆错了,不知道他在说什么。数组和指针是两个不同的东西。
不,数组不是 C++ 中的常量指针。事实上,如果一个文件包含
extern int* const a;
另一个包含
int a[10];
在同一范围内,合并这两个文件将导致奇怪的错误。
但是,在大多数情况下,数组会衰减为指针。更确切地说,如果在右值上下文中使用数组,则会将其隐式转换为指向其第一个元素的指针。这就是第二个链接示例中 x 发生的情况:由于数组的第一个元素当然与数组位于同一地址,因此 x
和 &x
都打印为相同的地址。但请注意,它们不是同一个指针,因为它们的类型不同:在这种情况下,x
衰减成int*
,即指向int
的指针,而&x
是int(*)[5]
类型,即指向 5 int
s 数组的指针。
您可以看到两者不同的另一种情况是引用数组的函数,例如
void f(int (&arr)[5]);
您可以将x
传递给此函数(因为它的类型为 int[5]
),但在编写int* y = x
时y
既没有&x
也没有指针;
代码
int array[3];
与 不同
int const *array=new int[3];
只是出于简单但不单一的原因:在第二种情况下,您需要调用delete [] array
。
愚蠢的类比:
考虑地址 1,主街。
它与街道"主街"不是一回事,尽管您可以将主街的开头称为"1,主街"。事实上,如果你想在街道的那一端遇到某人,你可以给他们一张纸条,上面写着地址"1,主街",作为在哪里等你的指针,这比把所有主街都放在一张纸上要容易得多(或者给他们一张上面有"X"的地图, 如果我们允许自己引入一个抽象层)。
1,主街当然不仅是主街起点的地址,也是主街上第一所房子的地址——这就是你印刷x
显示的——但房子和地址都不是街道。
是的。
因为指针始终是地址,所以任何类型的指针的 &值都应该相同。
你也可以做这样的事情
int number[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
int *pNumbers = number;
[编辑] 也许不是根据其他答案...但我总是觉得这是真的[编辑] 另请参阅"指针和数组"下的 http://www.cplusplus.com/doc/tutorial/pointers/
- 将常量指针引用绑定到非常量指针
- 如何使用数据对象上的常量指针初始化类
- C++中的指针和常量问题不大
- 为什么我收到"从常量指针到指针的转换无效?
- 当成员值从指针更改为非指针时,C++常量问题
- 使用双指针传递 2D 常量数组
- C++/QT:使用指向私有成员的常量指针作为只读数据共享
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 模板推导:为什么函数指针模板定义在常量和/或引用时不匹配?
- 初始化指针的常量向量
- 区分接受常量参数的函数引用/指针和与函数参数同名的非常量参数
- 什么是常量指针常量引用类型的参数?(const X* const & p)
- 无法将"常量指针常量"传递给常量引用
- C++:如何创建一个临时对象,包含一个指针 - 常量或非常量,具体取决于上下文
- 具有函数指针常量数组的 C++ 模板化静态类
- 这个constexpr整数不是空指针常量吗
- 使指针常量C++
- C++11在stl容器中共享指针常量
- 空指针常量转换为右值
- 在参考 (T&) 和常量指针 (T* 常量) 之间进行选择