C语言:数组详解

张开发
2026/4/20 12:46:26 15 分钟阅读

分享文章

C语言:数组详解
C语言数组详解一.数组的基本概念1.基本概念2.主要特性3.基本操作二.数组的创建、初始化与类型1.一维数组的创建2.一维数组的初始化3.数组的类型4.一维数组的常见操作一维数组下标一维数组元素的打印一维数组的输入与输出5.一维数组的内存结构三.多维数组1.基本概念2.二维数组的创建3.二维数组的初始化4.二维数组的常见操作二维数组下标二维数组元素的打印二维数组的输入与输出5.二维数组的内存结构四.实战演练1.多个字符从两端移动向中间汇聚2.二分查找一.数组的基本概念1.基本概念数组是 C 语言中用于存储相同数据类型的多个元素的集合这些元素在内存中占据连续的存储区域。2.主要特性连续存储数组里的元素在内存中是挨着存放的元素在内存中依次排列地址递增这使得通过索引能快速访问任意元素。固定长度一般而言数组在创建时就需要确定其长度而且这个长度后续通常不能改变。相同数据类型数组中的所有元素都必须是同一种数据类型例如整数int、long等或者浮点数float、double等。3.基本操作访问元素借助索引可以直接访问数组中的元素。索引一般从0开始比如ass[0]指的就是第一个元素。修改元素可以通过索引来更新数组中某个位置的元素值例如ass[2] 10。遍历元素能够使用循环像for循环来依次处理数组里的每一个元素。二.数组的创建、初始化与类型1.一维数组的创建一维数组创建的基本语法type ass_name[常量值];类型 数组名其中type指的是数组的类型例如int、char、float等也可以自定义类型ass_name指的是数组的名字可以根据情况取有意义的名字常量值是用来指定数组的大小示例inthuman[200];floathhh[123];2.一维数组的初始化数组在创建时需要给定一定的初始值。//完全初始化intass[6]{1,2,3,4,5,6};//不完全初始化intass[5]{1};//第一个元素初始化为1剩下未初始化元素默认初始化为0//错误的初始化intass[5]{1,2,3,4,5,6};//初始化项太多3.数组的类型去掉数组名留下的就是数组的类型例如intass_aaaa[7];intass_bbbb[11];intass_cccc[98];ass_aaaa数组的类型是int [7]ass_bbbb数组的类型是int [11]ass_cccc数组的类型是int [98]4.一维数组的常见操作一维数组下标数组下标也称为索引是用于访问数组中特定元素的整数值数组下标从 0 开始即第一个元素的下标为 0第二个元素下标为 1依此类推。示例intass[3]{10,20,30};printf(第一个元素: %d\n,arr[0]);//输出: 10printf(第二个元素: %d\n,arr[1]);//输出: 20一维数组元素的打印使用for循环产生0~9的下标然后访问下标即可示例#includestdio.hintmain(){intass[10]{1,2,3,4,5,6,7,8,9,10};for(inti0;i10;i){printf(%d ,ass[i]);//输出1 2 3 4 5 6 7 8 9 10}return0;}一维数组的输入与输出与scanf函数结合实现输入与输出自己想要的数组。示例#includestdio.hintmain(){intass[10]{1,2,3,4,5,6,7,8,9,10};for(inti0;i10;i){scanf(%d,ass[i]);}for(inti0;i10;i){printf(%d ,ass[i]);}return0;}运行结果5.一维数组的内存结构在计算机内存里一维数组是线性存储的也就是说数组的各个元素会依次存放在连续的内存位置中。其内存结构特点1.连续存储数组的所有元素会被存放在一段连续的内存空间里。例如一个包含 5 个整数的数组会按顺序占据 5 个相邻的整数存储单元。2.固定大小在大多数编程语言中数组一旦创建其大小就固定不变了。这意味着数组所占用的内存空间在创建时就已经确定。3.单一数据类型数组的所有元素都必须是同一种数据类型像整数、浮点数或者对象引用等。这保证了每个元素占用的内存空间是一样的。4.访问效率高由于可以直接通过索引计算出元素的内存地址所以数组支持随机访问访问速度很快。示例#includestdio.hintmain(){intass[5]{1,2,3,4,5};for(inti0;i5;i){printf(ass[%d]%p\n,i,ass[i]);}return0;}运行结果由数组基地址后面几个数字可知相邻地址相差4个字节例如ass[0]到ass[1]差4个字节。注意:数组的索引一般是从 0 开始的这和内存地址的偏移量计算方式是相符的。不同编程语言的数组实现方式可能存在差异例如 Python 的列表实际上是动态数组它在底层会维护一个指向元素的指针数组。理解数组的内存结构有助于高效地使用数组避免像越界访问这类内存错误。三.多维数组1.基本概念多维数组是一种将数据组织成多个维度的表格或立方体结构的方式它允许你存储和操作更高维度的数据。定义与维度一维数组线性排列的元素集合如 [1, 2, 3, 4]。二维数组由行和列构成的矩阵类似表格。三维数组可视为 “页面” 的集合每个页面是一个二维数组。更高维度理论上可以有任意维度如四维、五维但实际中很少超过三维。……2.二维数组的创建二维数组创建的基本语法type ass_name[常量值1][常量值2] 类型 数组名 行 列3.二维数组的初始化二维数组的初始化方式与一维数组的初始化大致一样。完全初始化int ass[2][3] {1,2,3, 4,5,6};下标 如ass[0][0]1 01201231456按照行和列初始化int ass[2][3] {{1,2,3},{4,5,6}};下标01201231456不完全初始化int ass[][3] {1364};//二维数组初始化时可以省略行但是不能省略列下标01201361400……0004.二维数组的常见操作二维数组下标二维数组可以看作是由行和列构成的表格。要访问二维数组里的特定元素就需要使用两个下标分别对应元素所在的行和列。基本概念二维数组本质上是数组的数组。以arr[m][n]为例它表示有m行n列的数组。下标行和列的下标一般都是从0开始的。也就是说第一行的下标是0第一列的下标同样是0。元素访问访问二维数组中位于第i行第j列的元素语法格式为arr[i][j]。二维数组元素的打印与一维数组元打印的方式原理同样先使用for产生二维数组各个下标然后访问各个下标。示例#includestdio.hintmain(){// 创建一个 3x4 的二维数组intarr[3][4]{{1,2,3,4},{5,6,7,8},{9,10,11,12}};// 遍历二维数组并打印所有元素printf(二维数组的所有元素:\n);for(inti0;i3;i){for(intj0;j4;j){printf(%d\t,arr[i][j]);}printf(\n);}// 访问并打印第2行第3列的元素printf(第2行第3列的元素是: %d\n,arr[1][2]);return0;}二维数组的输入与输出与scanf函数结合实现输入与输出自己想要的数组。示例intmain(){intr0,c0,rows0,cols0;intass[100][100]{};printf(输入行和列);scanf(%d %d,rows,cols);printf(依次输入二维数组元素\n);for(r0;rrows;r){for(c0;ccols;c){scanf(%d,ass[r][c]);}printf(\n);}for(r0;rrows;r){for(c0;ccols;c){printf(%d\t,ass[r][c]);}printf(\n);}return0;}5.二维数组的内存结构首先让我们先打印一组二维数组的地址由上面程序运行结果可见二维数组中每个元素的内存存放跟一维数组是一样的都是连续存放四.实战演练1.多个字符从两端移动向中间汇聚代码如下#includestdio.hintmain(){chararr1[]welcome to bit...;chararr2[]#################;intleft0;intrightstrlen(arr1)-1;printf(%s\n,arr2);while(leftright){Sleep(1000);//使每个打印时间间隔为1000毫秒arr2[left]arr1[left];arr2[right]arr1[right];left;right--;printf(%s\n,arr2);}return0;}运行结果2.二分查找给定一个升序的整型数组在这个数组中查找到指定的值n找到了就打印n的下标找不到就打印“找不到”。代码如下#includestdio.hintmain(){intarr[]{1,2,3,4,5,6,7,8,9,10};intleft0;intrightsizeof(arr)/sizeof(arr[0])-1;intkey7;//要找的数字intmid0;//记录中间元素的下标intfind0;while(leftright){mid(leftright)/2;if(arr[mid]key){rightmid-1;}elseif(arr[mid]key){leftmid1;}else{find1;break;}}if(1find)printf(找到了,下标是%d\n,mid);elseprintf(找不到\n);return0;}运行结果:学而不思则罔思而不学则殆。

更多文章