C语言数组长度的计算方法实例总结(sizeof与strlen)
目录
- 前言
- 1. 数组的创建
- 2. 求解数组的长度
- 注意:
- 总结:
前言 最近在重新学习C语言,学习中发现之前对数组长度的计算方法模糊不清。因此做个总结。
首先要明白什么是数组。
数组是一组相同类型元素的集合。
因此,要定义一个数组,首先要确定数组内的元素是同一种类型。
1. 数组的创建 首先来看看常用的数组的创建形式
- int型
int arr1 [10] = {0}; //定义了元素个数,且给第一个元素赋值为0,则其他元素均为0
通过VS调试中的监视功能,可以看到各个数组的存放结果。
文章图片
int arr2 [10] = {1, 2, 3, 4, 5}; //定义了元素个数,但只给前五个元素赋值,则后五个元素均为0
文章图片
int arr3 [10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; //定义了元素个数,且给所有元素均赋值
【C语言数组长度的计算方法实例总结(sizeof与strlen)】
文章图片
int arr4 [10]; //什么都不放,编译器会给数组的每个元素放置随机数。
文章图片
int arr5[] = {1, 2, 3}; //不定义元素个数,给几个元素赋值就有几个元素。
文章图片
注意:
如果你定义了数组的大小(也就是【】号里面写了数字),但是没有给任何元素赋值,那么这个数组的所有元素都默认为一个随机数!!!如果你定义了数组大小,但只给部分元素赋值,那么剩余元素的值默认为0!!!(见上面arr4和arr5)。
因此常用上面arr1的方式,给int型数组的全部元素设置默认值为0.
- char型
char arr6[] = "abc"; //没有定义元素个数,用双引号定义3个字符,末尾数组会自动加上结束标志(\0)
文章图片
char arr7 [10] = "abc"; //定义10个元素个数,用双引号赋值三个字符串,其余7个元素均自动定义为\0
文章图片
char arr8 [10] = {'a', 'b', 'c'}; //定义10个元素个数,用大括号和单引号赋值三个字符串,则数组只含有三个字符,剩余7个均为\0
文章图片
char arr9 [10] = {'a', 98, '98'}; //char定义数组,元素中出现没有用单引号的数字,会根据ASCII码输出字符
文章图片
char arr10[] = {'a', 'b', 'c'}; //没有定义元素个数,用大括号定义字符串,数组的元素个数则只有三个,结尾没有数组结束标志(\0)
文章图片
注意:
要格外注意举例中arr10和arr6的不同。同样为插入abc三个字符,但是arr6结尾有\0,arr10却没有,这在下一步求解数组长度的时候有相当大的区别!!!
2. 求解数组的长度 求解数组长度往往要用到两个函数,strlen或者sizeof
- strlen求解数组长度
具体代码如下:
char arr6[] = "abc"; //没有定义元素个数,用双引号定义3个字符,末尾数组会自动加上结束标志(\0) printf("length arr6 = %d\n", strlen(arr6)); char arr7 [10] = "abc"; //定义10个元素个数,用双引号赋值三个字符串,其余7个元素均自动定义为\0 printf("length arr7 = %d\n", strlen(arr7)); char arr8 [10] = {'a', 'b', 'c'}; //定义10个元素个数,用大括号和单引号赋值三个字符串,则数组只含有三个字符,剩余7个均为\0 printf("length arr8 = %d\n", strlen(arr8)); char arr9 [10] = {'a', 98, '98'}; //char定义数组,元素中出现没有用单引号的数字,会根据ASCII码输出字符 printf("length arr9 = %d\n", strlen(arr9)); char arr10 [] = {'a', 'b', 'c'}; //没有定义元素个数,用大括号定义字符串,数组的元素个数则只有三个,结尾没有数组结束标志(\0) printf("length arr10 = %d\n", strlen(arr10));
文章图片
注意:
1、从arr6和arr7中可以看出,用双引号定义的字符串数组都能正确计算出数组长度。这是因为这两个数组的****末尾都含有结束标志”\0“(具体看前面举例中的截图)。
2、另外要注意的是,arr10输入了三个字符,但结果却是15个,这是因为在没有定义数组个数的时候,用大括号的形式赋值,结尾不会自动补充结束标志\0,导致这个结果是个随机数,strlen会在内存中一直计数,知道在内存中遇到了0才会停止技术。
但是对比arr8和arr9,也是用了大括号赋值,但结果却是正确的,这是因为开始定义了数组的个数,没有初始化赋值的数组会默认赋值为0(与\0有一样的效果)。
3、如果用strlen用来求int类型数组的长度,会发现strlen不能用了。
int arr1 [10] = {0}; //定义了元素个数,且给第一个元素赋值为0,则其他元素均为0 printf("length arr1 = %d\n", strlen(arr1)); int arr2 [10] = {1, 2, 3, 4, 5}; //定义了元素个数,但只给前五个元素赋值,则后五个元素均为0 printf("length arr2 = %d\n", strlen(arr2)); int arr4 [10]; //什么都不放,编译器会给数组的每个元素放置随机数。 printf("length arr4 = %d\n", strlen(arr4));
文章图片
- sizeof求解数组长度
所以常常用 sizeof(arr)/sizeof(arr[0]) 来计算数组的长度。其中“sizeof(arr)“计算了整个数组arr占据了多少内存(字节为单位),”sizeof(arr[0])“计算了数组中第一个元素所占多少字节,两者相除就是数组的长度。
代码如下:
int arr1 [10] = {0}; //定义了元素个数,且给第一个元素赋值为0,则其他元素均为0 int arr2 [10] = {1, 2, 3, 4, 5}; //定义了元素个数,但只给前五个元素赋值,则后五个元素均为0 int arr3 [10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; //定义了元素个数,且给所有元素均赋值 int arr4 [10]; //什么都不放,编译器会给数组的每个元素放置随机数。 int arr5[] = {1, 2, 3}; //不定义元素个数,给几个元素赋值就有几个元素。 int len1 = sizeof(arr1) / sizeof(arr1 [0]); int len2 = sizeof(arr2) / sizeof(arr2 [0]); int len3 = sizeof(arr3) / sizeof(arr3 [0]); int len4 = sizeof(arr4) / sizeof(arr4 [0]); int len5 = sizeof(arr5) / sizeof(arr5 [0]); printf("length arr1 = %d\n", len1); printf("length arr2 = %d\n", len2); printf("length arr3 = %d\n", len3); printf("length arr4 = %d\n", len4); printf("length arr5 = %d\n", len5);
文章图片
可以看出,如果你一开始就定义了数组的大小,那么不管你插入多少个元素,求出来的结果永远是你定义的数组大小。
如果你没有定义数组大小,那么算出来的就是你实际赋值的数组大小。
char arr6 [] = "abc"; //没有定义元素个数,用双引号定义3个字符,末尾数组会自动加上结束标志(\0) char arr7 [10] = "abc"; //定义10个元素个数,用双引号赋值三个字符串,其余7个元素均自动定义为\0 char arr8 [10] = {'a', 'b', 'c'}; //定义10个元素个数,用大括号和单引号赋值三个字符串,则数组只含有三个字符,剩余7个均为\0 char arr10 [] = {'a', 'b', 'c'}; //没有定义元素个数,用大括号定义字符串,数组的元素个数则只有三个,结尾没有数组结束标志(\0) int len6 = sizeof(arr6) / sizeof(arr6 [0]); int len7 = sizeof(arr7) / sizeof(arr7 [0]); int len8 = sizeof(arr8) / sizeof(arr8 [0]); int len10 = sizeof(arr10) / sizeof(arr10 [0]); printf("length arr6 = %d\n", len6); printf("length arr7 = %d\n", len7); printf("length arr8 = %d\n", len8); printf("length arr10 = %d\n", len10);
文章图片
注意: 从arr6可以看出,当用sizeof求char类型数组的长度时,如果你没有定义数组长度,那么得出的结果会比实际大小大1。这是因为sizeof吧数组结尾的\0也算了进去。
从arr7和arr8可以看出,如果定义了数组大小,跟int类型一样,不管怎么定义,定义了多少,结果都是你定义的那个数组大小。
从arr10可以看出,如果你输入数组时用了大括号赋值,并且在结尾没有手动输入\0,那么算出的结果就是实际赋值的个数。
总结:
- 定义数组时,要先明确数组的类型(int还是char或者其他类型)。
- sizeof不能用来计算已经定义好长度的数组的数组长度(如int arr[10] = {0},不能有中括号里的10)。
- strlen不能用来计算int类型的数组长度。
- int型计算数组长度,最好用 sizeof(arr) / sizeof(arr[0]) 来计算数组长度。
- char型数组如果要计算数组长度,一定要用双引号赋值。
- char型数组如果要用大括号赋值,一定要注意数组最后是否需要结束标志 \0
推荐阅读
- vue在取对象长度length时候出现undefined的解决
- 如果值是字符串数组,则Worpdress元查询不起作用
- 历史上的今天|【历史上的今天】6 月 2 日(苹果推出了 Swift 编程语言;电信收购联通 C 网;OS X Yosemite 发布)
- #yyds干货盘点#数组中第K小的数字
- 详解python如何通过numpy数组处理图像
- #yyds干货盘点#C语言程序编译与预处理
- 多宿主语言跨平台平部署的开源图形化脚本语言-OpenBlock
- xp系统语言栏消失勾选桌面显示语言栏仍然不显示怎样处理办法
- #yyds干货盘点# C语言自定义类型的介绍(结构体,枚举,联合体,位段)
- JavaSE|一维数组练习