我写过这个简单的程序
#include <iostream>
using namespace std;
int main (){
int arr [5] = {1,2,3,4,5};
cout<<arr<<endl; //Line 1
cout<<&arr<<endl; //Line 2
cout<<sizeof(arr)<<endl; //Line 3
cout<<sizeof(&arr)<<endl; //Line 4
}
我的期望是:
arr
是数组的名称,它是指向第一个元素arr = &arr[0]
的指针,因此&arr[0]
的地址将被打印出来arr[0]
的地址将打印出来,&arr = arr
第3行:sizeof(arr)
获得了sizof(a pointer)
,因为arr
是指针,我应该4 bytes
第4行:sizeof(&arr)
与第3行相同,因为&arr
是类型指针,我应该4 bytes
但是在Line3中:我得到20个字节(sizof(int)*整数个数)
为什么Line2:arr
就像一个指针,在Line3中它充当一个数组
我知道数组不是指针,但是当传递给函数时它会衰减到指针,sizeof(..)
是一个运算符,因此它将arr
视为数组,但是<<
,它是一个运算符而不是一个函数
答案 0 :(得分:4)
我知道数组不是指针,但是当传递给函数时它会衰减为指针,sizeof(..)是一个运算符,因此它将arr视为数组
没错。因此,你在第2行得到20个字节。
但是&lt;&lt;,它是一个运算符而不是函数
实际上,当<<
与除内置整数类型之外的任何东西一起使用时,它是用户定义的函数(请参阅运算符重载)。所以它按预期工作。
答案 1 :(得分:2)
要理解Line2,你真的需要理解数组和指针之间的区别。首先,当您声明一个数组时,您声明了数组所包含的类型(int),然后保留组成数组的多个(int)大小的字节。毫无疑问,阵列是整个阵列结构。
int arr[5] = {1, 2, 3, 4, 5};
如果你想弄清楚当前机器上int的大小(以字节为单位),你可以像在Line4中那样询问数组中单个元素的大小。
sizeof &arr
// this is equivalent to ...
sizeof &arr[0]
// you could also ask for just ...
sizeof arr[0]
这些都会返回4个字节(机器上int的大小)。
了解arr本身没有地址。想想当您将数组传递给函数时,您只传递第一个元素的地址。因此,这两个函数声明完全相同:
int foo(char *arr);
int foo(char arr[]);
因此,当你在第3行中询问要求整个数组大小的数组大小时。 (5 * 4字节)= 20字节
同样非常重要的是要理解的是,当您将数组传递给函数时,您只传递数组中第一个元素的地址。所以如果你创建了一个函数:
int array_size(char arr[]) { return sizeof arr; }
int main() {
int foo[5] = { 1, 2, 3, 4, 5 };
std::cout << "Foo size: " << array_size(foo) << std::endl;
std::cout << "Foo size: " << sizeof foo << std::endl;
return 0;
}
结果:
Foo size: 4
Foo size: 20