数组是C++中的常量指针吗?

Are arrays a const pointer in C++?

本文关键字:指针 常量 C++ 数组      更新时间:2023-10-16
数组

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的指针,而&xint(*)[5]类型,即指向 5 int s 数组的指针。

您可以看到两者不同的另一种情况是引用数组的函数,例如

void f(int (&arr)[5]);

您可以将x传递给此函数(因为它的类型为 int[5]),但在编写int* y = xy既没有&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/