c语言程序设计第9章指针进阶

上传人:xiao****1972 文档编号:72163362 上传时间:2019-01-22 格式:PPT 页数:61 大小:884.81KB
返回 下载 相关 举报
c语言程序设计第9章指针进阶_第1页
第1页 / 共61页
c语言程序设计第9章指针进阶_第2页
第2页 / 共61页
c语言程序设计第9章指针进阶_第3页
第3页 / 共61页
c语言程序设计第9章指针进阶_第4页
第4页 / 共61页
c语言程序设计第9章指针进阶_第5页
第5页 / 共61页
点击查看更多>>
资源描述

《c语言程序设计第9章指针进阶》由会员分享,可在线阅读,更多相关《c语言程序设计第9章指针进阶(61页珍藏版)》请在金锄头文库上搜索。

1、第9章 指针进阶,学习目标,1掌握指针数组的定义及其应用,了解二级指针的基本概念; 2. 理解二维数组的指针和指向二维数组的指针变量; 3. 了解指向函数的指针,理解指针型函数; 4. 初步了解内存的动态分配和动态回收; 5. 初步掌握单向链表的建立与访问、在单向链表中插入、删除结点等算法。,9.1 指针数组,9.1.1 指针数组的概念 指针数组:一个数组的每个元素均为指针类型 形式: 数据类型 *数组名数组长度; int *pa3;,char *pname5= “JiangSu“,“ShanDong“,“ZheJiang“,“GuangXi“,“AnHui“;,9.1.2 指向指针的指针变量

2、 指向指针的指针变量:一个指针变量中存放的是另一个指针变量的地址 形式: 数据类型 *指针变量名; int *p;,int x=5,*q=,#include void main() int a=10,*b,*c; b= 运行结果: 10,10,10 20,20,20 30,30,30,9.1.3 指针数组应用举例 编程将若干字符串按字母顺序由小到大排序后输出。 #include #include #define N 5 /* 字符串个数 */ void sort(char *name,int n); void print(char *name,int n); void main() char

3、*pnameN=“JiangSu“,“ShanDong“,“ZheJiang“,“GuangXi“,“AnHui“; printf(“before sorted:n“); print(pname,N); /* 排序前输出各字符串 */ sort(pname,N); /* 排序 */ printf(“after sorted:n“); print(pname,N); /* 排序后输出各字符串 */ ,void sort(char *name,int n) char *pt; int i,j,k; for(i=0;i0) k=j; if(k!=i) pt=namei; namei=namek; n

4、amek=pt; void print(char *name,int n) int i; for(i=0;in;i+) printf(“%sn“,namei); /* 或 printf(“%sn“,*(name+i); */ ,9.2 二维数组的指针和 指向二维数组的指针变量,9.2.1 二维数组的行地址和列地址 一、二维数组的行地址 int s34;,s数组的行地址,*s等于*(s+0)为元素s0 *(s+1)即为元素s1 *(s+2)即为元素s2,由于行地址代表某一行(这一行可以看成是一个一维数组)的地址,而不是某一个元素的地址,故行地址是一个二级指针。 例如,s是第0行,即s0(s0可看

5、作是s00、s01、s02、s03四个元素组成的一维数组的数组名)的地址,s+1表示下一行的地址,即s1的地址。,二、二维数组的列地址 一维数组名代表数组首元素的地址 s0代表一维数组s0中第0列元素的地址(&s00) s1代表一维数组s1中第0列元素的地址(&s10)s2代表一维数组s2中第0列元素的地址(&s20),s0+0、s0+1、s0+2、s0+3分别是s00、s01、s02、s03的地址,这些地址被称为二维数组s的列地址。 列地址是数组元素的地址,可以利用列地址指向某一个实际的二维数组元素。,9.2.2 通过地址引用二维数组的元素 int s34, i, j; s数组中各种表示形式

6、和含义,9.2.3 指向二维数组的指针变量 一、指向二维数组元素的指针 列地址是数组元素的地址,使用该地址对一指针变量进行初始化,那么该指针变量就指向二维数组元素。这种指针被称为指向二维数组元素的指针或者被称为列指针,#include void main() int a34=0,2,4,6,1,3,5,7,9,10,11,12; int *p; for(p=a0; pa0+12; p+) if(p-a0)%4=0)printf(“n“); /* 保证每行四个元素 */ printf(“%4d“,*p); /* 输出当前p所指向元素的值 */ 运行结果: 0 2 4 6 1 3 5 7 9 10

7、 11 12,阅读下列程序,考察lessavg函数调用时实参与形参的结合。 #include #define M 3 #define N 3 void lessavg(float *,int); void main() float aMN=65,67,70, 80,89,97, 69,76,80; lessavg( ,void lessavg(float *p,int n) float sum=0,average; float *p1; int i; p1=p; /* p1指向第一个元素a00 */ for(;p1p+n;p1+) sum=sum+(*p1); average=sum/n; /

