C语言取数组长度传参时的问题
Posted 17岁boy想当攻城狮
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言取数组长度传参时的问题相关的知识,希望对你有一定的参考价值。
通常我们取一个数组实际长度(个数,非字节数)时最常用的方法就是写一个宏函数,用字节数除去类型就可以得到实际长度
#define ArrSzie(arr) sizeof(arr)/sizeof(arr[0])
如果当用这个宏函数去取参数会怎样?
#include <stdio.h>
#define ArrSize(arr) sizeof(arr)/sizeof(arr[0])
int arr[10] = {0};
void test(int* var){
printf("%d\\n",ArrSize(var));
}
int main(){
test(arr);
return 0;
}
输出结果:
2
这个结果很明显不对,理应是10,那么是为什么呢?
首先sizeof是编译命令,注意它是编译命令,不是API,这点需要注意,它仅在编译期间完成工作,当sizeof(int)时,在编译期间编译器会取当前类型所占大小,并替换,sizeof(int)则会变成4,但是当我们进行函数调用时传递数组的情况下会C语言默认会用一个指针指向数组地址,那么sizeof就变成了sizeof(int*),就被替换成了4,因为是编译期间的命令,所以只能根据实际参数的类型来做取值,不能去取指针指向内存的类型。
至于为什么输出为2,我的电脑是64位,编译的程序也是64位。
所以sizeof(arr) = 8
sizeof(arr[0]) = 4
8/4=2
这里讲一下为什么sizeof(arr[0])=4,因为arr[0],可以看成对指针进行解引用*(arr+0),最终输出结果是一个整数,那么C语言会将它以整型(int)处理,而arr则看成没有解引用的指针类型(int*)。
这里需要注意,指针和数组虽然使用的时候没有什么区别,但是在编译期间是有区别的,sizeof(arr)如果arr是数组类型,C语言编译器会取出数组总大小,如果是指针类型,则返回指针类型的size。
以上是关于C语言取数组长度传参时的问题的主要内容,如果未能解决你的问题,请参考以下文章