C语言课件第10章指针.ppt_第1页
C语言课件第10章指针.ppt_第2页
C语言课件第10章指针.ppt_第3页
C语言课件第10章指针.ppt_第4页
C语言课件第10章指针.ppt_第5页
已阅读5页,还剩51页未读 继续免费阅读

下载本文档

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

文档简介

第10章 指针 主要内容:主要内容: (1 1)指针和地址)指针和地址 (2 2)指针常量和指针变量)指针常量和指针变量 (3 3)指针与数组的结合应用)指针与数组的结合应用 (4 4)指针与函数的结合应用)指针与函数的结合应用 (5 5)指针数组与指向指针的指针变量)指针数组与指向指针的指针变量 重点:重点: 指针变量的定义与引用指针变量的定义与引用 通过指针访问数组元素通过指针访问数组元素 指针变量作为函数参数指针变量作为函数参数 返回指针值的函数返回指针值的函数 10. 1 指针和指针变量 n例10.1:数据的直接访问与间接访问: main() a p int a, *p; FFD6H scanf(“%d“, p= /*变量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 指向 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指针变量的引用: 必须先定义,后使用 指针变量定义后,可以对其进行如下操作: 赋值、引用指针变量的值、访问指针变量指向的变量等 。如上例中通过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? 因为参数传递是单向的,对形参的改变不影响实参的值。 指针变量作函数参数 解决以上问题的方法是: 指向变量的指针变量作函数形参,接收主调函数 中实参变量的地址,实现传地址调用。 即在被调函数中通过指针变量访问(读取或修改 )主调函数中对应的变量,当返回主调函数后 ,主调函数就得到了这些已修改过的变量的值 。因此,“传地址”调用可以实现函数间多个数 据的“双向传递”。 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) /*交换两个变量的值*/ int 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 a5 After execute: pa=a; a0 a1 a5 a: pa pa+1 pa+2 例10. 5 分别用下标法和指 针法访问一维数组。 程序(1):下标法 main() int a 5=1,2,3,5,7, i; for(i=0; i str n例10.6编写函数实现:将数组中的n个整数逆序存放 。调用该函数实现将10个整数逆序存放。 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:输入任意字符串,通过字符数组名和字符 指针输出该字符串。 #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); 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未赋值就使用,这样可能使系统程 序或其他数据区受到破坏, 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+;q+; *q = 0; 思考: 若用字符数组作函数参数,如何实现?分析参数传递 的过程,有何区别? 结论:形参数组名相当于指针变量。 10.3 指针与函数 n指针变量作函数参数: 如果形参是指针变量,实参可以是变量的地址、数组 元素的地址(或数组名)、函数的首地址。 本节主要介绍:指向函数的指针的使用 n返回值指针值的函数(主要用于处理多个字符串) 重点:编写返回指针的函数 指向函数的指针 n函数的指针:即函数名,表示函数的首地址. 例10.15指向函数的指针变量的定义、引用 #include “math.h” main() double x,(*p)(),y; /*注意定义与引用中的*的区别*/ x=3.14/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型等,也可以返回其他类型的值,比如 指针类型。 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()的类型为指向字符数的类型为指向字符数 据的指针类型,参数有两个:字符型的据的指针类型,参数有两个:字符型的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); if(p=NULL)printf(“n not found.“); else printf(“n position:%d(count from 0)“,p-ss); char *search(char *str,char ch) /*注意:函数名前的* while(*str!=0) 表示该函数的返回值为指针*/ if(*str=ch) return(str); else str+; return(NULL); n返回指针值的函数的一般定义格式: 类型标识符 *函数名(形参表) 与其他函数的不同:函数名前有*,表示指针类型。 类型标识符说明该指针指向的数据的类型。 例10.18 编写两个字符串连接的函数,返回连接后的字 符串的首地址。 分析: 函数类型为返回指向字符型的指针,参数两个:均为 字符数组或字符型指针变量。 首先找到字符串str1的末尾,然后将字符串str2的字 符逐个送入str1,最后在str1的末尾加字符串结束标 记0。 #include “stdio.h“ char *my_strcat(char *str1, char *str2) char *p=str1; while(*p!=0) p+; /*find the end of str1*/ while(*str2!=0) *p+=*str2+; *p=0; return(str1); main() char s180=“we are “,s2 =“good friends.“,*p; puts(s1); puts(s2); p=my_strcat(s1,s2); puts(p); n*p+=*str2+;”的功能是: 将str2指向的字符赋给 p指向的单元(字符串str1中的指定位置),然后p和 str均指向下一个字符。该语句等价于 *p=*str2; p+; str2+; n再比如:字符串复制。 char *strcopy( char *s , char *t) char *p=s; while( *t!=0) *s=*t; s+; t+; *s=0; return p; 上面红色的语句等价于 : while ( (*s+ = *t+)!=0) ; 10.4 指针数组和指向指针的指针 n指针数组 n指向指针的指针 n命令行参数 要求:熟悉 10.4.1 指针数组 n指针数组实际上是指向相同类型数据的指针变量的 集合,每个数组元素相当于一个指针变量。 n指针数组的应用: 1)用于访问由多个字符串组成的二维字符数组。优点 是:节省内存、加快排序速度。 2)指针数组作main函数的形参。 n例10.19用指针数组指向给定的5个字符串,然后逐个 输出。 分析:5个字符串的首地址分别存放于指针数组的一个 元素中;因为要处理给定的字符串,所以在程序中 直接给出,而不是用户输入。 n程序:l10_4_1.c(下页) #include /*L10_4_1.c:*/ main() char *str =“basic“,“turbo c“, “fortran“, “vc+“, “java“; int i; for(i=0;i main() void sort(),prn(); char *str =“basic“, “turbo c“, “fortran“, “vc+“, “java“; sort(str,5); prn(str,5); void sort(char *v, int m) /*用选择法排序*/ int i, j, k; char *t; for(i=0; i0) k=j; if(k!=i) t=vk; vk=vi; vi=t; /*交换*/ void prn(char *v , int m) int i; for(i=0; i1) +argv; printf(“n%s“,*arg

温馨提示

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

评论

0/150

提交评论