C语言程序设计(第二版)-电子教案-丁亚涛 第8章 指针

上传人:E**** 文档编号:89423299 上传时间:2019-05-25 格式:PPT 页数:44 大小:730.51KB
返回 下载 相关 举报
C语言程序设计(第二版)-电子教案-丁亚涛 第8章 指针_第1页
第1页 / 共44页
C语言程序设计(第二版)-电子教案-丁亚涛 第8章 指针_第2页
第2页 / 共44页
C语言程序设计(第二版)-电子教案-丁亚涛 第8章 指针_第3页
第3页 / 共44页
C语言程序设计(第二版)-电子教案-丁亚涛 第8章 指针_第4页
第4页 / 共44页
C语言程序设计(第二版)-电子教案-丁亚涛 第8章 指针_第5页
第5页 / 共44页
点击查看更多>>
资源描述

《C语言程序设计(第二版)-电子教案-丁亚涛 第8章 指针》由会员分享,可在线阅读,更多相关《C语言程序设计(第二版)-电子教案-丁亚涛 第8章 指针(44页珍藏版)》请在金锄头文库上搜索。

1、第8章 指针,理解并掌握地址、指针和指针变量的概念 练掌握指针变量的定义、初始化和引用方法 理解并掌握指针与数组的关系 了解指针数组和多级指针的概念 了解指针与函数的关系 学会在程序设计中正确应用指针解决实际问题,引言,指针是C语言区别于其他程序设计语言的主要特征之一。 正确灵活地使用指针可以充分地发挥C语言的特点,提高某些程序的执行效率,更加方便地表示和访问复杂的数据结构、直接对内存操作等 。,8.1 借钱的故事,如果有位远方的朋友向你借10000元钱,请你选择下面两种方式之一: 从信用卡(x,如:6222 0013 0210 1234 567)转给他10000元; 用你的信用卡(x)办理的

2、网上银行账号(p,如:3401 0320 1203 0333 333)转给他10000元。 两种方式都可以。x和p都是存取银行存款的方式。通过x直接可存取,由于p中存储的是x的信息。访问p可以获取x的信息,再对银行存款进行操作。,8.1 借钱的故事,8.2 指针的概念,C语言允许使用变量名、数组名下标、函数名等标识符来访问内存 指针其实就是在内存中的地址,它可能是变量的地址,也可能是函数的入口地址 变量指针存储的地址是变量的地址 函数指针存储的地址是函数的入口地址 指针变量也简称为指针,是指它是一个变量,且该变量是指针类型的,8.3 指针变量的定义和初始化,定义指针变量的形式如下: 数据类型

3、*指针变量名; 定义并初始化的形式为: 数据类型 *指针变量名= 没有指向的指针变量的值是随机的,称为“野指针”。,指针变量与 变量的关系,int a,*pa=,8.4 指针运算,8.4.1 * 运算符和取地址运算符 *(&a) = a &(*p) = p 指向运算符 * 和取地址运算符 & 互逆 不能写成: *(& p),8.4.2 指针变量的引用,【例8-1】演示指针变量的引用 void swap1(int x , int y)int temp;temp = x;x = y;y = temp; void swap2(int *x , int *y)int temp;temp = *x;*x

4、 = *y;*y = temp; void swap3(int *x , int *y)int *temp;temp = x;x = y;y = temp; void main() int a,b; int *pa,*pb; pa= ,【例8-1】演示指针变量的引用。,swap1(int x,int y),主函数调用方式为: swap1(a,b); 值传递,a、b的值以及pa、pb指针变量都不受影响。 swap2(int *x,int *y),主函数调用方式为: swap2(pa,pb); 形参是指针变量,实参也是指针变量。交换算法中采用指向运算符*,所以*x、*y和pa、pb是对应相同的数据

5、a、b,最后函数实现了交换。 swap3(int *x,int *y),主函数调用方式为: swap3(pa,pb); 形参是指针变量,实参也是指针变量。交换算法中临时指针变量虽然把x、y交换,但pa、pb没有交换,所以对应的数据a、b也没有受到影响,交换是失败的。,【例8-1】演示指针变量的引用。,swap3()分析图,8.4.3 指针的算术运算和关系运算,算术运算 指针变量的+和-运算。 指针加、减整数运算。 指向同一数组不同元素的指针相减运算。 假定有: char str100= “Hello World“; char *p=str,*q;,8.4.3 指针的算术运算和关系运算,p+,q

6、=p+3;,字符W可以用str6表示,也可以用p5、q2表示,8.4.3 指针的算术运算和关系运算,关系运算 关系运算是比较指针大小的运算。两个指针相等说明指向同一存储单元。 pq 指针不能进行如下等运算: p+q p*q p/q ,8.5 指针与数组,8.5.1 指针与字符数组 char str100= “Hello World“; char *p=str; 字符w可以有如下多种表示形式: str6 *(str+6) p6 *(p+6),【例8-2】演示指针和数组的关系。,#include void main() char str100=“123456789“; char *p=str;ch

