内存单元的地址-指针程序设计.ppt
高级语言程序设计第7章内存单元的地址—指针程序设计(2)问题描述:假设有全班60个人3门课程数学、英语、计算机的成绩数据,包括学号,试按每个人的总分对其降序排序。设已经定义了数组1intnum[M],grade[M][N],total[M]={0};2要通过input函数获得用户键盘输入的数据3然后用chooseSort函数排序,再用print函数打印输出排序的结果4期望使用三个函数,其原型为voidinput(intnum[],intgrade[][3],inttotal[]);inttotal[]);constintgrade[][3],voidchooseSort(intnum[],intgrade[][3],voidprint(constintnum[],constinttotal[]);voidinput(int*num,?int*grade,int*total);voidchooseSort(int*num,?int*grade,inttotal);voidprint(constint*num,?constint*grade;constint*total);其中指向二维数组grade的指针如何定义和表示还不明确通过指针访问一维数组或二维数组的元素01实现读写数据02用指针访问二维数组元素的第一种方法由前面分析的结果可以看出,直接把二维数组名作为行地址的行地址进行行列偏移既可以访问二维数组的元素即 *(*(a+i)+j)0102如果定义成指针参数该是什么样的指针呢?int*pGrade说明的pGrade能指向二维数组grade吗?voidinput(int*pNum,int*pGrade,int*pTotal);指针的类型必须与它所指向的变量类型相同回答是不能!pGrade是什么类型?二维数组名grade是什么含义?用指针访问二维数组元素的第二种方法行指针指向行地址的指针---行指针,int(*pGrade)[3]=grade;pGrade是行指针,是有3列的行指针这样pGrade+1就是grade+1pGrade+2就是grade+2……注意这里的*grade在前面是*pGrade对于二维数组grade[M][N],定义int*p=*grade;则p就是第一列的地址(第一个元素的地址)(第一行的首地址,见前面的图,也就是第一列的地址),p指向了二维数组的第一个元素第i行第j列的元素为(p+i*N+j)或者写成下标的形式,注意是单下标p[i*N+j]指针的指针还有多级指针,最典型的就是二级指针inta=10;int*aPtr=a;int**aPPtr=aPtr;其中**aPPtr就定义了一个二重指针二维数组名和行指针是一类特殊的指针,它指向的元素是行地址。020103050604思考:可以用二重指针指向一个二维数组吗?12例如int**p,a[2][3]={1,2,3,4,5,6};p=a;12思考:注意指针数组和行指针的不同指向函数的指针函数与数据一样,也要存储在内存中,因此也有首地址。这个首地址就是函数的第一条语句(或指令)在内存中的地址,通常称这个地址为函数的入口地址。怎么定义指向函数的指针变量呢?它的格式与普通的指针变量略有不同,形式如下:数据类型(*指针变量名)(形参参数列表)