二维数组 ゝ一世哀愁。 2022-05-01 13:52 295阅读 0赞 1. 概述 int a\[3\]\[4\]; 总共是12个元素,可以当成3行4列看待,分别是 a\[0\]\[0\] a\[0\]\[1\] a\[0\]\[2\] a\[0\]\[3\] a\[1\]\[0\] a\[1\]\[1\] a\[1\]\[2\] a\[1\]\[3\] a\[2\]\[0\] a\[2\]\[1\] a\[2\]\[2\] a\[2\]\[3\] a\[i\]\[j\] 表示第i+1行,j+1列的元素 int a\[m\]\[n\];该数组右下角最后一个元素是a\[m-1\]\[n-1\] 2. 存储 ![在这里插入图片描述][20190611150245110.png] ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbmdnb25nXzE5OTE_size_16_color_FFFFFF_t_70] 3. 定义 数据类型 数组名\[常量表达式\]\[常量表达式\]; 行号可以省,列号不可以省。 int a\[3\]\[ \] = \{1,2,3,4,5,6\}; //错误!因为存储时按照行存,不知道一行存多少个! int a\[ \]\[2\] = \{1,2,3,4,5,6\}; //正确,6 / 2 = 3是3行 注意: 一维数组的数组名直接付给指针,如int a\[3\]; int \*p=a; 但是二维数组名直接赋给指针就错了,如int a\[3\]\[4\]; int \*p = a; 就是错误的; int (\*p) \[4\] = a; 就对了,4代表二维数组的列数 sizeof(a) = 行数 \* 列数 \* sizeof(数据类型) 得到的是整个二维数组在内存中所占的字节数。 sizeof(a\[0\]) 二维数组中第一行(每一行)在内存中所占有的字节数。 所以行数是sizeof(a) / sizeof(a\[0\]) 列数是sizeof(a\[0\]) / sizeof(a\[0\]\[0\]) 1. 初始化 int a\[3\]\[4\] = \{1,2,3,4,5,6,7,8,9,10,11,12\}; //严重不推荐!! 推荐下面这样写,别忘了最后一个分号! ![在这里插入图片描述][20190611150458892.png] ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbmdnb25nXzE5OTE_size_16_color_FFFFFF_t_70 1] 2. 输入输出-scanf如何防出错 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbmdnb25nXzE5OTE_size_16_color_FFFFFF_t_70 2] ![在这里插入图片描述][20190611150547596.png] 例子1:二维数组求最大值和所在行号列号 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbmdnb25nXzE5OTE_size_16_color_FFFFFF_t_70 3] 例子2:打印杨辉三角的前十行 杨辉三角: (1)它的两条边都是由数字1组成的 (2)每个数字等于上一行的左右两个数字之和。即第n+1行的第i个数等于第n行的第i-1个数和第i个数之和 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbmdnb25nXzE5OTE_size_16_color_FFFFFF_t_70 4] ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbmdnb25nXzE5OTE_size_16_color_FFFFFF_t_70 5] 3. 是否存在多维数组? 不存在,因为内存是线性一维的。n维数组可以当成每个元素是(n-1)维数组的一维数组。上句话不好理解,举例: ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbmdnb25nXzE5OTE_size_16_color_FFFFFF_t_70 6] int a\[3\]\[4\]\[5\]; 该数组是含有3个元素的一维数组,只不过每个元素都是4行5列的二维数组 4. 行地址和列地址 #include<stdio.h> int main(int argc, const char *argv[]) { int i,j; int a[3][4] = { { 0,1,2,3}, { 4,5,6,7}, { 8,9,10,11}, }; for(i = 0;i < 3;i++) { for(j = 0;j < 4;j++) { printf("%p ",&a[i][j]); } puts(""); } printf("a = %p\n",a); printf("a+1 = %p\n",a+1); printf("a+2 = %p\n",a+2); printf("*a = %d\n",*a); printf("*(a+1) = %d\n",*(a+1)); printf("*(a+2) = %d\n",*(a+2)); printf("a[0] = %p\n",a[0]); printf("a[0]+1 = %p\n",a[0]+1); printf("a[0]+2 = %p\n",a[0]+2); printf("a[1] = %p\n",a[1]); printf("a[1]+1 = %p\n",a[1]+1); printf("a[1]+2 = %p\n",a[1]+2); printf("*a[0] = %d\n",*a[0]); printf("*(a[0]+1) = %d\n",*(a[0]+1)); printf("*(a[0]+2) = %d\n",*(a[0]+2)); printf("*a[1] = %d\n",*a[1]); printf("*(a[1]+1) = %d\n",*(a[1]+1)); printf("*(a[1]+2) = %d\n",*(a[1]+2)); return 0; } ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbmdnb25nXzE5OTE_size_16_color_FFFFFF_t_70 7] 解析:虽然a和a\[0\]的地址相同,但是a是行地址,a+1是下一行地址 而a\[0\]是列地址,代表第0行第0列的地址。a\[0\]加1是第0行第1列元素的地址 a\[1\]是列地址,代表第1行第0列的地址。a\[1\]加1是第1行第1列元素的地址 行地址不能加*进行取值,但是列地址可以 (片面理解) 上述*a, \*(a+1), \*(a+2)如果不用%d输出,而用%p输出,结果就和a, a+1, a+2相同!也就是说,\*a, \*(a+1), *(a+2)是地址值! 按照下面所说,这里星号代表降级,把行地址降低为列地址。也就是*a, \*(a+1), \*(a+2)和a\[0\], a\[1\], a\[2\]和a, a+1,a+2值是相同的,只是前两个是列地址,后一个是行地址。 1. 二维数组的拆分 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbmdnb25nXzE5OTE_size_16_color_FFFFFF_t_70 8] ![在这里插入图片描述][20190611151529794.png] 解析: *(a\[1\]+2)中a\[1\]是列地址,代表第1行第0列的地址,a\[1\]+2就是 第1行第2列的地址,就是6的地址。*(a\[1\]+2)就是6了。 *(*(a+1)+2)中\*(a+1)的\*号代表降级,把(a+1)的行地址降为列地址a\[1\]。 笔试题: 若定义int a\[4\]\[10\]; 则以下选项中对数组元素a\[i\]j的错误应用是: A. *(&a\[0\]\[0\]+10*i+j) B. (a+i)\[j\] C. \*(a+i)\[j\] D. \*(a+i+j) 解析: B和C这种形式没见过,B变成\*(a+i+j),C变成\*(\*(a+i+j)),可知B是个列地址,C是个列地址的值。 [20190611150245110.png]: /images/20220119/8b552d91ae364f558dd0bf4166512be2.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbmdnb25nXzE5OTE_size_16_color_FFFFFF_t_70]: /images/20220119/5929cc171c8a41a6b75df86d2125d297.png [20190611150458892.png]: /images/20220119/786f1ca0cb65410d977c728646c51059.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbmdnb25nXzE5OTE_size_16_color_FFFFFF_t_70 1]: /images/20220119/4b1ae7994a2a45fe808b94af5c20c8a6.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbmdnb25nXzE5OTE_size_16_color_FFFFFF_t_70 2]: /images/20220119/9f7e3d34d2d145e69d1a404b5bc69a21.png [20190611150547596.png]: /images/20220119/d4900d65759e449f9aaea59509130a1a.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbmdnb25nXzE5OTE_size_16_color_FFFFFF_t_70 3]: /images/20220119/9f537596aebf485aa6a13bc2e5d46899.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbmdnb25nXzE5OTE_size_16_color_FFFFFF_t_70 4]: /images/20220119/be9d50b33eeb435fb50dcba58769e71e.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbmdnb25nXzE5OTE_size_16_color_FFFFFF_t_70 5]: /images/20220119/915b3ce26de546c681246c9f3101ce6d.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbmdnb25nXzE5OTE_size_16_color_FFFFFF_t_70 6]: /images/20220119/5c846ebee7e24f3f95171b80aa0d5ad3.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbmdnb25nXzE5OTE_size_16_color_FFFFFF_t_70 7]: /images/20220119/bbc5d70278ff4344ad79996190ad19b7.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbmdnb25nXzE5OTE_size_16_color_FFFFFF_t_70 8]: /images/20220119/777f30c21bc0461d8a221b39c115822a.png [20190611151529794.png]: /images/20220119/355ec1410d17433c979b9ce97150cb12.png
相关 二维数组 二维数组是一种数据结构,它具有多行多列的特点。在编程中,它可以被看作一个表格,每一行对应一个一维数组,而每一列则对应着该一维数组中的一个元素。通过下标来访问二维数组中的元素。 骑猪看日落/ 2023年10月08日 17:38/ 0 赞/ 29 阅读
相关 一维数组、二维数组 (一)数组 变量: 只能存储一个值 数组: 存储的一组相同数据类型的值, 存储个数: 由程序员在创建的数组的时候来指定, 缺点: 固定长度 也称为: 容器 1.数组要 柔情只为你懂/ 2023年10月04日 19:08/ 0 赞/ 80 阅读
相关 java二维数组(java二维数组) java语言二维数组 System.out.println方法是输出参数内容。你指定的参数是erwei+""。erwei是个数组,在java中数组也是一种对象,那么这个“ £神魔★判官ぃ/ 2023年09月25日 08:31/ 0 赞/ 75 阅读
相关 二维数组 二维数组 其实二维数组其实就是一个元素为一维数组的数组。 动态初始化方式一(指定有多少个长度相同的一维数组) 数据类型\[\]\[\] 变量名 = new 数据类 清疚/ 2023年06月26日 12:16/ 0 赞/ 29 阅读
相关 二维数组 二维数组:(本质,以一维数组作为数组的元素)因为数组中的元素可以是任意类型。 声明创建语法: int\[\]\[\] iArrArr = new int\[一维数组的个 柔情只为你懂/ 2022年09月24日 15:19/ 0 赞/ 239 阅读
相关 二维数组 上节讲解的数组可以看作是一行连续的数据,只有一个下标,称为 一维数组 。在实际问题中有很多数据是二维的或多维的,因此C语言允许构造多维数组。多维数组元素有多个下标,以确定它在数 一时失言乱红尘/ 2022年06月01日 10:30/ 0 赞/ 286 阅读
相关 二维数组 可以将二维数组理解为数组中的数组, 即一维数组里在存一个一维数组 格式1:int\[\]\[\] arr = new int\[2\]\[3\]; arr的二维 向右看齐/ 2022年06月01日 09:20/ 0 赞/ 290 阅读
相关 二维数组 1. 概述 int a\[3\]\[4\]; 总共是12个元素,可以当成3行4列看待,分别是 a\[0\]\[0\] a\[0\]\[1\ ゝ一世哀愁。/ 2022年05月01日 13:52/ 0 赞/ 296 阅读
相关 二维数组 二维数组 概念: 本质就是存放了一维数组的数组, 在Java中不存在真正意义的二维数组,多维数组本质还是一维数组 格式: 数据类型\[\]\[\] 数组名 = n 短命女/ 2021年11月04日 19:42/ 0 赞/ 461 阅读
还没有评论,来说两句吧...