数组是C++;? < C++是C++中的const指针吗?< /p>
那么,如果数组是C++;? < C++是C++中的const指针吗?< /p>,c++,pointers,C++,Pointers,那么,如果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 <
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;
}
链接到上述代码的ideone:
格雷厄姆错了,他不知道自己在说什么。数组和指针是两个不同的东西。< P>不,数组是C++中的const指针,这是不正确的。如果一个文件包含
extern int* const a;
另一个包含
int a[10];
在同一范围内,合并两个文件将导致奇怪的错误
但是,在大多数情况下,数组会衰减为指针。更确切地说,如果在右值上下文中使用数组,它将隐式转换为指向其第一个元素的指针。这就是第二个链接中的示例中x的情况:由于数组的第一个元素当然与数组位于同一地址,因此x
和&x
都打印为同一地址。但是请注意,它们不是相同的指针,因为它们的类型不同:x
在本上下文中衰减为int*
,即指向int
的指针,而&x
的类型为int(*)[5]
,即指向5个int
的数组的指针
另一种情况是函数引用数组,可以看出两者是不同的,如
void f(int (&arr)[5]);
您可以将x
传递给此函数(因为它的类型为int[5]
),但写入int*y=x
时既不能传递&x
,也不能传递指针y
是的
因为指针始终是地址,所以对于任何类型的指针,&值都应该相同
你也可以这样做
int number[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
int *pNumbers = number;
[编辑]可能不是根据其他答案。。。但我总觉得这是真的
[编辑]另请参见“指针和数组”下的代码
int array[3];
与不同吗
int const *array=new int[3];
原因很简单,但不是单一的:在第二种情况下,您需要调用delete[]array
。愚蠢的类比:
考虑一下地址1,主街。这与大街“主街”不同,尽管你可以将主街的开头称为“1,主街”。事实上,如果你想在街的尽头与某人见面,你可以给他们一张写有地址“1,Main street”的便条,作为在哪里等你的指针,这比把Main street的所有部分都放在一张纸上要容易得多(或者给他们一张上面有“X”的地图,如果我们允许自己引入一个抽象层的话)
1、Main Street当然不仅是Main Street的开始地址,也是Main Street上第一栋房子的地址-这是您打印的
x
显示的-但房子和地址都不是街道。您可以显示sizeof
的相同问题<代码>大小(x)!=尺寸(y)。(在你的ideaone链接中)我100%同意GManNickG。数组“只是指针”是C/C++常见的误解。它们可以退化为指针,但如果没有,它们就不同了。当它们这样做时,它们仍然不同,因为它们必须衰减。公平地说,完全允许通过动态分配实现自动分配。重要的是编译器为我们管理删除。这确实是最好的答案。(数组隐式转换为指针)非常感谢。
int const *array=new int[3];