内存单元的地址-指针程序设计.ppt_第1页
内存单元的地址-指针程序设计.ppt_第2页
内存单元的地址-指针程序设计.ppt_第3页
内存单元的地址-指针程序设计.ppt_第4页
内存单元的地址-指针程序设计.ppt_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

高级语言程序设计,第7章 内存单元的地址 指针程序设计(2),二维数组批量数据处理的指针版,问题描述: 假设有全班60个人3门课程数学、英语、计算机的成绩数据,包括学号,试按每个人的总分对其降序排序。,分析,设已经定义了数组 int num M, grade M N, totalM=0; 要通过input函数获得用户键盘输入的数据 然后用chooseSort函数排序, 再用print函数打印输出排序的结果,期望使用三个函数, 其原型为,void input (int num, int grade 3,int total ); void chooseSort (int num , int grade 3, int total ); void print (const int num , const int grade 3, const int total );,或者,void input (int *num, ?int *grade, int *total); void chooseSort (int *num, ?int *grade, int *total); void print (const int *num, ?const int *grade; const int *total); 其中指向二维数组grade的指针如何定义和表示还不明确,然后,通过指针访问一维数组或二维数组的元素 实现读写数据,指针与二维数组的关系 二维数组名与行列地址,注意关于二维数组下面的事实,用指针访问二维数组元素的第一种方法,由前面分析的结果可以看出,直接把二维数组名作为行地址的行地址进行行列偏移既可以访问二维数组的元素 即 *(*(a+i)+j),如果定义成指针参数该是什么样的指针呢?,void input(int *pNum, int *pGrade, int *pTotal); int *pGrade说明的pGrade能指向二维数组grade吗? 回答是不能! 指针的类型必须与它所指向的变量类型相同 pGrade是什么类型? 二维数组名grade是什么含义?,用指针访问二维数组元素的第二种方法行指针,指向行地址的指针-行指针, int (*pGrade)3 = grade; pGrade是行指针,是有3列的行指针 这样 pGrade+1 就是grade +1 pGrade+2 就是grade + 2 ,函数调用可以写成 : input ( num, grade, total);,注意这里的*grade在前面是*pGrade,用指针访问二维数组元素的第三种方法-把二维数组看成一维数组,对于二维数组gradeMN, 定义 int *p = *grade; 则 p就是第一列的地址(第一个元素的地址)(第一行的首地址,见前面的图,也就是第一列的地址),p指向了二维数组的第一个元素 第i行第j列的元素为 *(p+i*N+j) 或者写成下标的形式, 注意是单下标 pi*N+j,函数调用为:input(num, *grade, total);,指针的指针,二维数组名和行指针是一类特殊的指针,它指向的元素是行地址。 还有多级指针,最典型的就是二级指针 int a = 10; int *aPtr= 其中*aPPtr就定义了一个二重指针,思考:可以用二重指针指向一个二维数组吗?,例如 int *p, a23=1,2,3,4,5,6; p=a;,应该用行指针。或者如下定义的若干个指针构成的指针数组,思考:注意指针数组和行指针的不同,指向函数的指针,函数与数据一样,也要存储在内存中,因此也有首地址。这个首地址就是函数的第一条语句(或指令)在内存中的地址,通常称这个地址为函数的入口地址。 怎么定义指向函数的指针变量呢?它的格式与普通的指针变量略有不同,形式如下: 数据类型 (*指针变量名) (形参参数列表),例如,int max(int a, int b); int min(int a, int b); 假设它们对应的代码已经放在内存的某个位置,定义一个可以指向这类函数的指针变量 定义 int (* ifuncPtr) ( int,int); 则 ifuncPtr = max; ifuncPtr就指向了max。 同样可以让ifuncPtr指向min。,间接引用函数,int a,b; scanf(“%d %d”,指向函数的指针作为函数的参数,排序算法中,升序和降序的区别仅仅在于排序过程中关系表达式是大于还是小于,除此之外都是一样的。 可以用一个指向大于比较或小于比较的函数指针使排序算法函数成为升序降序通用的函数 升降的区别就在于比较的时候用大于还是小于,可以定义两个函数,int ascending(const int a, const int b); int descending(const int a, const int b); 即 int ascending(const int a, const int b) return ba; ,再定义一个交换函数,void swap(int *x, int *y); 即 void swap(int *x, int *y) int temp; temp = *x; *x = *y; *y = temp; ,选择法升序降序通用函数,void chooseSort(int num,int grade3,int total, int(*compare)(int,int) ) in

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论