0

C++ 数组确实是 C++ 中的 const 指针吗?

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

4

5 回答 5

4

格雷厄姆错了,他不知道他在说什么。数组和指针是两个不同的东西。

于 2012-04-10T23:16:03.353 回答
3

不,数组不是 C++ 中的 const 指针。确实,如果一个文件包含

extern int* const a;

另一个包含

int a[10];

在同一范围内,合并两个文件会导致奇怪的错误。

但是,在大多数情况下,数组会衰减为指针。更准确地说,如果在右值上下文中使用数组,它会隐式转换为指向其第一个元素的指针。这就是第二个链接示例中 x 发生的情况:由于数组的第一个元素当然与数组位于相同的地址,因此两者x&x都打印为相同的地址。但是请注意,它们不是同一个指针,因为它们属于不同的类型:x在此上下文中衰减为int*,即指向 的指针int,而&x类型为int(*)[5],即指向 5 ints 数组的指针。

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

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

您可以传递x给这个函数(因为它是类型int[5]),但既不传递也不传递给您在编写时获得&x的指针;yint* y = x

于 2012-04-10T23:16:45.343 回答
1

编码

int array[3];

不一样_

int const *array=new int[3];

只是出于简单但不是单一的原因:您需要delete [] array在第二种情况下调用。

于 2012-04-10T23:19:04.217 回答
1

愚蠢的比喻:

考虑地址1, Main Street
尽管您可以将 Main Street 的开头称为“1, Main Street”,但它与街道“Main Street”不同。事实上,如果你想在街的那一头见到某人,你可以给他们一张纸条,上面写着“1, Main Street”的地址,作为在哪里等你的指针,这比把所有的人都装好要容易得多在一张纸上(或者给他们一张上面有“X”的地图,如果我们允许自己引入一个抽象层的话)。

1、Main Street当然不仅是Main Street的起点地址,也是Main Street上第一栋房子的地址——这就是你打印出来的样子x——但是房子和地址都不是街道。

于 2012-04-11T14:34:11.983 回答
-1

是的,他们是。

因为指针始终是地址,所以 &value 对于任何类型的指针都应该是相同的。

你也可以做这样的事情

int number[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
int *pNumbers = number;

[编辑] 也许不是根据其他答案......但我一直认为这是真的 [编辑] 也见http://www.cplusplus.com/doc/tutorial/pointers/在“指针和数组”

于 2012-04-10T23:17:40.803 回答