- 1、本文档共531页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
(夏宝岚第三版)C语言程序设计.ppt
【例】输入k个整数(0k=100),对其中的正整数统计个数并求和,程序最后输出原始整数序列和统计结果。 [程序1] /*利用下标法处理一维数组*/ 程序的运行结果为: 输出结果为: [程序2] /*利用地址常量法处理一维数组*/ 程序的运行结果为: 输出结果为: [程序3] /*利用指针变量方法处理一维数组*/ 程序的运行结果为: 输出结果为: 8.2.2 指针与二维数组 指针处理一维数组,指针变量所指对象为数组元素; 指针处理二维数组,指针变量所指对象为数组中的行。 1.二维数组的两种编译结构 【例】给出二维数组 41 37 31 29 23 19 17 13 11 7 5 3 a 数组名a代表整个数组的存储首地址 int a[3][4]={3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41} 结构之一:把a看作是3行4列的两维数组; 结构之二:把a看作是一维数组; 41 37 31 29 23 19 17 13 11 7 5 3 a[2] a[1] a[0] a 对于一维数组而言,a[i]是个实实在在的占据内存单元的下表变量,它有明确的物理存储地址;二维数组中引入的a[i]是个并不占据内存单元的地址常量,与数组名代表数组的存储首地址完全一样。 2.通过数组名引用数组元素 41 37 31 29 23 19 17 13 11 7 5 3 a[2] a[1] a[0] a a[0]、a[1]、a[2]是一维数组名,各自代表自身所在行元素的存储首地址。 ? ? ? 因为a a[0],*a a[0],所以*(a+1) a[1],依次类推*(a+i)与a[i]等价。 总结:通过地址常量“数组名”引用二维数组元素有以下恒等关系: 第i行的首地址 *(a+i) a[i] a[i][0] 第i行第j列元素的地址 *(a+i)+j a[i]+j a[i][j] 第i行第j列元素 *(*(a+i)+j) *(a[i]+j) a[i][j] 【例】编写程序,建立如下形式的二维数组,再利用指针变量以矩阵形式输出之。 1 2 3 4 5 2 1 2 3 4 3 2 1 2 3 4 3 2 1 2 5 4 3 2 1 【复习】 二维数组的存储结构: 定义指针并初始化,使p指向数组a 控制行 控制列 输出结果为: 3.通过指向一维数组的指针变量引用二维数组元素 一维数组名为一级指针常量,直接指向变量; 二维数组名为二级指针常量,二维数组名指向行,a+i代表 行指针,当i增或减1时就意味着向后或向前跨一整行元素; 数组指针(指向一维数组的指针变量)也可以达到行指针相 同的移动效果; 数组指针定义形式为: 数据类型 (*指针名)[N] N代表指针变量所指向的一维数组的长度 圆括号不能省略 【例】 int a[4][3],b[3][5],(*pa)[3],(*pb)[5]=b; pa=a+1; 指向长度为5的一维数组的指针变量pb,并在定义pb的同时初始化,使其指向b数组的首元素 3行5列的二维数组b 指向长度为3的一维数组的指针变量pa 4行3列的二维数组a 指针变量pa指向a数组的第二行,即a[1] 2 3 4 1 2 3 2 1 2 3 2 1 思考题:如果有pa=a;那么pa+1指向的是什么? 数 组a 如果pa不是数组指针,那么pa+1所指向为元素 如果pa是数组指针,那么pa+1所指向为行 指针与二维数组的联系 引用数组元素a[i][j] a[i][j] *(a[i]+j), *(*(a+i)+j) *(p[i]+j), *(*(p+i)+j) 计算数组元素a[i][j]的地址 a[i][j] a[i]+j, *(a+i)+j p[i]+j, *(p+i)+j 引用数组第i行的首地址 a[i], *(a+i) p[i], *(p+i) 含 义 表 达 形 式 (2)宏参数没有固定的数据类型,定义时不涉及类型,宏名和宏参数均无类型; (3)函数调用是在程序运行时发生的,并动态分配所用的内存单元;而宏调用是在编译预处理时进行的,不分配内存单元,不进行值传送,也无值返回; (4)使用函数调用不增加运行程序的长度,但每使用一次宏调用,都会使运行程序篇幅有所增长,使编译、链接后的执行程序也增长; (5)宏定义主要用于需要少量参数的简单表达式中,而且调用时不作数据类型检查;
文档评论(0)