- 1、本文档共35页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
C语言_ch__指针与多维数组.ppt
向函数传递一维数组 void f(int a[], int len); 向函数传递二维数组 void f(int a[][3], int row, int col); * * 程序运行结果如下: No.1 fails, his scores are: 65.0 57.0 70.0 60.0 No.2 fails, his scores are: 58.0 87.0 90.0 81.0 * * 通过指针变量存取数组元素速度快, 且程序简明。 数组与指针常常是紧密联系的, 使用熟练的话可以使程序质量提高, 且编写程序方便灵活。 * * 这一节我们学到了 指针与二维数组 a[i]=*(a+i) a[i][j]=*(*(a+i)+j) a、a+i、*(a+i)、a[i]、*(*(a+i)+j)等怎么理解 行指针与列指针 如何定义一个指向二维数组的指针 行指针:指向一维子数组,int (*p)[10]; 列指针:指向元素,int *p; 如何向函数传递一个指向二维数组的指针 int (*p)[10]; 和 int *p[10];的不同 * * 实验周日 实验 下标引用实际上只是间接访问表达式的一种伪装形式 // 逐行输出各元素 for (p=a; pa+3; ++p) { for (i=0; i4; ++i) printf(%4d , *(*p+i)); printf(\n); } * * 上一节我们学到了 指针的运算 只有加减,没有乘除 指针与数组 如何用指针引用数组元素 四种方式 数组名的含义 指针与函数 指针作为函数参数 分析*p++, *++p, *(p++), (*p)++ * * 第8章 善于利用指针 8.1 指针是什么 8.2 指针变量 8.3 通过指针引用数组 8.3.1 数组元素的指针 8.3.2 在引用数组元素时指针的运算 8.3.3 通过指针引用数组元素 8.3.4 用数组名作函数参数 8.3.5 通过指针引用多维数组 8.4 通过指针引用字符串 8.5 指向函数的指针 8.6 返回指针值的函数 8.7 指针数组和多重指针 8.8 动态内存分配与指向它的指针变量 8.9 有关指针的小结 * * 多维数组 多维数组在系统编程中并不常用,C语言又主要专注于系统编程,所以C对多维数组的支持并不多 C语言将二维数组看作一个数组的数组 我们可以把所有的数组都看做一个某种类型的向量,那么二维数组就是一个元素类型为一维数组的向量 * * int a[3][4]={ {1, 3, 5, 7}, {9, 11, 13, 15}, {17, 19, 21,23} }; a数组包含3个元素: a[0], a[1], a[2]。 每一元素又是一个一维数组, 它包含4个元素, 例如, a[0]所代表的一维数组又包含4个元素:a[0][0], a[0][1], a[0][2], a[0][3], 见下图。 * * 考虑这个表达式:a a 是二维数组的数组名 所以,a是指向二维数组首元素的常量指针 指向包含4个整型元素的第一个子数组 a * * 考虑这个表达式:a+1 a+1 指针的加减运算是以其指向的类型大小为单位的 a指向的是一个“包含4个整型元素的子数组” 所以,a+1指向下一个“包含4个整型元素的子数组” a+1 * * 考虑这个表达式:*(a+1) *(a+1) 标识了一个“包含4个整型元素的子数组” 等价于a[1] a[1]是二维数组的第一个元素,该元素也是个数组,那么,我们可以把a[1]看做这个一维子数组的数组名,故图示如下 *(a+1) 或a[1] * * 考虑这个表达式:*(*(a+1)+2) *(*(a+1)+2) 我们做个转换,使其更容易理解 等价于*(a[1]+2) 又等价于a[1][2] *(*(a+1)+2) 或*(a[1]+2) 或a[1][2] * * 下标形式a[i][j]的地址计算 int a[3][4]; 那么编译器怎样获得a[i][j]的地址呢? 首先找到a[i]的位置,然后根据偏移量[j]取得字符 因此a[i][j]将被编译器解析为*(*(a+i)+j) a[0] a[1] a[2] a[1][2] 9900 [i] [j] * * a[i][j]的地址如何表示 最简单的表示:a[i][j] a[i]+j a[i]是第i行子数组的数组名,那么该行第j个元素的地址即为a[i]+j 又因为 a[i]和 *(a+i)等价。因此, a[i]+j和*(a+i)+j等价。 从反方向分析,a[i][j]=*(*(a+i)+j),所以a[i][j]=*(*(a+i)+j)=*(a+i)+j * * 怎么表示a[i][j]的值 进一步分析
文档评论(0)