让我们看看下面的例子
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.
这可能是什么原因?
在第一种情况下,
cout << x << endl;
数组x
衰减为指向其第一个元素的指针。所以你看到了那个地址。在第二种情况下:
cout << &x << endl;
您正在看到数组的地址。这恰好与数组的第一个元素的地址相同,尽管它指的是包含所有元素的更大空间。它不一定要打印相同的内容,但是在您的实现(以及我曾经使用过的每个实现)上,它确实如此。
当您在int
下一节中处理 single 时,第一种情况不会衰减为指针,它只是打印整数的值。当您将其更改为 时&x
,您将明确要求该整数的地址。
因为对于数组x[]
,它等价于&(x[0])
and which 又等价于&x
x 是指向数组第一个元素的指针。
基本上:
x[0]
指的是数组的第一个元素。
&(x[0])
获取数组第一个元素的地址。
x
是一个数组,打印x
将产生其第一个元素的地址。
&x
指数组的地址。(注意:&x+1 和 x+1 不同,前者指向数组末尾的位置,后者指向数组的第二个位置)
一个没有括号的数组变量本身[]
会衰减为一个指针,即它会自动转换为指向第一个元素的指针。&
显式地创建一个指针。因此它们是相同的。
会int
直接显示,但&
会再次生成指针。因此它们是不同的。
想想你实际上在做什么。
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;