C语言课件第10章 指针

上传人:油条 文档编号:46117664 上传时间:2018-06-22 格式:PPT 页数:56 大小:235KB
返回 下载 相关 举报
C语言课件第10章 指针_第1页
第1页 / 共56页
C语言课件第10章 指针_第2页
第2页 / 共56页
C语言课件第10章 指针_第3页
第3页 / 共56页
C语言课件第10章 指针_第4页
第4页 / 共56页
C语言课件第10章 指针_第5页
第5页 / 共56页
点击查看更多>>
资源描述

《C语言课件第10章 指针》由会员分享,可在线阅读,更多相关《C语言课件第10章 指针(56页珍藏版)》请在金锄头文库上搜索。

1、第10章 指针主要内容:主要内容:(1 1)指针和地址)指针和地址(2 2)指针常量和指针变量)指针常量和指针变量(3 3)指针与数组的结合应用)指针与数组的结合应用(4 4)指针与函数的结合应用)指针与函数的结合应用(5 5)指针数组与指向指针的指针变量)指针数组与指向指针的指针变量重点:重点:指针变量的定义与引用指针变量的定义与引用通过指针访问数组元素通过指针访问数组元素指针变量作为函数参数指针变量作为函数参数返回指针值的函数返回指针值的函数10. 1 指针和指针变量 n例10.1:数据的直接访问与间接访问: main() a p int a, *p; FFD6Hscanf(“%d“,p=

2、 /*变量p保存a的地址*/printf(“n a=%d”,a); /*通过变量名访问单元:FFD6H*/printf(“n *p:%d”,*p); /*通过指针变量P访问单元:ffd6h*/ printf(“n p:%xn”,p); /*输出变量p的值,即a的地址*/ 指针:就是地址,变量的指针即指向该变量的地址。指针变量:存放内存(变量、数组、函数等)地址的变量。25FFD6H指针变量n例10.2 交换两个指针变量所指向的变量的值。 main() int a=10,b=20,t;int *p1,*p2; /*定义指向整型的指针变量p1,p2*/p1=p2= /*使p1 指向 a, p2 指

3、向 b*/printf(“n before exchange:a=%d, b=%d“,a,b);t=*p1;*p1=*p2;*p2=t; /*交换p1,p2指向的变量的值 */printf(“n after exchange:a=%d, b=%d“,a,b);printf(“n *p1:%d, *p2:%d“,*p1,*p2); 图示其执行过程: 见下页本例中指针变量 的作用: 通过指针变量访 问该指针变量指 向的单元,指针 变量的值不变。n指针变量的定义的一般格式为:类型标识符 *指针变量名 n例如: int *p; float *q;n指针变量的引用:必须先定义,后使用指针变量定义后,可以

4、对其进行如下操作: 赋值、引用指针变量的值、访问指针变量指向的变量等 。如上例中通过p1、p2访问变量a、b对应的单元, 其中 p1表示指针变量, *p1表示p1指向的变量(即变量a) , t=a; a=b; b=t; main() int x=5,y=6; swap(x,y); printf(“nx=%d,y=%d“,x,y); 结果:x=5,y=6 程序并未实现交换x、y的值, why?因为参数传递是单向的,对形参的改变不影响实参的值。指针变量作函数参数解决以上问题的方法是: 指向变量的指针变量作函数形参,接收主调函数 中实参变量的地址,实现传地址调用。 即在被调函数中通过指针变量访问(读

5、取或修改 )主调函数中对应的变量,当返回主调函数后 ,主调函数就得到了这些已修改过的变量的值 。因此,“传地址”调用可以实现函数间多个数 据的“双向传递”。 main() /*编写函数交换两个变量的值*/ int a,b; void swap(int *p,int *q);printf(“n input 2 integers:“);scanf(“%d%d“,printf(“n before swap:a=%d,b=%d“,a,b);swap(printf(“n after swap:a=%d,b=%d“,a,b); void swap(int *p,int *q) /*交换两个变量的值*/ i

6、nt t;t=*p; *p=*q;*q=t; 调用过程中参数的对应关系:Main: swap:a p b q*p a*q b因此,在swap函数中通过指针变量p、q就可以访问main 函数中的变量a、b了。由此可以实现函数之间的多个“ 数据传递”。a:a0 a1 a5After execute: pa=a; a0 a1 a5a:pa pa+1 pa+2例10. 5 分别用下标法和指 针法访问一维数组。程序(1):下标法 main() int a 5=1,2,3,5,7, i;for(i=0; i strn例10.6编写函数实现:将数组中的n个整数逆序存放 。调用该函数实现将10个整数逆序存放。

7、 main() int a10=1,2,4,6,8,9,7,5,3,10,i;int *p;void inv(int *q , int n); /*函数声明*/printf(“n before inverse:n“);for(p=a; p*(p+kr*n+kc) kr=i;kc=j;*r=kr; *c=kc;(p+i*n+j)表示数组元素ssij的地址n思考: 1、若用二维数组名作函数参数,是否能实现? 2、如何用函数实现:计算任意班级(n个人m门 课)每门课的平均成绩?10.2.3 指针与字符串n字符串用字符数组来保存,可以通过数组名及下标 访问,也可以通过字符指针访问。n例10.11:输入

8、任意字符串,通过字符数组名和字符 指针输出该字符串。 #include main() char string80, *str;gets(string); /*string is the address of string0*/puts(string);str=string; /*str point to the character array */puts(str); 例10.12用字符数组与字符指针分别访问一字符 串常量。 #include main() char string =“you are really fine!“, *str=“thank you.“; puts(string);

9、puts(str); 运行结果: you are really fine!thank you. 分析: (字符数组名与字符指针变量的使用区别)n*str=“thank you.”; 等价于char *str ; str=“thank you.“; n而char string=“you are really fine!”; 不等价于char string80 ; string= “you are really fine!”; n若定义: char s180,*s2;则语句: gets(s1); 是正确的 但语句:gets(s2); 不完全正确 ,因为s2未赋值就使用,这样可能使系统程 序或其他数

10、据区受到破坏,n字符指针变量作函数参数,等同于字符数组名作 函数参数,实现传地址调用,便于多个函数之间 的字符串的传递。 例10.14 用函数实现取子字符串:从字符串s1中第 m个字符开始的全部字符复制到另一字符串。 #include main() char s180,s280; int n;void copy_str(char *p,char *q,int m);gets(s1); scanf(“%d“,copy_str(s1,s2,n);puts(s2); void copy_str(char *p, char *q, int m) p=p+m-1;while(*p!=0)*q=*p; p

11、+;q+;*q = 0; 思考:若用字符数组作函数参数,如何实现?分析参数传递 的过程,有何区别? 结论:形参数组名相当于指针变量。10.3 指针与函数n指针变量作函数参数:如果形参是指针变量,实参可以是变量的地址、数组 元素的地址(或数组名)、函数的首地址。 本节主要介绍:指向函数的指针的使用n返回值指针值的函数(主要用于处理多个字符串)重点:编写返回指针的函数指向函数的指针n函数的指针:即函数名,表示函数的首地址. 例10.15指向函数的指针变量的定义、引用 #include “math.h” main() double x,(*p)(),y; /*注意定义与引用中的*的区别*/x=3.1

12、4/2;p=sin; y=(*p)(x);printf(“n sin: %3.1f“,y);p=cos; y=(*p)(x); printf(“n cos: %3.1f“,y); n指向函数的指针变量的一般定义形式为: n 类型标识符 (*指针变量名)( 参数类型 ); 例如: int (*da)( ); 定义指针变量 da,它指向一个返回int 型值的函数。应用: 利用指向函数的指针变量编写通用函数(较高要求)。 例10.16编写函数:求任意函数f(x)在区间(a,b)上的定 积分。 程序(略)返回指针值的函数n一个函数的返回值可以是 int、float、double、 character型

13、等,也可以返回其他类型的值,比如 指针类型。n例如: char *strcpy(char *a,char *b)char *strcat(char *s1, char *s2)char *strchr(char *s, char ch)例例10.17 10.17 编写函数编写函数search()search():查找字符查找字符chch在在 字符串字符串strstr中第一次出现的位置。在主函数中第一次出现的位置。在主函数 中输入字符串、待查找的字符,输出查找中输入字符串、待查找的字符,输出查找 结果。结果。n n分析:函数分析:函数search()search()的类型为指向字符数的类型为指向

14、字符数 据的指针类型,参数有两个:字符型的据的指针类型,参数有两个:字符型的chch 和指向字符的指针变量和指向字符的指针变量strstr. .算法:算法:从从strstr指向的字符串的首字符开始指向的字符串的首字符开始 ,循环比较,循环比较strstr指向的字符是否与字符指向的字符是否与字符chch 相等。若相等,则结束循环,返回指向该相等。若相等,则结束循环,返回指向该 字符的指针;否则,字符的指针;否则,strstr指向下一个字符指向下一个字符 ,直到字符串结束标志,直到字符串结束标志00为止,返回空为止,返回空 指针(指针(NULLNULL),),表示没找到。表示没找到。 #include “stdio.h” /*程序(例10.17):*/ main() char *search(char *str,char ch); char ss80,*p,chr;printf(“n input a string;“); gets(ss);printf(“n input a char for search:“); chr=getchar();p=search(ss,chr);i

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

当前位置:首页 > 行业资料 > 其它行业文档

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