我对以下代码的输出感到困惑.
#include<iostream>
#include<cstdlib>
using namespace std;
int main()
{
int a[] = {1,2,3};
cout << a << " " << &a << endl;
cout << sizeof(a) << " " << sizeof(&a) << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出是
0xbfcd3ae4 0xbfcd3ae4
12 4
Run Code Online (Sandbox Code Playgroud)
如何能a与&a打印相同的表达,但有不同的大小?我一直认为对于任何数组,其名称始终具有第一个字节的value =地址.
也&a应该没有意义,因为一个地址(通过&运算符获得)不能到地址(a的值).然而,代码根据输出给出输出和实际上'a ==&a'.
同样,为什么sizeof(a) = 12数组的输出(占用的总内存)?a作为"指针"本身sizeof(a)= 4字节(在我的32位Ubuntu 11.04上)
显然我有一些误解.有人可以为我解决这个问题吗?
Mar*_*som 14
数组不是指针,但当您尝试使用它时,数组会衰减到指针.在您的情况下,打印数组的地址会自动将其转换为指针.
自动转换的指针与显式创建的指针之间几乎没有区别&,除了一个是指向单个元素的指针而另一个是指向整个数组的指针.如果你曾经使用过,&a[0]那么它们将完全相同.
首先,要意识到对象1和我们用来引用该对象的表达式之间存在差异.在您的代码中,a是一个表达式,它引用一个足以存储3个int值的对象.
除非它是sizeof或一元运算&符的操作数,或者是用于初始化声明中的另一个数组的字符串文字,否则"N元素数组T" 类型的表达式将被转换("衰减")为表达式输入"指向T",表达式的值将是数组第一个元素的地址.
给出一个类似的陈述
cout << a;
Run Code Online (Sandbox Code Playgroud)
表达式a有"3元素数组int"; 因为a它不是sizeof或一元运算&符的操作数,它将被转换为"指向int" 的类型的表达式,并且表达式的值将是数组中第一个元素的地址.
OTOH,给出了类似的陈述
cout << &a;
Run Code Online (Sandbox Code Playgroud)
表达式a是一元运算&符的操作数,因此规则不适用; 相反,表达式的类型是"指向3元素数组的 指针int",表达式的值是数组的地址.
在C和C++中,数组的地址和数组的第一个元素的地址是相同的,因此两个表达式产生相同的值,但两个表达式的类型是不同的(int *vs. int (*)[3]).
在声明中
cout << sizeof a; // or sizeof (a)
Run Code Online (Sandbox Code Playgroud)
表达式a是运算sizeof符的操作数,因此转换规则也不适用; 相反,表达式sizeof a求值为数组使用的字节数(在本例中为12).
在声明中
cout << sizeof &a; // or sizeof (&a)
Run Code Online (Sandbox Code Playgroud)
表达式&a求值为数组的地址并具有类型int (*)[3],因此sizeof &a计算指针类型使用的字节数(在您的情况下为4个字节).
在C和C++中,当你声明一个数组时
int a[3];
Run Code Online (Sandbox Code Playgroud)
留出的唯一存储空间是3个数组元素; 对于a指向数组的第一个元素的变量,没有单独的存储空间(这就是为什么a并&a产生相同的值).