数组是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];