最近在重新学习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};//定义了元素个数,且给所有元素均赋值

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求解数组长度

strlen是用来求一个字符串(string)的长度,因此strlen不能用来求int类型的数组长度,只能求char类型的数字长度。
具体代码如下:

 char arr6[] = "abc";//没有定义元素个数,用双引号定义3个字符,末尾数组会自动加上结束标志(\0)printf("length arr6 = %d\n", strlen(arr6));char arr7 [10] = "abc";//定义10个元素个数,用双引号赋值三个字符串,其余7个元素均自动定义为\0printf("length arr7 = %d\n", strlen(arr7));char arr8 [10] = {'a', 'b', 'c'};//定义10个元素个数,用大括号和单引号赋值三个字符串,则数组只含有三个字符,剩余7个均为\0printf("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,则其他元素均为0printf("length arr1 = %d\n", strlen(arr1));int arr2 [10] = {1, 2, 3, 4, 5};//定义了元素个数,但只给前五个元素赋值,则后五个元素均为0printf("length arr2 = %d\n", strlen(arr2));int arr4 [10];//什么都不放,编译器会给数组的每个元素放置随机数。printf("length arr4 = %d\n", strlen(arr4));

  • sizeof求解数组长度

sizeof能计算变量或者数据类型所占用的内存(以字节为单位)。用sizeof计算数组长度时,sizeof不关心数组内部存储的是什么类型的数据。
所以常常用 sizeof(arr)/sizeof(arr[0]) 来计算数组的长度。其中“sizeof(arr)“计算了整个数组arr占据了多少内存(字节为单位),”sizeof(arr[0])“计算了数组中第一个元素所占多少字节,两者相除就是数组的长度。

代码如下:

 int arr1 [10] = {0};//定义了元素个数,且给第一个元素赋值为0,则其他元素均为0int arr2 [10] = {1, 2, 3, 4, 5};//定义了元素个数,但只给前五个元素赋值,则后五个元素均为0int 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个元素均自动定义为\0char arr8 [10] = {'a', 'b', 'c'};//定义10个元素个数,用大括号和单引号赋值三个字符串,则数组只含有三个字符,剩余7个均为\0char 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,那么算出的结果就是实际赋值的个数。

总结:

  1. 定义数组时,要先明确数组的类型(int还是char或者其他类型)。
  2. sizeof不能用来计算已经定义好长度的数组的数组长度(如int arr[10] = {0},不能有中括号里的10)。
  3. strlen不能用来计算int类型的数组长度。
  4. int型计算数组长度,最好用 sizeof(arr) / sizeof(arr[0]) 来计算数组长度。
  5. char型数组如果要计算数组长度,一定要用双引号赋值。
  6. char型数组如果要用大括号赋值,一定要注意数组最后是否需要结束标志 \0

C语言中数组长度的计算方法总结(sizeof与strlen)相关推荐

  1. C语言中数组长度的计算方法总结 (sizeof与strlen)

    当我们在学C语言时,要用到关于要用到类似长度的时候,现在有两种选择: 一.strlen 二.sizeof (1)首先我们来说说strlen,如图所示 (1)strlen字符串长度,只找'\0',并且不 ...

  2. c语言中数组长度的计算

    c语言中数组长度的计算 一维数组 计算数组的长度:       sizeof(数组名):得到这个数组占用内存的总长度       公式: sizeof(数组名) / sizeof(数组类型); 二维数 ...

  3. C语言中数组长度的计算详解

    一. C语言中计算数组长度大小 C语言字符串长度的计算可以使用strlen(str); 但是对于数组长度的大小却没有相关函数可以使用: C语言数组长度的大小可以使用: int main() {int ...

  4. c语言不能在函数中求数组大小,C语言中数组长度不能用变量定义吗?

    翻翻过去那场雪 1.C语言中不支持.C++中支持变长数组(你可以自行度娘变长数组和alloca函数),但是因为其实在栈上分配,不被推荐使用.做为解决方案,你可以使用C式的malloc函数或者C++式的 ...

  5. c语言sizeof测量字符组长度,C语言中,当计算字符数组长度时,用sizeof 和strlen 的原理及两者的区别...

    1:定义时用字符初始化 (1)char chs[7] = {'a', 'c', '0', 'z', '3','d'}; // 长度为6 上式等价于: (2)char chs[7] = {'a', 'c ...

  6. c语言字符数组的实际长度,C语言中,当计算字符数组长度时,用sizeof 和strlen 的原理及两者的区别...

    1:定义时用字符初始化 (1)char chs[7] = {'a', 'c', '0', 'z', '3','d'}; // 长度为6 上式等价于: (2)char chs[7] = {'a', 'c ...

  7. C语言中,当计算字符数组长度时,用sizeof 和strlen 的原理及两者的区别

    字符数组的长度计算:必须以终止符'/0'作为边界,但对字符数组赋值时,有两种方式: 1: 定义时用字符初始化 (1)char chs[7] = {'a', 'c', '0', 'z', '3','d' ...

  8. C语言中 定义数组大小时 不能使用变量,编程达人 C语言中数组长度不能用变量定义吗...

    C语言里,所有变量空间都是在程序运行之初向系统申请的,包括指针,除了一些动态申请方式如malloc函数.没有申请的空间系统是不允许读写的.那么如果一个数组大小是变量定义,则在程序运行前不能确定数组大小 ...

  9. 如何确定C语言中数组的大小?

    如何确定C语言中数组的大小? 也就是说,数组可以容纳多少个元素? #1楼 如果您要处理未作为参数接收的数组,则sizeof方法是正确的方法. 作为参数发送给函数的数组被视为指针,因此sizeof将返回 ...

最新文章

  1. String,StringBuffer
  2. 【知识星球】剪枝量化初完结,蒸馏学习又上线
  3. Tinkpad W540 BIOS bug ,中招了,中了一次还送了一次
  4. MyEclipse下Struts2配置使用和Ajax、JSON的配合
  5. 关于 SAP 产品 UI 的搜索引擎优化 SEO - Search Engine Optimization
  6. springmvc如何使用视图解析器_SpringMVC工作原理
  7. 如何在linux环境下安装kvm,如何在Linux发行版上安装和配置KVM和Open vSwitch?
  8. 命令窗 创建vue 项目过程
  9. merge()函数--R语言
  10. 阿里云云计算 43 CDN的使用
  11. layui数据表格增加自动换行后,拖动列宽固定列错乱变形
  12. Wireshark分析SMTP、POP3协议
  13. java抖音字符视频_代码生成抖音文字视频
  14. php页面添加背景图片,css怎么增加背景图片
  15. 扫描文件存电子版方法
  16. Linux三剑客学习笔记
  17. Java面试基础知识,一次哔哩哔哩面试经历
  18. 关于极光推送报错6003的一些问题
  19. Python通过区号和校验位校验身份证号是否合法
  20. 2019全年营收净利润双超预期 微盟开启“飞轮模式”

热门文章

  1. 硬件设计分享-⑩电路设计中静电的防护
  2. 用fastjson将对象的列表转换成json格式,并读写.json文件
  3. Linux查看网关方法
  4. android 气球提示控件,控件Balloons(气球状提示)设计原则
  5. 极客日报:砍价永远差一刀?拼多多法庭上回复:小数点后有6位;微信加入语音消息暂停功能;​谷歌和IBM提议建立关键开源项目清单
  6. 十位互联网一线高工手写Java高级知识,成功入职腾讯
  7. Redis为什么那么快
  8. getshell思路
  9. JavaScript的隐式转换
  10. Vuex和antv/g6实现在线绘制分析流程图功能