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};//定义了元素个数,且给所有元素均赋值

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个元素均自动定义为\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能计算变量或者数据类型所占用的内存(以字节为单位)。用sizeof计算数组长度时,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,那么算出的结果就是实际赋值的个数。

总结:

  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语言数组长度的计算方法的文章就介绍到这了,更多相关C语言数组长度计算方法内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C语言获取数组长度的几种方法

    如何通过编程的手段获取某个数组的长度呢? 答案是使用关键字 sizeof. 前面说过,用 sizeof 可以获得数据类型或变量在内存中所占的字节数.同样,用 sizeof 也可以获得整个数组在内存中所占的字节数.因为数组中每个元素的类型都是一样的,在内存中所占的字节数都是相同的,所以总的字节数除以一个元素所占的字节数就是数组的长度. 那么如何用 sizeof 获得数组总的字节数呢?只要对数组名使用 sizeof,求出的就是该数组总的字节数.下面写一个程序看一下: # include <stdio

  • C语言安全之数组长度与指针实例解析

    1.C语言编码需要保证变长数组的长度参数位于合法范围之内 例如以下代码: void func(size_t s) { int vla[s]; /*...*/ } /*...*/ func(size); /*...*/ 解决方案如下: enum {MAX_ARRAY = 1024}; void func(size_t s) { if(s < MAX_ARRAY && s != 0) { int vla[s]; /*...*/ } else { //错误处理 } } /*...*/ fu

  • C语言数组长度的计算方法实例总结(sizeof与strlen)

    目录 前言 1. 数组的创建 2. 求解数组的长度 注意: 总结: 前言 最近在重新学习C语言,学习中发现之前对数组长度的计算方法模糊不清.因此做个总结. 首先要明白什么是数组. 数组是一组相同类型元素的集合. 因此,要定义一个数组,首先要确定数组内的元素是同一种类型. 1. 数组的创建 首先来看看常用的数组的创建形式 int型 int arr1 [10] = {0};//定义了元素个数,且给第一个元素赋值为0,则其他元素均为0 通过VS调试中的监视功能,可以看到各个数组的存放结果. int a

  • GO语言数组和切片实例详解

    本文实例讲述了GO语言数组和切片的用法.分享给大家供大家参考.具体分析如下: 一.数组 与其他大多数语言类似,Go语言的数组也是一个元素类型相同的定长的序列. (1)数组的创建. 数组有3种创建方式:[length]Type .[N]Type{value1, value2, ... , valueN}.[...]Type{value1, value2, ... , valueN} 如下: 复制代码 代码如下: func test5() {     var iarray1 [5]int32    

  • php获取数组长度的方法(有实例)

    在php中获取数组长度方法很简单,php为我们提供了两个函数可以计算一维数组长度,如count,sizeof都可以直接统计数组长度哦,下面我们来看几个实例吧.php如何获取数组的长度,使用php函数count(),或是sizeof()例如: 复制代码 代码如下: $arr = Array('0','1','2','3','4'); echo count($arr);// 输出 5$arr = array('A','B','C');echo sizeof($arr);//输出3 sizeof()和

  • Python 找出出现次数超过数组长度一半的元素实例

    利用问题的普遍性和特殊性来求解, 代码如下: import unittest from datetime import datetime class GetFreqNumbersFromList(unittest.TestCase): def setUp(self): print("\n") self.start_time = datetime.now() print(f"{self._testMethodName} start: {self.start_time}"

  • R语言数组实例用法及知识点总结

    数组是可以在两个以上维度中存储数据的R数据对象. 例如 - 如果我们创建一个维度(2,3,4)的数组,则它创建4个矩形矩阵,每个矩阵具有2行和3列. 数组只能存储数据类型. 使用array()函数创建数组. 它使用向量作为输入,并使用dim参数中的值创建数组. 例 以下示例创建一个由两个3x3矩阵组成的数组,每个矩阵具有3行和3列. # Create two vectors of different lengths. vector1 <- c(5,9,3) vector2 <- c(10,11

  • C语言数组实现三子棋应用实例

    本文实例为大家分享了C语言数组实现三子棋应用的具体代码,供大家参考,具体内容如下 三子棋:(拆分部分如下) test.c 测试游戏逻辑 game.h关于游戏相关的函数声明,符号声明 头文件的包含 game.c游戏相关函数的实现 游戏进行的过程:(4种) 1.玩家获胜--*(游戏结束) 2.电脑获胜--#(游戏结束) 3.平局--Q(游戏结束) 4.游戏继续--C IsWin函数 用来判断游戏的状态 game.c #include"game.h" #include<stdio.h&

  • Go语言获取数组长度的方法

    本文实例讲述了Go语言获取数组长度的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: // getting the length of an array is silly, because the length is part of the array's static type myArray := [3]int{1, 2, 3} fmt.Println(len(myArray)) // prints 3 // getting the length of a slice m

  • Java 数组分析及简单实例

    Java 数组  一.什么是数组 数组?什么是数组?在我印象中的数组是应该这样的:通过new关键字创建并组装他们,通过使用整形索引值访问它的元素,并且它的尺寸是不可变的! 但是这只是数组的最表面的东西!深一点?就是这样:数组是一个简单的复合数据类型,它是一系列有序数据的集合,它当中的每一个数据都具有相同的数据类型,我们通过数组名加上一个不会越界下标值来唯一确定数组中的元素. 还有更深的,那就是数组是一个特殊的对象!!(对于这个LZ理解的不是很好,对JVM也没有看,所以见解有限). 不管在其他语言

  • js数组常见操作及数组与字符串相互转化实例详解

    本文实例讲述了js数组常见操作及数组与字符串相互转化方法.分享给大家供大家参考,具体如下: 数组与字符串的相互转化 <script type="text/javascript"> var obj="new1abcdefg".replace(/(.)(?=[^$])/g,"$1,").split(","); //字符串转化为数组 var obj2 = "new2abcdefg".split(&qu

随机推荐