8、* average 存储平均值 */ printf(“average=%5.2f“,average); printf(“nthe array elements (less%5.2f):n“,average); for(i=0;in;i+) if(piaverage) /* 或if(*(p+i)average) */ printf(“%5.2fn“,pi); /* 或printf(“%5.2fn“, *(p+i); */ ,二、指向二维数组行的指针 行地址代表某一行(一行可以看成是一个一维数组)的地址,使用该地址对一指针变量进行初始化,那么该指针变量便指向二维数组的一行。这种指针变量被称为指向二

9、维数组行的指针变量,简称行指针。 形式:数据类型 (*行指针名)长度; “长度”表示行指针所指向的一维数组的长度(即二维数组的列数) “数据类型”表示行指针所指一维数组的元素类型 “*”表示其后定义的标识符是指针。 例如,变量声明语句“int (*p)4=s;”表示定义的指针变量p用以指向包含4个整型元素的一维数组,也可理解为p用以指向列数为4的二维数组的行。,#include void main() int s34=0,2,4,6,1,3,5,7,9,10,11,12; int (*p)4,i,j; scanf(“%d%d“, 测试数据及运行结果: 输入:1 3 输出:7,9.2.4 二维数

10、组名作为函数参数 若主函数中有以下定义及函数调用语句: #include #define M 3 #define N 4 void main() int aMN; fun(a); 则fun函数(设为void类型)定义时的首部可以是以下三种形式之一: (1) void fun(int (*p)N) (2) void fun(int pN) (3) void fun(int pMN),注意: 上述三种方式中,无论是哪一种方式,编译系统都将把p处理成一个行指针。和一维数组相同,数组名传递给形参的是一个地址值,因此,对应的形参也必定是一个类型相同的指针变量,在函数中引用的将是主函数中的数组元素,系统只

11、为形参开辟一个存放地址的存储单元,而不可能在调用函数时为形参开辟一系列存放数组元素的存储单元。,#include #define M 3 #define N 4 int max_value(int (*p)4,int rnum); void main() int sMN=1,3,12,7,2,14,6,28,15,47,34,12; printf(“max value is %dn“,max_value(s,M); int max_value(int (*p)N, int rnum) /* 或int max_value(int pN,int rnum) */ int i,j,max; max=

12、p00; /* 或max=*p; */ for(i=0;imax) max=pij; /* 或max=*(*(p+i)+j); */ return max; 运行结果: max value is 47,9.3 函数的指针与 指向函数的指针变量*,9.3.1 指向函数的指针变量的定义 形式为: 数据类型 (*指针变量名)(); “数据类型”表示指针变量所指向函数的返回值的类型。 最后的空括号表示指针变量所指的是一个函数。 例如,int (*pf)(); pf被定义为一个可以指向函数的指针变量,该函数的返回值(函数值)是整型。它在没有赋值前不指向一个具体的函数,不能随便使用。,9.3.2 用指向函

13、数的指针变量调用函数 形式: (*指针变量名)(实参表列);,#include int max(int,int); int min(int,int) ; void main() int (*p)(); int x,y,l,j; printf(“Please input two numbers:n“); scanf(“%d %d“, ,int max(int a,int b) if(ab) return a; else return b; int min(int a,int b) if(ab) return a; else return b; 测试数据及运行结果: 输入:6 10 输出:max=

14、10 min=6,9.4 返回值为指针的函数,形式: 数据类型 *函数名(形参表) 函数名前的“*”号表明这是一个指针型函数,即返回值是一个指针。数据类型表示了返回的指针所指向数据的类型。 例如: int *ap(int x,int y) 表示ap是一个返回指针值的指针型函数,它返回的指针指向一个整型变量。,编写一个函数连接两个字符串,并返回连接后字符串的首地址,#include char *catstr(char *str1,char *str2); void main() char s1100=“beijing“; char s2100=“2008“; char *result=NULL;

15、 result=catstr(s1,s2); printf(“nthe result is :%sn“,result); char *catstr(char *str1,char *str2) char *temp=str1; while(*str1!=0)str1+; while(*str2!=0) *str1=*str2; str1+; str2+; *str1=0; return temp; ,运行结果: the result is :beijing2008,9.5 链表,9.5.1 链表的概念 链表是一种常见的重要的数据结构,它是动态地进行存储分配的一种结构。 一、自引用结构体 当一个结构体中的一个或多个成员的基类型就是本结构体类型时,称为可以“引用自身的结构体”,简称自引用结构体。例如: struct node char c;

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号