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; }
作者:李鹏
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。