c++ 数组的大小 sizeof

   在确定一个数组大小的时候我们一般用sizeof

    int arr1[] = {1 , 2, 4 ,5};
    int arr1_len = sizeof arr1/sizeof(int);
    std::cout<< "arr1 len: " << arr1_len << std::endl;

    但是如果数组是函数的一个参数,我们就要把数组的大小也做为参数传入,换个方式说就是,如果数组做为参数,在函数内我们就不能使用sizeof来计算数组的大小?例:

int sum(int arr[], int len)

  参数int arr[] 中括号为空表明可以传入任意长度的数组给函数。但是参数arr[]并不是数组,而是一个指针,但我们可以当作数组来使用。

      一般情况下,数组名就是指针,c++将数组名解析为第一个元素的地址:

arr == &arr[0]

  

     但也有例外,第一种:数组声明使用数组名来标记存储位置;第二种:对数组名使用sizeof将得到整个数组的长度(以字节为单位)

     上面的方法  int sum(int arr[], int len)中 arr是数组名,也就是第一个元素的地址,因此函数传递的是地址 也就是一个int指针。所以函数等价于:

int sum(int *arr, int len)

     我在main之上声明的函数 int sum(int arr[], int len); 定义我们用 int sum(int *arr, int len) 也是合法的

#include<iostream>

int sum(int arr[], int len);
int main() {
    int int_arr[] = {1, 2, 3};
    int int_arr_len = sizeof int_arr/sizeof(int);
    auto total = sum(int_arr, int_arr_len);
    std::cout << "total: " << total << std::endl;
}
int sum(int arr[], int len) {
    int total = 0;
    for (int i = 0; i < len; i++)
        total += arr[i];
    return total;
}

// 上面和下面是一样,两个同不能同时存在
int sum(int *arr, int len) {
    int total = 0;
    for (int i = 0; i < len; i++)
        total += arr[i];
    return total; 
}

  上面使用int *arr 替换了 int arr[] 都是正确的,在c++中,只有在函数头或函数原型中 int arr[]和 int *arr的含义是相同的。他意味着 arr是一个int 指针,不过数组表示法 int arr[]提醒用户, arr 不仅指向int,还指向int数组的第一个int。

     arr做为函数参数,并没有把数组内容传递给函数,面是将数组的地址和类型(int)告诉了函数。所以在函数内使用sizeof是得不到正确的数组大小的。

 

int sum(int arr[], int len);

int main() {
    int arr[] = {1, 2, 3, 4, 5};
    std::cout << "sizeof: " << sizeof arr << std::endl;
    int arr_size = sizeof arr/ sizeof(int);
    sum(arr, arr_size);
    return 0;
}

int sum(int arr[], int len) {
    int total = 0;
    std::cout << "sizeof: " << sizeof arr << std::endl;
    for (int i = 0; i < len; i++)
        total += arr[i];
    return total;
}

  

posted @ 2020-06-21 09:37  li-peng  阅读(13304)  评论(0编辑  收藏  举报