文章目录1.数组的概念2.一维数组的创建和初始化2.1数组的创建2.2数组的初始化2.3 数组的类型3.一维数组的使用3.1数组的下标3.2数组元素的打印3.3数组的输入4.一维数组在内存中的储存5.sizeof计算元素的个数6.二维数组的使用6.1 二维数组的概念6.2 二维数组的创建7.二维数组的初始化7.1 不完全初始化7.2 完全初始化7.3 按照行初始化7.4 初始化时行可以省略但是列不能省略8.二维数组的使用8.1 二维数组的下标8.2 二维数组的输入和输出9.二维数组在内存中的存储10.C99中的变长数组11.数组练习11.1 练习111.2 二分法1.数组的概念数组就是相同类型元素的集合我们可以从这句话中得到两个关键点数组是有一个或者多个数据所以数组中的元素不能为0.数组中存放的是相同类型的元素.数组也分为一维数组和多维数组只要是二维数组及以上的数组都称为多维数组2.一维数组的创建和初始化2.1数组的创建一维数组创建的基本语法是type_name[常量值];存放在数组里面的值被称为数组的元素数组可以指定元素的大小和类型type指的是元素的类型比如char、int等name是数组的名称[]中存放的常量值决定了数组的大小和所占内存比如我们像存放20个人的身高数据则intarr[20];2.2数组的初始化数组初始化有多种表达方式intarr[20]{0};//此代表将数组中的元素初始化为0intarr[5]{1,2,3,4,5};//这是完全初始化将数组中的每一个值都初始化intarr[10]{1,2,3,4,5}//这是不完全初始化未被初始化的元素全部默认为初始化值是0intarr[3]{1,2,3,4}这种初始化就是超出数组的范围是错误初始化2.3 数组的类型当然数组也是有类型的数组算是自定义类型去掉数组名剩下的就是数组的类型intarr1[5];chararr2[10];arr1的数组类型是int [5];arr2的数组类型是char[10];3.一维数组的使用我们刚才学习了一些关于一维数组的基本知识点那一维数组到底是怎么样使用的呢让我们再来深入了解3.1数组的下标在C语言中规定数组是要有下标的数组需要输入和输出也是离不开下标的。假设有n个元素那最后一个元素的下标就是n-1具体如下intarr[10]{1,2,3,4,5,6,7,8,9,10}如上图我们可以清晰的看到数组的元素和下标之间的关系。在C语言中为了准确的通过下标找到数组中的元素还提供了一个访问操作符[ ],叫下标引用操作符有了下标引用操作符我们就可以很快找到我们想在数组中找到的元素比如想要访问下标为7的元素就可以写成arr[7]想要访问下标为3的元素就是arr[3]#includestdio.hintmain(){intarr[10]{1,2,3,4,5,6,7,8,9,10};printf(%d\n,arr[3]);printf(%d\n,arr[7]);return0;}3.2数组元素的打印我们想要打印一个数组里的所有元素那我们就需要访问这个数组里所有元素的下标这时我们就需要借助for循环来完成这一工作实现代码如下#includestdio.hintmain(){intarr[]{1,2,3,4,7,8,5,9,3,10};for(inti0;i10;i){printf(%d ,arr[i]);}return0;}3.3数组的输入数组的打印是输出那数组到底支不支持输入呢答案很显然是支持的我们可以按照需求来输入数组中的元素#includestdio.hintmain(){intarr[10]{1,2,3,4,5,6,7,8,9,10};for(inti0;i10;i){scanf(%d,arr[i]);}for(inti0;i10;i){printf(%d ,arr[i]);}return0;}4.一维数组在内存中的储存想要深入了解数组那最好是了解一下一维数组在内存中的储存可以更加清晰地了解和运用一维数组依次打印数组的地址#includestdio.hintmain(){intarr[10]{1,2,3,4,5,6,7,8,9,10};for(inti0;i10;i){printf(arr[%d]%p\n,i,arr[i]);}return0;}我们来看一下输出结果通过输出结果我们可以看到每两个相邻元素之间是差了4个字节一个整形就是4个字节那就可以得到数组在内存中是连续存放的5.sizeof计算元素的个数为了更加快速的得到数组元素的个数在C语言中我们可以用到sizeof这个函数是计算类型或者变量大小的当然用来计算数组的大小也完全没有问题代码如下#includestdio.hintmain(){intarr[10]{0};printf(%d,sizeof(arr));return0;}像这个代码数组中一共有10个元素整形每个元素占四个字节所以数组的长度是40那我们举一反三用sizeof当然也可以得到单个元素的长度#includestdio.hintmain(){intarr[10]{0};printf(%d,sizeof(arr[0]));return0;}有了这些就意味这我们可以用整个数组的长度除以单个元素的长度来得到数组中元素的个数实现代码如下#includestdio.hintmain(){intarr[10]{1,2,3,4,5,6,7,8,9,10};intszsizeof(arr)/sizeof(arr[0]);printf(%d,sz);return0;}6.二维数组的使用6.1 二维数组的概念我们前面学习了一维数组一维数组都是内置类型的。二维数组就是把一维数组当成是数组其中的一个元素。同理三维数组就是把二维数组当成数组中的一个元素。如图所示这是数组元素一维数组和二维数组的区别6.2 二维数组的创建那我们要怎么创建二维数组呢type_name[常量值1][常量值2]{};//例如intarr[3][5];doubledata[5][7];解释上述代码中的各部分3代表三行5代表5列int是元素的类型arr是数组的名称double data同理7.二维数组的初始化在创建一个数组的时候给定一些特殊的值就叫做初始化那二维数组如何初始化呢也是和一维数组一样用大括号初始化7.1 不完全初始化intarr[5]{1,3};//不完全初始化intarr[2][5]{0};//不完全初始化7.2 完全初始化intarr[3][5]{1,2,3,4,5,2,3,4,5,6,5,6,7,8,9};7.3 按照行初始化intarr[3][5]{{1,2},{3,4},{5,6}};7.4 初始化时行可以省略但是列不能省略intarr[][5]{1,234};8.二维数组的使用8.1 二维数组的下标我们已经掌握了二维数组的创建和初始化那我们要怎样使用二维数组呢其实二维数组也是通过下标访问来确定元素的二位数组有行和列确定了行和列之后就能准确的确定数组中的元素。C语言规定二维数组的行和列都是从0开始的这样我们就能快速定位#includestdio.hintmain(){intarr[3][5]{1,2,3,4,5,2,3,4,5,6,5,6,7,8,9};printf(%d,arr[2][3]);return0;}8.2 二维数组的输入和输出我们已经知道了单个元素的具体输出步骤那要整个数组被输入输出又该怎么办呢#includestdio.hintmain(){intarr[3][5]{0};for(inti0;i3;i){for(intj0;j5;j){scanf(%d,arr[i][j]);}}for(inti0;i3;i){for(intj0;j5;j){printf(%d ,arr[i][j]);}printf(\n);}printf(\n);return0;}9.二维数组在内存中的存储像一维数组一样我们也研究一下二维数组在内存中的存储情况来更好的了解和使用二维数组#includestdio.hintmain(){intarr[3][5]{0};for(inti0;i3;i){for(intj0;j5;j){printf(arr[%d][%d]%p\n,i,j,arr[i][j]);}}return0;}从输出结果来看每一行的内部元素都是相连的都相差4个字节也就是一个整形的长度不同行之间也是相差四个字节这说明二维数组中的每一个元素也是连续存放的。10.C99中的变长数组在C99的变长数组出现之前数组的大小只能用常量或者常量表达式来初始化intarr[3];这样虽然也可以使用但是为我们的操作带来了不便不能合理地运用空间C99中的变长数组就允许我们可以用变量来初始化数组的大小intnabintarr[n];上面的事例当中arr就是一个边长数组因为编译器也不知道数组有多大只有在运行的时候才能确定n的值变长数组最大的一个特征就是只有在程序运行的时候才能知道变量的值是多大所以变长数组是不能初始化的这样以来程序员也不需要在编写代码的时候随便估计一个大小用来给程序留够运行空间而是编译器会根据程序运行的大小自动为数组匹配一个合适的值。比较迷惑的一个点就是边长数组的大小是通过变量来指定的而变量只有在程序运行时才知道大小但是一旦确定变量的大小之后就是不能再更改的并不是说变长数字随时都可以改变大小#includestdio.hintmain(){intn0;scanf(%d,n);intarr[n];for(inti0;in;i){scanf(%d,arr[i]);}for(inti0;in;i){printf(%d,arr[i]);}return0;}11.数组练习我们在上一节已经了解了数组的基本知识那现在我们就来用这些知识解决一些具体的问题11.1 练习1将一串字符从两边缓缓地向中间移动#includestdio.hintmain(){charch1[]Welcome to C world!!!!!;charch2[]***********************;intleft0;intrightstrlen(ch2)-1;printf(%s\n,ch2);while(leftright){Sleep(1000);ch2[left]ch1[left];ch2[right]ch1[right];left;right--;printf(%s\n,ch2);}return0;}这个练习只是我们对于数组知识掌握的小测试那接下来我们就开始二分法11.2 二分法在一组升序数组中我们想要查找一个具体的数据我们最先想到的就是遍历法。这样做完全没有问题但是却浪费了升序数组这样一个好的条件。就比如你的朋友说一件商品的价格在100~300之间你总不可能从101开始一直猜到正确的价格。那我们如何让升序数组中的查找变得更加高效呢我们就可以用到二分法。也是折半查找#includestdio.hintmain(){intn66;intarr[]{1,3,4,5,6,7,8,9,66,77,88};intleft0;intmid0;intfind0;intrightsizeof(arr)/sizeof(arr[0]);while(leftright){mid(leftright)/2;if(arr[mid]n){rightmid-1;}elseif(arr[mid]n){leftmid1;}else{find1;break;}}if(find1){printf(找到了下标是%d,mid);}else{printf(未查找到\n);}return0;}OK那数组的基本知识就分享到这里了我们下一次再来用数组的知识解决一下基本的问题