【嵌入式C语言】04.一维数组+二维数组
一、一维数组1.作用需要保存大量的类型相同的数据比如保存全班同学的成绩2.定义数组类型名 数组名[数组元素个数]任何合法的C语言类型都可以定义成数组char buf[10]; //最多可以存放10个字符int buf1[50]; //最多可以存放50个整数3.数组的初始化以及赋值写法一 int a[5]{45,85,74,96,63}; //列表初始化char b[10]hello;写法二 int a[5]{45,25}; //部分初始化其它没有初始化的都是0可以用于数组的清空char b[10]{h,e,l,l,o};写法三 int a[]{85,96}; //[]不写元素个数(省略[]里面的数字)只能在定义数组的时候立马初始化才可以char b[]world;写法四 int a[]; //错误写法a[0]78;写法五 int a[3]; //定义了数组但是没有初始化a[3]88; //数组越界了下标0--2写法六 把数组前面50个元素初始化为100后面50个初始化为200int b[100]{[0 ... 49]100, [50 ... 99]200};注意...左右两边必须要有空格数组可以用变量来表示元素总个数4.数组元素的下标从0开始,使用的时候不要越界数组越界的危害(容易引起段错误)int a[10]; //下标范围0--9之间第一种往前越界a[-2]; //访问a[0]前面8个字节的地址里面的数据第二种往后越界a[11]; //访问a[9]后面8个字节的地址里面的数据段错误segment fault由于程序员在代码中访问了非法地址导致的(经常见于指针没有初始化数组越界)5.数组的存储数组在计算机中是连续存储(数组元素的地址是紧挨着的)6.数组的大小sizeof(); //求任何类型数据的大小strlen(); //专门用来求字符串的实际长度#includesize_t strlen(const char *s);返回值字符串的实际长度参数s --》你要计算长度的字符串原理计算字符串实际长度遇到\0认为字符串结束了strlen求字符串的长度不计算\0C语言是如何存储字符串字符串的结尾有个结束标记结束标记叫做\0\0是个字符ASCII码值是0总结第一sizeof是运算符 strlen是个函数第二sizeof适用范围广 strlen只能求字符串的实际长度第三sizeof求字符串的长度会把\0算上7.空字符串A和A的区别char buf[10]; //空字符串a; //字符a 单个字符a; //字符串a a和\08.char类型数组重复使用清空数组8.1 char类型数组重复使用char buf[10];while(1){scanf(%s,buf); //假如第一次输入的字符串长一点下一次输入的字符串短一点scanf都会自动帮你在字符串后面添加\0保存到buf中短一点的字符串覆盖长字符串的前面部分并且有个\0在后面(容易忽略)——》遇到\0停止打印看不到后面没有覆盖的那一部分长的会直接把短的覆盖完——》scanf都会自动帮你在字符串后面添加\0}8.2 清空数组数组先清空后使用(数组不清空,里面是随机数)写法一#includevoid bzero(void *s, size_t n); //把数组元素全部填充为0参数: s --》数组名n --》数组的大小写法二int buf[10]{0}; //部分初始化的原理其他没有初始化的默认都是0把数组清零char buf[5]{0}; //部分初始化的原理其他没有初始化的默认都是0把数组清零清空数组的方法9.字符串和字符数组的区别核心区别字符数组只是一块连续的内存用来存字符没有强制的结束标志。字符串是以\0ASCII 值为 0 的字符作为结束标志的字符数组。所以只有当字符数组的末尾有\0时它才是字符串才能用strlen、strcpy这类字符串函数操作。二、二维数组1.作用int a[5][6]; //行列存放整数有5行每一行最多可以存放6个整数总共可以存放30个整数应用例子:2048游戏char b[5][10]; //可以存放5个字符串每个字符串的最大长度不能超过10个字节用来保存多个字符串2.定义二维数组类型名 数组名[行数][列数]任何合法的C语言类型都可以定义成二维数组char buf[10][20]; //最多存放10个字符串,每个字符串的长度不能超过20个字符int buf1[50][50]; //50行整数每一行最多50个整数3.二维数组的初始化以及赋值写法一int a[5][6]{45,78,96}; //部分初始化正确char b[3][10]{hello,world,gec};写法二int a[][6]{89,9}; //正确char b[][10]{hello,world,gec}; //正确int a[][]{89,9}; //错误int a[5][]{89,9}; //错误C 语言允许在初始化时省略第一维的大小编译器会根据初始化列表自动推断。写法三int a[5][6]{{5},{8,9},{89,63}}; //正确,分组初始化//分组初始化必须从左到右连续(花括号不要跳跃)int a[5][6]{{5},8,9,{89,63}}; //错误的写法不满足从左到右连续(花括号中间跳跃了)char b[3][10]{{h,e,l,l,o},{g,e,c}}写法四int a[5][6]; //分别赋值a[0][0]99;a[1][2]67;char b[3][10];b[0][1]h;初始化 vs 赋值本质区别在 C 语言中初始化和赋值是两种完全不同的机制区别体现在以下几个方面对比维度初始化赋值发生时机变量定义时变量定义之后的任何时刻语法性质属于定义语句的一部分属于可执行语句表达式语句操作对象变量首次获得初值变量改变已有值对数组整体允许如 char a[10] fhello;不允许a hello非法对结构体整体允许如 struct S s {1,2};不允许除非用复合字面量或逐个成员底层实现编译器在变量生命周期开始前静态或栈上布置好值运行时通过指令拷贝数据4.数组元素的下标行和列都是从0开始,使用的时候不要越界5.二维数组的存储二维数组在计算机中是连续存储(数组元素的地址是紧挨着的)二维数组你可以把它看作是特殊的一维数组(可以把二维数组拆分成多个一维数组)6.二维数组的大小情况一两个下标都有int a[5][6]; //公式行*列*sizeof(类型)情况二少了行下标笔试题常考int a[][6]{78,96}; //依据初始化列表中值的个数确定有几行列数必须写行数自动算元素除不尽行数向上添空着补 0 填