试图理解数组名称的含义

时间:2018-03-26 07:39:22

标签: c++ arrays pointers sizeof

我写过这个简单的程序

 #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
 }

我的期望是:

  • 第1行:arr是数组的名称,它是指向第一个元素arr = &arr[0]的指针,因此&arr[0]的地址将被打印出来
  • 第2行:arr[0]的地址将打印出来,&arr = arr
  • 第3行:sizeof(arr)获得了sizof(a pointer),因为arr是指针,我应该4 bytes

  • 第4行:sizeof(&arr)与第3行相同,因为&arr是类型指针,我应该4 bytes

但是在Line3中:我得到20个字节(sizof(int)*整数个数)

enter image description here

为什么Line2:arr就像一个指针,在Line3中它充当一个数组

我知道数组不是指针,但是当传递给函数时它会衰减到指针,sizeof(..)是一个运算符,因此它将arr视为数组,但是<<,它是一个运算符而不是一个函数

2 个答案:

答案 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