C++ 为什么x和&x对于阵列是相同的

C++ 为什么x和&x对于阵列是相同的,c++,reference,C++,Reference,让我们看看下面的例子 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. 原因可能是什么?因为对于数组x[],它相当于&x[0],而它又相当于&x,因为x是指向数组

让我们看看下面的例子

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.
原因可能是什么?

因为对于数组x[],它相当于&x[0],而它又相当于&x,因为x是指向数组第一个元素的指针

基本上:

x[0]表示数组的第一个元素

&x[0]获取数组的第一个元素的地址

x是一个数组,打印x将得到其第一个元素的地址

&x表示数组的地址。注意:&x+1和x+1不同,前者将指向数组末尾旁边的位置,而后者将指向数组的第二个位置


没有[]方括号的数组变量本身会衰减为指针,即它会自动转换为指向第一个元素的指针。&显式生成指针。所以他们是一样的

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

在第一种情况下

cout << x << endl;
您将看到阵列的地址。它恰好与数组的第一个元素的地址相同,尽管它指的是包含所有元素的更大空间。它不一定要打印相同的内容,但在您的实现和我使用过的每个实现中,它都会打印相同的内容


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

想想您实际在做什么

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

在这里,您能理解&实际上在做什么吗?数组分解为指向其第一个元素的指针。获取数组的地址将为您提供具有不同类型的相同指针。第二个例子是未定义的行为。@dunc123是的,它正在生成一个引用,它输出变量@user1906399的内存位置:它正在生成一个指针,而不是引用。它们虽然在C++中是相似的概念,但更确切地说,表达式X隐式地转换成指向x(0)的指针,除非是“and”或“sieof”的操作数。数组不是指针;但它可以转换为指向其第一个元素的指针。x和&x指向相同的内存位置,但类型不同。最后一句话是错误的:x不是指针。谢谢大家的输入。做得很匆忙&x[0]获取第一个元素的地址,这与取消引用相反。3.x是一个数组,而不是一个数组pointer@MikeSeymour:棘手的术语。对象x不是指针对象,而是数组对象。表达式x的计算结果为指针值,除非它是&或sizeof的操作数。不过,说x是一个没有进一步限定的指针充其量只是误导。在第二种情况下,x没有值,那么它显示了什么值?@user1906399:我甚至不知道你没有初始化它。访问未初始化的变量是未定义的行为。但实际上,它只会打印声明变量时该位置上的任何值。
int x[10];
cout<<x<<endl;
cout<<&x<<endl;
int x;
cout<<x<<endl;
cout<<&x<<endl;