0

让我们看看下面的例子

int x[10];
cout<<x<<endl;
cout<<&x<<endl; //both couts are same.


int x;
cout<<x<<endl;
cout<<&x<<endl; //last two couts are different.

这可能是什么原因?

4

4 回答 4

6

在第一种情况下,

cout << x << endl;

数组x衰减为指向其第一个元素的指针。所以你看到了那个地址。在第二种情况下:

cout << &x << endl;

您正在看到数组的地址。这恰好与数组的第一个元素的地址相同,尽管它指的是包含所有元素的更大空间。它不一定要打印相同的内容,但是在您的实现(以及我曾经使用过的每个实现)上,它确实如此。

当您在int下一节中处理 single 时,第一种情况不会衰减为指针,它只是打印整数的值。当您将其更改为 时&x,您将明确要求该整数的地址。

于 2013-08-16T16:17:07.257 回答
4

因为对于数组x[],它等价于&(x[0])and which 又等价于&xx 是指向数组第一个元素的指针。

基本上:

  1. x[0]指的是数组的第一个元素。

  2. &(x[0])获取数组第一个元素的地址。

  3. x是一个数组,打印x将产生其第一个元素的地址。

  4. &x指数组的地址。(注意:&x+1 和 x+1 不同,前者指向数组末尾的位置,后者指向数组的第二个位置)

于 2013-08-16T16:15:20.877 回答
3

一个没有括号的数组变量本身[]会衰减为一个指针,即它会自动转换为指向第一个元素的指针。&显式地创建一个指针。因此它们是相同的。

int直接显示,但&会再次生成指针。因此它们是不同的。

于 2013-08-16T16:16:53.123 回答
0

想想你实际上在做什么。

int x[10];
cout<<x<<endl;
cout<<&x<<endl;

在这里,cout<<x<<endl;将打印 &x 因为 x 的值是数组在内存中的位置。同样cout<<&x<<endl;也会显示 &x。

int x;
cout<<x<<endl;
cout<<&x<<endl;

现在在这里,cout<<x<<endl;将打印 x 的值。ascout<<&x<<endl;将打印 x 的地址。

如果您想打印数组的值,您需要使用访问器cout<<x[0]<<endl;

于 2013-08-16T16:17:58.990 回答