
目标1.掌握一维数组和二维数组的使用2.掌握一维数组和二维数组的数据存放方式数组数组的概念是一组相同类型元素的集合数组元素个数不能是0数组存放的数据类型是相同的数组可以分为一维数组和多维数组多维数组一般比较常见的是二维数组数组的创建type arr_name[常量值];type是数组中存放数据的类型可以是charshortintfloatarr_name是数组名的名字[]中的值是用来指定数组的大小的这个数组的大小是根据实际的需求来指定的数组的初始化//完全初始化int arr[5] {1,2,3,4,5};int arr[] {1,2,3,4,5};//这里数组的大小还是5编译器会根据初始化的内容推算出来//不完全初始化int arr2[6] {1};//第一个元素初始化为1剩余的元素默认初始化为0//错误的初始化 - 初始化项太多int arr3[3] {1, 2, 3, 4};字符数组的初始化可以使用大括号也可以使用字符串但是这两种初始化是有差异的#includestdio.hintmain(){chararr1[] {a,b,c};chararr2[] abc;return0;}arr2的数组中多了一个\0字符。原因在于C语言中的字符是用双引号括起来的一串字符在字符串的末尾会隐藏一个\0字符这个\0字符是字符串的结束标志。此时如果打印arr1打印完abc不会立刻停止会出现乱码这是因为printf函数在使用%s占位符打印字符串的时候从头开始直到出现\0打印才结束。在打印arr2时输出的内容是abc正常结束但是在打印arr1时因为缺少\0字符printf函数会直到找到\0才结束sizeof和strlensizeof是操作符计算操作数所占内存的大小单位是字节strlen是库函数使用时要包含头文件string.h,是求字符串长度的统计的是\0之前字符的个数关注内存中是否有\0,如果没有就可能会越界数组的类型数组算是一种自定义类型数组的类型是去掉数组名留下的intarr1[10];intarr2[12];charch[5];arr1数组的类型是int [10]arr2数组的类型是int [12]ch数组的类型是char [5]数组下标C语言规定数组是有下标的下表是从0开始的假设数组有n个元素最后一个元素的小标就是n-1在C语言中数组的访问提供了一个操作符 []这个操作符叫下标引用操作符。 我们就可以轻松的访问到数组的元素了比如我们访问下标为7的元素我们就可以使用 arr[7] 。数组元素的遍历打印整个数组的内容本质就是要访问所有数组元素的下表就可以了所以我们使用for循环打印#includestdio.hintmain(){intarr[10] {1,2,3,4,5,6,7,8,9,10};inti 0;for(i 0; i 10; i){printf(%d , arr[i]);}return0;}也可以根据需求自己给数组输入想要的数据#includestdio.hintmain(){intarr[10] {1,2,3,4,5,6,7,8,9,10};inti 0;for(i 0; i 10; i){scanf(%d, arr[i]);}for(i 0; i 10; i){printf(%d , arr[i]);}return0;}sizeof计算数组元素个数在遍历数组的时候我们可以使用sizeof来计算数组大小#includestdio.hintmain(){intarr[10] {0};printf(%d\n,sizeof(arr));return0;}这里输出的结果是40计算的是数组所占内存空间的总大小单位是字节。但是我们又知道数组中所有元素的类型都是相同的那只要计算出一个元素所占字节的个数和数组的元素个数就能算出来先计算一个元素的大小#includestdio.hintmain(){intarr[10] {0};printf(%d\n,sizeof(arr[0]));//计算⼀个元素的大小单位是字节return0;}接下来就能计算出数组的元素个数#includestdio.hintmain(){intarr[10] {0};intsz sizeof(arr)/sizeof(arr[0]);printf(%d\n, sz);return0;}这里的结果是10表示数组有10个元素一堆数组在内存中的存储先依次打印一下数组元素的地址来观察一下#includestdio.hintmain(){intarr[10] {1,2,3,4,5,6,7,8,9,10};intsz sizeof(arr)/sizeof(arr[0]);inti 0;for(i 0; i sz; i){printf(arr[%d] %p\n , i, arr[i]);}return0;}输出结果可能不一样arr[0] 00000003BDB1F638arr[1] 00000003BDB1F63Carr[2] 00000003BDB1F640arr[3] 00000003BDB1F644arr[4] 00000003BDB1F648arr[5] 00000003BDB1F64Carr[6] 00000003BDB1F650arr[7] 00000003BDB1F654arr[8] 00000003BDB1F658arr[9] 00000003BDB1F65C从输出的结果可以看到数组随着下标在增长地址是由小到大变化的每两个相邻的元素之间相差4因为一个整型是4个字节所以数组在内存中是连续存放的二维数组的创建前面学习的数组被称为一维数组数组的元素都是内置类型的如果我们把一维数组做为数组的元素这时候就是二维数组而二维数组作为数组元素的数组被称为三维数组。而二维数组以上的数组统称为多维数组。完全初始化intarr3[3][5] {1,2,3,4,5,2,3,4,5,6,3,4,5,6,7};按照行初始化intarr4[3][5] {{1,2},{3,4},{5,6}};初始化时可以省略行但是不能省略列intarr5[][5] {1,2,3};intarr6[][5] {1,2,3,4,5,6,7};intarr7[][5] {{1,2}, {3,4}, {5,6}};二维数组的使用C语言规定二维数组的行是从0开始列也是从0开始的#includestdio.hintmain(){intarr[3][5] {1,2,3,4,5,2,3,4,5,6,3,4,5,6,7};printf(%d\n, arr[2][4]);return0;}1,2,3,4,52,3,4,5,63,4,5,6,7[2][4]第三行第五列所以打印数字7二维数组的输入和输出#includestdio.h//遍历二维数组int main(){int arr[2][3] {0};int i 0;//输入for (i 0; i 2; i){int j 0;for (j 0; j 3; j){scanf(%d, arr[i][j]);}}//输出for (i 0; i 2; i){int j 0;for (j 0; j 3; j){printf(%d , arr[i][j]);}printf(\n);}return 0;}二维数组在内存中的存储int main(){int arr[3][5] {};int i 0;int j 0;for (i 0; i 3; i){for (j 0; j 5; j){printf(arr[%d][%d]%p\n, i, j, arr[i][j]);}}return 0;}打印出来的结果arr[0][0]000000475379F698arr[0][1]000000475379F69Carr[0][2]000000475379F6A0arr[0][3]000000475379F6A4arr[0][4]000000475379F6A8arr[1][0]000000475379F6ACarr[1][1]000000475379F6B0arr[1][2]000000475379F6B4arr[1][3]000000475379F6B8arr[1][4]000000475379F6BCarr[2][0]000000475379F6C0arr[2][1]000000475379F6C4arr[2][2]000000475379F6C8arr[2][3]000000475379F6CCarr[2][4]000000475379F6D0从输出的结果来看每一行内部的每个元素都是相邻的地址之间相差4个字节跨行位置处的两个元素之间也是差4个字节所以二维数组中的每个元素都是连续存放的