C语言中对数组进行sizeof操作
sizeof是函数还是关键字?
-
解释
我们平常都是以
sizeof(参数)
的方式使用sizeof,因为有小括号的加持,所以经常误以为sizeof是一个函数名,实际上,sizeof是一个C语言的32个关键字之一,平时为了方便提高代码可读性,才在后面加了小括号。 -
用法:
- 语法1:
sizeof (类型说明符)
- 语法2:
sizeof 表达式
- 语法1:
-
定义:
sizeof是C/C++中的一个操作符(operator),简单的说其作用就是返回一个对象或者类型所占的内存字节数。
-
代码示例
int main(){ int a = 10; printf("%d", sizeof(a));// 打印结果为4,这是我们常用的小括号方式 printf("%d", sizeof a); // 打印结果为4,实际上不使用小括号也是可以计算a的大小的 return; }
sizeof如何查看数组大小
-
解释
-
如果对一个数组本身进行sizeof操作,那么返回的是一个数组所占内存字节数。
-
如果对一个指向数组的指针进行sizeof操作,那么返回的是一个指针所占内存字节数。
乍一看是不是废话,继续看看代码分析吧。
-
-
示例
在上一节提到了sizeof有2中用法,这里我们以常用的
sizeof(参数)
的方式为例。在下列代码段中,main方法中使用sizeof计算arr的大小为20,但是将arr传递到test方法中后,再使用sizeof计算arr大小就变成了4。void test(int arr[5]); int main(){ int arr[5] = {1,2,3,4,5}; printf("%d", sizeof(a));// 打印结果为20 return; } void test(int arr[5]) { printf("%d", sizeof(a));// 打印结果为4 }
-
解析
实际上,在C语言中,函数间传递数组时,数组会退化成指向数组的指针。这是因为实参是数组本身,但是接收的形参是一个数组指针。
再看看下列代码段,
int *b = a;
与函数间传递数组是等价的。虽然b和arr指向的都是数组首地址,但是arr是数组本身,b是指向数组的指针,这就是他们的细微差距。int main(){ int arr[5] = {1,2,3,4,5}; int *b = arr; printf("%d", sizeof(b));// 打印结果为4 return; }
-
补充
sizeof计算数组大小时,如果该数组在创建时,没有显式的定义长度,是由内容自动填充的,那么sizeof计算的大小可能不相等。来看看以下代码吧。
int main(){ char arr1[] = {'a','b','c'}; char arr2[] = "abc"; char arr3[4] = {'a','b','c'}; printf("%d", sizeof(arr1));// 打印结果为3,因为数组创建时没有显式的定义长度,所以根据内容,默认填充为长度3 printf("%d", sizeof(arr2));// 打印结果为4,别忘了字符串是以\0结尾的,"abc"等价于{'a','b','c','\0'} printf("%d", sizeof(arr3));// 打印结果为4,因为显示的定义了长度,所以不需要根据内容自动填充。 return; }
总结
- 使用sizeof需要注意,分清是数组本身,还是指向数组的指针。
- 如果对数组创建时的名称进行sizeof,计算的就是数组大小。如果对非数组创建时的变量名进行sizeof,那这个数组一定已经被传递过了,计算的就是指向数组的指针大小。
- 注意,如果是使用malloc方法创建的数组,那sizeof计算的也是指向数组的指针大小。