7、ar des100,*q; while(*p != NULL) printf(“%c“,*p+); /*顺序输出*/ printf(“n“); while(-p = str) printf(“%c“,*p); /*逆序输出*/ printf(“n“); p=str; q=des; while(*p != NULL) *q+ = *p+; /*字符串拷贝*/ *q=NULL; printf(“%sn“,des); return 0; ,8.5.2 指针与其他类型数组,【例8-3】演示指针和整型数组的关系,数组动态分配内存。 #include void main() int a10 = 1,2,3

8、,4,5,6,7,8,9,10; int *p=a,*q=p+9; int s; for(s = 0 ; q = p ; q-) s = s + *q; printf(“s=%dn“,s); ,8.5.3 指针与二维数组,二维数组其实可以看成由一维数组构造而成。就相当于几个队列构成一个方阵,方阵由队列组成,队列由具体的元素-人组成。 一级指针只能管理队列,如果管理方阵,则需要二级指针。 int a=1000,*pa,*ppa; pa= *(*(ppa) *(pa) a 1000,8.5.3 指针与二维数组,二级指针演示图,【例8-4】演示指针和二维数组的关系,main() int s,t; i

9、nt a34; int *p3,*q; int i,j; s=t=0; for(i =0 ; i 3 ; i+) pi = ai; for(j = 0 ; j 4 ; j+) aij = i * 3 + j; for(i=0 ; i3 ; i+) q = pi; for(j=0 ; j4 ; j+) s = s + *(*(p+i)+j) ; t = t + *(q+j); printf(“s=%d,t=%dn“,s,t); ,【分析】,int *p3是指针数组。 所谓指针数组,首先是一个数组,只不过其元素不是普通的变量,而是指针变量。即p0、p1、p2相当于前面提到的指针变量。 单独的指针变

10、量可以指向一个一维数组,例如例题中的数组a的第一行,【分析】,p是指针数组的数组名,a12用p表示就是 *(*(p+1)+2),其实就是*(p1+2)、*(a1+2),【分析】,【总结】,p是二级指针 *p相当于*(p+0),级别降低为一级指针,相当于p0 *p相当于*(*(p+0)+0),级别降低为数组元素(普通变量),也相当于p00 p12,相当于*(*(p+1)+2) &p12, 级别提升为一级指针,相当于: p1+2,*(p+1)+2 &p1,级别提升为二级指针,相当于: p+1,8.6 指针与函数,8.6.1 指针作为函数的参数 int swap2(int *x, int * y)

11、int temp; temp = *x; *x = *y; *y = temp; return 0; 实际调用该函数时,如: swap2( 调用时,把实参的指针传送给形参,即传送&a、&b,这是函数参数的引用传递。但是,作为指针本身,仍然是函数参数的值传递方式。因为在swap函数中创建的临时指针在函数返回时被释放,它不能影响调用函数中的实参指针(即地址)值,8.6 指针与函数,8.6.2 函数指针 函数名代表了函数在内存中的入口地址 int (*Copy)(const char *, const char*); Copy = /* 间接调用*/,【例8-5】演示函数指针。,#include #

12、include int sum(int n) int i,s=0; for(i=1; i=n; i+) s = s + i; return s; main() double (*s)(double) = 。,【例8-6】演示函数指针2。,#include #include int f1(int a,int b) return a+b; int f2(int a,int b) return a-b; int f3(int a,int b) return a*b; int f4(int a,int b) if(b!=0) return a/b; else printf(“errorn“);retu

13、rn 0; ,【例8-6】演示函数指针2。,int f5(int a,int b) if(b!=0) return a%b; else printf(“errorn“);return 0; int f6(int n) int i,s=0; for(i=1 ; i=n ; i+)s = s + i; return s; int f7(int n) int i,s=1; for(i=1 ; i=n ; i+)s = s * i; return s; ,【例8-6】演示函数指针2。,int f8(int a,int b,int c) return a+b+c; void main() int (*f

14、)(); int a,b,c; a=53; b=44; c=35; f=f1; printf(“a+b=%dn“,f(a,b); f=f2; printf(“a-b=%dn“,f(a,b); f=f3; printf(“a*b=%dn“,f(a,b); f=f4; printf(“a/b=%dn“,f(a,b); f=f5; printf(“a%b=%dn“,f(a,b); f=f6; printf(“1+2+3+.+100=%dn“,f(100); f=f7; printf(“1*2*3*.*8=%dn“,f(8); f=f8; printf(“a+b+c=%dn“,f(a,b,c); ,8

15、.6.3 返回指针的函数,函数的返回值可以是一个指针。需要返回指针的函数,其类型必须也是指针类型。例如: char * copy(char * s,char * t) return s; 函数名copy和其返回值s的类型都是 char *。 注意copy是函数名,是一个指针常量,如果定义成: char (*copy)();加上括号的copy 是指针变量。 定义成指针变量的形式没有函数体部分,变量是简单的实体,不能再包括其他代码。,【例8-7】设计一个类似于strcpy的函数,#include char* copy(char* s,char* t) char *p=s,*q=t; while(*p != 0) p+; while(*q != 0) p+ = q+; *p =0; return s; main() char s100=“Hello “; char t=“World!“; printf(“%sn“,copy(s,t); ,8.7 案例:字符的查找,int atc(char *string,char c) int pos=0; while(*string != c ,8-9 统计单词的个数,【例8-9】用指针方法统计字符串“I love music more than

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


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

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