C语言中获取数组元素个数的方法
一般操作是借助sizeof运算符。首先获取整个数组的大小,即整个数组占用的字节数,然后获取数组元素类型的大小,两者相除则得到元素个数。
int main(void){
int arr[] = {4,6,8,3,5};
int num_ele = sizeof(arr)/sizeof(int);
printf("number of elements in the arr = %d\n",num_ele);
return 0;
}
这个操作在main函数中可行,但是如果在一个函数中操作就会有问题
对函数的数组参数求数组的元素个数
C语言函数参数传递方式
首先先了解一下C语言函数参数的传递方式。函数传入数组参数有两种方法,一种是传值,一种是传地址。C语言中,所有的函数参数都是“值传递” (pass by value)。所以在C语言中被调用函数操作的是被传入的参数的本地备份(local copy),而不是那些变量本身。但是,对于数组就不同了:当数组作为函数参数传递时,用的时数组的名字,也就是这个数组的首地址。所以被调用函数操作的是这个数组的首地址。对于数组中的元素则没有备份。
int get_arr_size(int *arr){
printf("arr[0] = %d\n", arr[0]);
printf("arr[1] = %d\n", arr[1]);
return 0;
}
int main(void){
int arr[] = {4,6,8,3,5};
get_arr_size(arr);
return 0;
}
函数中求数组参数的元素个数
尝试在函数get array size(int *arr)中通过第一部分所描述的方式获取 arr的元素个数,结果和原本设想的不太一样。使用本例的arr[] = {4,6,8,3,5},期望sizeof(arr)得到20,但是并非如此
int get_arr_size(int *arr){
printf("sizeof(arr) = %d\n",sizeof(arr));// 8
printf("sizeof(int) = %d\n", sizeof(int));// 4
int len = sizeof(arr)/ sizeof(int);
printf("len = %d\n", len);// 2
}
len的值为2,显然这是不对的。原因在于sizeof(arr) = 8,而不是原本设想的一个数组整个占用的字节数。这里得到的是指针变量的大小。指针变量的大小与程序运行的计算机电脑系统有关,对于64位的系统,指针大小为64bits,即8 bytes,因此sizeof(arr) 为8。
sizeof 在调用函数中可以得到正确的数组字节数,因此如果一个参数为数组的函数中需要使用到这个数组的长度,则应当在调用函数中计算好,将这个长度作为另一个参数传入
int get_arr_size(int *arr,int len){
for (int i = 0; i < len;i++){
printf("arr[%d] = %d\n", i, arr[i]);
}
return 0;
}
int main(void){
int arr[] = {4,6,8,3,5};
int num_ele = sizeof(arr)/sizeof(int);
// printf("number of elements in the arr = %d\n",num_ele);
get_arr_size(arr,num_ele);
return 0;
}