C语言入门,数组知识讲解 📅 发布时间:2026/8/25 12:41:02 👁 浏览次数: 目录前言1.数组的概念2.一维数组的初始化和创建1.数组创建2.数组的初始化3.数组的类型3.一维数组的使用1.数组下标2.数组元素的打印3.数组的输入4.一维数组在内存中的存储5.sizeof 计算数组元素个数6.二维数组的创建1.二维数组的概念2.二维数组的创建7.二维数组的初始化1.不完全初始化2.完全初始化3.按照行初始化4.初始化时可以省略行不能省略列8.二维数组的使用1.二维数组的下标2.二维数组的输入和输出9.二维数组在内存中的存储10.C99中的变长数组11.练习总结前言数组是C语言中最重要的数据结构之一它让我们能够高效地存储和管理大量同类型数据。无论是简单的数据集合还是复杂的矩阵运算数组都扮演着基础而关键的角色。本文将系统讲解C语言中一维数组和二维数组的核心概念、创建、初始化、使用及内存存储方式并通过实际代码示例帮助您彻底掌握数组的方方面面。1.数组的概念数组是一组相同数据类型的元素构成的集合。数组元素个数不能为0常见的数组是一维数组和多维数组多维数组中二维数组最为常见。2.一维数组的初始化和创建1.数组创建一维数组的语法形式如下type arr_name[常量值];//type表示存放在数组内元素的类型如int、char...还可以是自定义类型//arr_name表示数组的名字取名要有意义//常量值为数组内可以存放元素的个数根据实际情况定例如intmath[20];charinput[5];2.数组的初始化有时候在创建数组时我们需要对数组去初始化一些值。那么怎么初始化数组的值呢数组的初始化一般用花括号将初始值放在括号里面。演示intarr1[5]{1,2,3,4,5};//完全初始化//不完全初始化intarr2[6]{1};//第一个元素初始化为1其余元素默认初始化为0//错误初始化intarr3[3]{1,2,3,4};//初始化的元素个数超过规定元素个数3.数组的类型前面说了数组元素的类型现在来说一下数组的类型去掉数组名留下的类型就是数组的类型演示intarr1[1];//数组类型为 int [1]3.一维数组的使用1.数组下标在C语言中数组内每个元素都有对应的下标相当于元素在数组内的编号下标从0开始。假如数组有n个元素最后一个元素的下标为n-1[ ]为下标引用操作符通过该操作符对数组内任意下标进行访问。如arr1[3]可以对下标为3的元素进行访问根据上图访问结果得到为4。2.数组元素的打印如果想访问整个数组的内容怎么办只需要产生所有元素对印的下标就行通过for循环可以轻松实现。演示#includestdio.hintmain(){intarr[4]{1,2,3,4};inti0;//存储下标的变量//依次将数据打印出来for(i0;i4;i){printf(%d ,arr[i]);}return0;}输出的结果3.数组的输入学习了数组的访问我们也想要自己输入一些数据给数组演示#includestdio.hintmain(){intarr[4]{1,2,3,4};inti0;//存储下标的变量//输入for(i0;i4;i){scanf(%d,arr[i]);//由于输入的是数组内的元素所以要加}//依次将数据打印出来for(i0;i4;i){printf(%d ,arr[i]);}return0;}输出的结果4.一维数组在内存中的存储简单了解完一维数组最好能够深入了解一下一维数组在内存中的存储。依次打印数组内每个元素的地址#includestdio.hintmain(){intarr1[8]{0};//初始化inti0;for(i0;i8;i){printf(arr1[%d]%d\n,i,arr1[i]);}return0;}输出的结果根据输出的结果分析数组下标递增元素地址也随之变大每相邻两个数组元素之间相差4因为一个整型是4个字节得出结论数组在内存中是连续存放的。5.sizeof 计算数组元素个数在C语言中怎么样用程序计算数组内元素个数这里要用到sizeof在之前我们曾经使用sizeof来计算类型或变量大小其实它也可以计算数组的大小。演示#includestdio.hintmain(){intarr1[5]{0};printf(%d\n,sizeof(arr1));//计算数组的总长度printf(%d\n,sizeof(arr1[0]));//数组内元素类型相同计算出一个元素的长度printf(%d\n,sizeof(arr1)/sizeof(arr1[0]));//数组元素个数数组总长度/数组内一个元素的长度return0;}输出的结果单位字节以后写数组内元素个数可以用这个来替代代码更为灵活。6.二维数组的创建1.二维数组的概念在一维数组的基础上将一维数组视为数组内一个元素此时构成的数组就是二维数组。多维数组以此类推如图3个一维数组构成了一个二维数组2.二维数组的创建二维数组语法形式type arr_name[常量1][常量2];例intarr1[3][5]// 3表示数组有3行5表示每一行有5个元素// int表示数组内元素的类型arr1是数组名7.二维数组的初始化1.不完全初始化#includestdio.hintmain(){intarr1[3][5]{1,2};intarr2[3][5]{0};return0;}输出的结果2.完全初始化#includestdio.hintmain(){intarr3[3][5]{1,2,3,4,5,2,3,4,5,6,3,4,5,6,7};return0;}输出的结果3.按照行初始化#includestdio.hintmain(){intarr4[3][5]{{1,2},{3,4},{5,6}};return0;}输出的结果4.初始化时可以省略行不能省略列#includestdio.hintmain(){intarr5[][5]{1,2,3};intarr6[][5]{1,2,3,4,5,6,7};intarr7[][5]{{1,2},{3,4},{5,6}};return0;}输出的结果8.二维数组的使用1.二维数组的下标C语言规定二维数组的行和列都是从0开始的跟在平面直角坐标系上找坐标类似演示#includestdio.hintmain(){intarr3[3][5]{1,2,3,4,5,2,3,4,5,6,3,4,5,6,7};printf(%d\n,arr3[2][4]);return0;}对应数组中第2行第4列arr3[3][5]结果为7。2.二维数组的输入和输出如何访问整个二维数组的内容演示#includestdio.hintmain(){intarr[3][5]{1,2,3,4,5,2,3,4,5,6,3,4,5,6,7};inti0;//二维数组的行intj0;//二维数组的列//输入for(i0;i3;i){for(j0;j5;j){scanf(%d,arr[i][j]);}}//输出for(i0;i3;i){for(j0;j5;j){printf(%d ,arr[i][j]);}printf(\n);}return0;}输出的结果9.二维数组在内存中的存储打印二维数组内每个元素的地址#includestdio.hintmain(){intarr[3][5]{1,2,3,4,5,2,3,4,5,6,3,4,5,6,7};inti0;//二维数组的行intj0;//二维数组的列//输出for(i0;i3;i){for(j0;j5;j){printf(arr[%d][%d]%d\n,i,j,arr[i][j]);}}return0;}输出的结果从输出的结果来看随着二维数组的行和列的递增地址也随之变大相邻的两个元素和跨行的两个元素都相差4个字节得出结论二维数组的每个元素都是连续存放的。如下图所示10.C99中的变长数组我们在创建数组中无法去预测数组的长度有时候数组大了浪费空间有时候数组小了不够用。我们会想能不能使用变量去指定数组大小变长数组的根本特征就是数组长度只有运行时才能确定所以变长数组不能初始化。它的好处是程序员不必在开发时随意为数组指定一个估计的长度程序可以在运行时为数组分配精确的长度。有⼀个比较迷惑的点变长数组的意思是数组的大小是可以使用变量来指定的在程序运行的时候根据变量的大小来指定数组的元素个数而不是说数组的大小是可变的。数组的大小一旦确定就不能再变化了。遗憾的是在VS2022上虽然支持大部分C99的语法没有支持C99中的变长数组没法测试。11.练习练习1多个字符从两端移动向中间汇聚思路参考代码intmain(){chararr1[]{welcome to IT};chararr2[]{*************};intleft0;//左边开始的下标intrightstrlen(arr1)-1;//或者为sizeof(arr1)/sizeof(arr1[0])-2//分别从最左端和最右端开始每次都想中间移动一位并与arr2对应位置置换直到leftright时说明它们已经相遇交错了置换结束while(leftright){Sleep(1000);//睡眠函数将输出过程变得缓慢便于观察变化arr2[left]arr1[left];arr2[right]arr1[right];left;right--;system(cls);//清理屏幕printf(%s\n,arr2);}return0;}//right的计算//以char arr1abcdef为例//法1//strlen计算的在/0前所有字符的个数//strlen(arr1)6,但arr1最大下标为5故最右边下标strlen(arr1)-1;//法2//元素个数sizeof(arr1)/sizeof(arr1[0]);//arr1的元素个数为7包含末尾的/0;故最右边下标sizeof(arr1)/sizeof(arr1[0])-2;练习2给定一个升序的整型数组在这个数组中查找指定的n,找到了就打印n的下标找不到就打印“找不到”思路1逐一对比参考代码#includestdio.hintmain(){intarr1[]{1,2,3,4,5,6,7,8,9};intn7;//在数组内找7inti0;//下标intszsizeof(arr1)/sizeof(arr1[0])-2;//sz表示最右边下标for(i0;isz;i){if(narr1[i]){printf(%d\n,i);break;}}//跳到这里有两种情况//1.break跳出循环n下标找到//2.isz循环结束说明arr1数组内全部都匹配不上输出找不到if(isz)printf(找不到);return0;}思路2二分查找#includestdio.hintmain(){intarr1[]{1,2,3,4,5,6,7,8,9};intn7;//在数组内找匹配7intleft0;//left表示左边下标intrightsizeof(arr1)/sizeof(arr1[0])-2;//right表示最右边下标//n匹配数组内元素的过程要多次进行,不知道具体次数--while循环while(leftright){intmid(leftright)/2;//mid表示左右下标的中间值if(narr1[mid])//n的值在mid下标的右边{leftmid1;//将mid的左边去掉缩小范围,left下标移至mid1处}elseif(narr1[mid])//n的值在mid下标的左边{rightmid-1;//将mid的右边去掉缩小范围right下标移至mid-1处}else//narr1[mid],找到了{printf(%d,mid);break;//找到了跳出循环}}if(leftright)//leftright说明产生交错了但是没有找到。该步判断可以使用布尔运算或状态改变{printf(找不到);}return0;}总结通过本文的学习我们全面掌握了C语言数组的核心知识一维数组理解了数组的基本概念、创建语法、初始化方式完全/不完全初始化、下标访问机制以及如何在内存中连续存储。二维数组掌握了二维数组作为数组的数组的本质学会了创建、初始化包括按行初始化、下标访问和遍历方法。关键特性数组元素在内存中连续存储使用sizeof计算数组元素个数二维数组可以省略行但不能省略列C99中的变长数组特性实践应用通过字符移动汇聚和二分查找等练习将理论知识转化为实际编程能力。数组是C语言编程的基石熟练掌握数组操作将为学习更复杂的数据结构和算法打下坚实基础。建议读者动手实践文中的代码示例加深对数组内存布局和访问机制的理解。