深入浅出数组

张开发
2026/5/6 4:00:15 15 分钟阅读
深入浅出数组
目录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 **练习1多个字符从两端移动向中间汇聚**11.1.1 讲解算法原理11.1.2 代码实现11.2 二分查找11.2.1 讲解算法原理11.2.2 代码演示1.数组的概念数组是一组相同元素的集合数组中存放的是一个或者多个数据 但是数组的元素不能是0。数组中存放的多个数据类型是相同的2.一维数组的创建和初始化2.1 数组创建一维数组的创建的基本语法如下type arr_name[常量值]存放在数组中的值叫做数组的元素数组在创建的时候可以指定数组的大小和数组元素的类型。type指定的是数组中存放数据的类型可以是char , short , long long , int等也可以是自定义类型。arr_name指定的是数组的名字起名字尽量做到见名知其意。[]中的常量值是用来指定数组的大小的。charch[10];intarr[10];doublescore[10];2.2 数组的初始化数组的初始化一般使用大括号数组如果进行了初始化数组的大小一般可以忽略的。//完全初始化intarr[5]{1,2,3,4,5};//不完全初始化intarr1[5]{1};//第一个元素初始化为1,剩余4个元素默认初始化为0//错误的初始化 - 初始化太多intarr2[5]{1,2,3,4,5,6};2.3 数组的类型数组算是一种自定义类型去掉数组名留下的就是数组的类型intarr[10];charch[5];doublea[6];数组arr的类型就是int [10]数组ch的类型就是char [5]数组a的类型就是double [6]3.一维数组的使用3.1 数组下标数组的下标如下intarr[10]{1,2,3,4,5,67,8,9};//下标 0 1 2 3 4 5 6 7 8数组元素对应的下标就为数组元素对应位置 - 1 下标就相当于数组元素的编号。在C语言中对数组的访问提供了一个操作符[]这个操作符叫做下标引用操作符。#includestdio.hintmain(){intarr[10]{1,2,3,4,5,6,7,8,9,10};//如果我们想要访问下标为3的元素就可以这样printf(%d ,arr[3]);//4return0;}3.2 数组元素的打印数组元素的打印只需要产生数组元素对应的下标这样就可以使用for循环来访问数组元素的下标。#includestdio.hintmain(){intarr[10]{1,2,3,4,5,6,7,8,9,10};for(inti0;i10;i)printf(%d ,arr[i]);return0;}3.3 数组的输入数组元素的输入如下4.一维数组在内存中的存储从图中可以得到结论数组随着下标的增长地址是由小到大变化的每个相邻的元素之间相差4因为一个整型4个字节数组在内存中是连续存放的5.sizeof 计算数组元素的大小如果以后想计算数组的大小代码如下intszsizeof(arr)/sizeof(arr[0]);6.二维数组的创建6.1 二维数组的概念一维数组的元素都是内置类型的如果我们把一维数组看作数组的元素这时候就是二维数组。6.2 二维数组的创建如何定义二维数组语法如下type arr_name[常量值1][常量值2];eg:intarr[3][5];解释上述代码的信息3 表示数组有三行5 表示数组又五列int 表示数组的每个元素是整型类型arr 是数组名7. 二维数组的初始化7.1 不完全初始化intarr[3][5]{1,2};7.2 完全初始化intarr3[3][5]{1,2,3,4,5,2,3,4,5,6,3,4,5,6,7};7.3 按照行初始化intarr4[3][5]{{1,2},{3,4},{5,6}};7.4 初始化时可以省略行不能省略列intarr1[][5]{1,2,3}intarr2[][5]{1,2,3,4,5,6}intarr3[][5]{{1,2},{4,5},{5,6}};8.二维数组的使用8.1 二维数组的下标C语言规定二维数组的行是从0开始的列也是从0开始的intarr[3][5]{1,2,3,4,5,2,3,4,5,6,3,4,5,6,7};8.2 二维数组的输入和输出访问二维数组跟访问一维数组一样都要使用for循环来进行遍历9.二维数组在内存中的存储通过上述图片每一行数组元素内部是相邻的地址相差4个字节跨行元素之间也相差4个字节说明二维数组中的每个元素都是连续存放的。10.C99中的变长数组C99中给⼀个变⻓数组(variable-length array简称 VLA)的新特性允许我们可以使用变量指定数组⼤⼩。intmain(){intn;scanf(%d,n);intarr[n];}上⾯⽰例中数组arr就是变⻓数组它的⻓度取决于变量 n 的值编译器没法事先确定只有运⾏时才能知道 n 是多少。变长数组的根本特征就是数组长度只有运行时才能确定所以变长数组不能初始化。11. 数组练习11.1练习1多个字符从两端移动向中间汇聚11.1.1 讲解算法原理//welcome to bit!!!!!!//w##################!//we################!!//wel##############!!!//welo############!!!!我们需要两个字符数组char arr1[] welcome to bit!!!!!! , char arr2[] ###########创建变量left与right指向数组的首位与末尾运用while循环循环结束的条件是left right11.1.2 代码实现#includestdio.h#includestring.h#includewindows.hintmain(){chararr1[]welcome to bit!!!!!!;chararr2[]####################;size_tleft0;size_trightstrlen(arr1)-1;//是用strlen函数要包含头文件string.hwhile(leftright){arr2[left]arr1[left];arr2[right]arr1[right];printf(%s\n,arr2);//休眠1秒//单位是毫秒Sleep(1000);//使用Sleep库函数包含头文件windows.hleft;right--;}return0;}11.2 二分查找二分查找也叫折半查找题⽬给定⼀个升序的整型数组在这个数组中查找到指定的值n找到了就打印n的下标找不到就打印“找不到”。11.2.1 讲解算法原理创建两个变量一个left,一个rightleft指向数组首项right指向数组末项。mid用来计算arr[left]与arr[right]的平均值。判断arr[mid]与key的大小如果arr[mid]比key大则right mid - 1,反之left mid 1。第二步需要使用while循环 循环结束的条件是left right11.2.2 代码演示#includestdio.hintmain(){intarr[12]{2,5,8,12,16,23,38,45,56,67,78,89};intleft0;intrightsizeof(arr)/sizeof(arr[0])-1;intkey0;scanf(%d,key);while(leftright){intmid(leftright)/2;if(arr[mid]key)rightmid-1;elseif(arr[mid]key)leftmid1;else{printf(%d\n,mid);break;//找到的话及时跳出循环}}if(leftright)//没找到的情况printf(没找到\n);return0;}求中间元素的下标尽量使用left (right - left ) / 2,这样的话防止left或者right太大超出范围。

更多文章