收藏 分享(赏)

c语言-指针教案.ppt

上传人:gnk289057 文档编号:6921929 上传时间:2019-04-27 格式:PPT 页数:61 大小:2.07MB
下载 相关 举报
c语言-指针教案.ppt_第1页
第1页 / 共61页
c语言-指针教案.ppt_第2页
第2页 / 共61页
c语言-指针教案.ppt_第3页
第3页 / 共61页
c语言-指针教案.ppt_第4页
第4页 / 共61页
c语言-指针教案.ppt_第5页
第5页 / 共61页
点击查看更多>>
资源描述

1、,指 针,内 容 提 要,指针的概念; 定义指向各种数据类型的指针; 指针做函数的参数;难点:指针与数组应用 用字符数组存取字符串; 使用字符串处理函数处理字符串; 结构体。,第一节 变量的地址和指针第二节 指针变量的定义和引用第三节 指针与数组第四节 指针与字符串第五节 指针与结构体第六节 指针与函数,练习题,第一节 变量的地址和指针,一、地址和指针 二、访问变量的方式 三、指针变量,寻找保险箱密码,一个关于特工008寻找保险箱密码的故事 关键点分析 得到线索:0217单元的“虎跑号”寄存箱 提示地址:1976单元 找到目标:“龙井号”寄存箱 取出内容:911,寻找密码的途径分析,密码911

2、存放在某个寄存箱内,如果我们知道这个寄存箱的名字,就能够找到密码 如果不知道密码所在的寄存箱名字,知道该寄存箱的地址也照样能够取出密码 如果寄存箱的地址也不知道,但是有另外一个地方存放这个寄存箱的地址,就能顺藤摸瓜,间接找到密码,密码存放示意图,利用指针模拟寻找保险箱密码的过程,获取密码的两种方法 int main(void) int key = 911; /* 变量key存放密码 */int *addr; /* 变量addr存放地址 */addr = ,The key is: 911 If I know the address of the key, I also can get it: 9

3、11,地址和指针,内存单元 地址 内容 变量,int x = 20, y = 1, z = 155; printf(“%d“, x;),直接访问:通过变量名访问,间接访问:通过另一个变量访问 把变量的地址放到另一变量中 使用时先找到后者 再从中取出前者的地址,地址 指针变量,地址在程序中所定义的变量,编译系统会根据变量的类型,分配一定长度的存储空间。内存中每一个存储单元的有唯一编号。如: int a 4个字节float b 4个字节,6,5.3,2000,2004,2008,a,b,指针指针就是地址,地址和指针,直接访问方式按变量的地址存取变量的值 。 间接访问方式按变量的地址的地址存取变量的

4、值。,访问变量的方式,指针一个变量的地址称为该变量的指针。如地址2000是变量a的指针。 指针变量如果有一个变量专门用来存放另一个变量的地址(即指针),称为指针变量。如pa是一个指针变量,pa中的值为指针。,指针变量,一、指针变量的定义 二、指针变量的引用,第二节 指针变量的定义和引用,数据类型说明符 *标识符;例如: int * pt;,定义,指向整型变量的指针变量,合法标识符,指针变量名,第二节 指针变量的定义和引用,例如 int a,b;int *p1,*p2;p1,引用,第二节 指针变量的定义和引用, C语言中的指针运算符&:取变量地址运算符*:“指向”运算符或称“间接访问”运算符 例

5、如:&a 变量a的地址*p 指针变量p所指向的变量,#include void main( ) int a,*pi; float f,*pf; a=10; f=1.5; pi= ,例6.1 指针变量的使用,pi,pf,a,f,&a,&f,1.5,10,10,1.500000 10,1.500000,#include void main() int a,b,*p,*p1,*p2;a=3;b=6;p1= ,单击鼠标,演示程序的执行过程:,p1,p2,p,a,b,&a,&b,6,3,&a,&b,&a,例6.2 交换指针的指向,#include void main() int a,b,temp,*p1

6、,*p2;a=3;b=6;p1= ,p1,p2,temp,a,b,&a,&b,6,3,例6.3 交换指针指向的变量值,6,3,3,一、指向一维数组的指针变量二、*指向二维数组的指针变量,第三节 指针与数组,定义int a5;int *p;p&a0;或pa; 说明指针的类型必须同于数组元素的类型 定义指针的同时赋予数组的首地址。 例如: int a8;int *pa;,指向一维数组的指针变量,a0,a1,a2,a3,a4,a0,a1,a2,a3,a4,通过指针变量来引用一维数组的元素,例如:int a8,i;int *pa; 下标法:用ai 来引用数组a的第i个数组元素, 指针法:用*(ai),

7、*(pi)引用数组的第i个数组元素。,#include void main() int a10,*p ,i;for(i=0; i10; i+) ai=i;for(p=a; p(a+10); p+)printf(“%d “,*p);,例6.6 数组元素的引用,#include void main() int a10,i;for( i=0; i10; i+)ai=i;for(i=0;i10;i+)printf(“%d “,ai);*(a+i);,p+使指针p指向数组的下一个元素。*p+等价于*(p+),其作用是先得到p指向变量的值(即*p),然后再使p+1赋给p。*(p+)与*(+p)的作用不同。

8、前者是先取*p的值,然后使指针变量p加1;后者是先使指针变量p的值加1,再取*p。p+n 只是地址变化,指针没有移动。,指针运算,#include void main( ) int x =1,2,3,4,5,6,7,8,9,0;int *p=x;printf(“%dt”,*p+);printf(“%dt”,*(p+8);printf(“%dn”,*-p);,练习,1 0 1,用指针变量来作为函数的参数,根据形式参数和实际参数的用法可以有以下4种形式:实际参数:数组名 指针变量形式参数:数组名 指针变量,指针变量作为函数的参数,#include void main( ) int a10=1,3,

9、5,7,9,11,13,15,17,19;int i,*p; void invert(int *p,int n );p=a; printf(“数组交换前的顺序为:n”); for(i=0;i10;i+) printf(“%5d”,ai); invert(p,10); printf(“n数组交换后的顺序为:n”);for(i=0;i10;i+)printf(“%5d”,ai);,例6.7 将数组中的n个数逆序存放,指针当实参,void invert(int *p,int n) int i,*q,temp;q=p+n-1;for(i=0;in/2;i+) temp=*p;*p=*q;*q=temp

10、;p+;q-; ,函数定义,一、字符串的表示形式 二、指向字符串指针变量的应用,第四节 指针与字符串, 两种方法 用字符数组实现 例如: char str“C language”; 用字符指针实现 例如: char *pstr“C language”;或 char *pstr;pstr= “C language”;,字符串的表示形式,#include void main( ) int strlenth(char *p);char str80;int i,len;char *p; gets(str);p=str;len=strlenth(p);printf(“%5d”,len);,例 6.8 写

11、一函数,求一个字符串的长度(c68.cpp),int strlenth(char *p) int len=0;while(*p!=0) len=len+1;p+; return(len);,#include void main( ) char st20,*pc;pc=st;scanf(“%s”,pc);printf(“%sn”,pc);,指向字符串指针变量的应用,例6.9 输入一字符串并输出,用字符指针变量来实现。,w,0,!,e,#include void main( ) char a80,b80,*pa,*pb;pa=a; pb=b;gets(pa);while(*pa!=0) *pb=*

12、pa;pa+; pb+; *pb=0;printf(“%s”,b) ;,例 6.10 将字符串a复制到字符串b。,0,pa,pb,a0,b0,#include void main( ) char *s1=“C language“;s1+=2;printf(“%sn“,s1);,例6.11 输出字符串中的部分数据,运行结果 language,#include “stdio.h”void main( ) void del_ch(char *p,char ch );char str80,*pt,ch;printf(“pls enter a str:n”);gets(str); pt=str; pri

13、ntf(“pls enter the char deleted:n”); ch=getchar();del_ch(pt,ch); printf(“the new stirng is:n%sn”,str);,例6.12 有一行字符,要求删去指定的字符。例如:“He has 350$.”如果删去“0”,则变为“He has 35$”。,void del_ch(char *p,char ch) char *q=p;for(; *p!=0;p+)if(*p!=ch)*q=*p;q+; *q=0;,指向结构体变量的指针,定义了一个struct stud类型,可用下面形式定义一个指向这种类型数据的指针变量

14、:struct stud *p; 用指针变量p可以指向任一个属于struct stud类型的结构体变量。,第五节 指针与结构体,例6.12-1 定义指向结构体的指针变量#include “stdio.h“#include “string.h“struct stud long num;char name20;char gender;int age;float score;,void main() struct stud student1;struct stud *p;p=,printf(“No:%ldnname:%sn gender :%cn age:%dnscore:%6.2fn“,stude

15、nt1.num, student1.name,student1. gender,student1.age, student1.score); printf(“nNo:%ldnname:%sn gender :%cn age:%dnscore:%6.2fn“, (*p).num, (*p).name,(*p). gender,(*p).age,(*p).score);,程序运行结果如下: No:970101 name:Liu Li gender:M age:16 score: 95.50 No:970101 name:Liu Li gender :M age:16 score: 95.50,说明

16、(*p)nump- num 等价“-”运算符的优先级别最高。,一、指针作函数的参数二、函数返回指针三、函数指针,第六节 指针与函数,指针变量存放的是地址值,同样可以作为函数的参数来进行“地址传送”。 实际参数为地址常量或指针变量 形式参数为指针变量。,指针作函数的参数,void main() int a,b,max;int *pa,*pb;printf(“输入a 和 b:n“);scanf(“%d,%d“,#include void swap(int *p1,int *p2) int temp;temp=*p1;*p1=*p2;*p2=temp;,例6.13 用函数来实现求两数中的大者,swa

17、p( )能否写成下面这种形式呢?swap(int *p1,int *p2) int *p;p=p1;p1=p2;p2=p;,?,函数返回指针,定义形式类型说明符 *函数名(参数表) 函数体 例如:int *search(int *x, int n) int *p;p=x+n;return(p); ,例6.14 对例6.13的功能用返回指针的函数来实现,#include int *max( int * p1,int * p2) int *r;if(*p1 *p2) r = p1; else r = p2; return r; int main() int a,b;int *p;printf(“输

18、入a 和 b:n“);scanf(“%d,%d“,例6.15 解密藏头诗,#include int main() char *change(char s20,char t);int i;char s420,t10,*p;printf(“请输入诗:n“);for(i=0;i4;i+)scanf(“%s“,si);p=change(s,t);printf(“解密:n“);printf(“%sn“,p);return 0; ,char *change(char s20,char t) int i;for(i=0;i4;i+) t2*i=si0;t2*i+1=si1; t2*i=0;return t;

19、,一叶轻舟向东流 帆梢轻握杨柳手 风纤碧波微起舞 顺水任从雅客悠, 一个函数在内存中占一片存储空间 。在函数被编译时,被分配给一个入口地址,这个入口地址就称为函数的指针。 用一个指针变量指向函数,然后用指向函数的指针变量代替函数名来调用这个函数。,函数指针, 形式: 类型说明符 (*指针变量名)(参数表 );例如: int (*p)(int,int);表示定义了一个指向函数的指针变量p,函数的返回值是整型。 函数的调用形式(*指针变量)(实参表列); 例如:(*p) (a,b);,注意!,与 int *p( )的区别,函数指针的定义,练习题,1.有以下程序 #include void main

20、() char *s=“ABC”;do printf(“ %d”, *s%10); s+;while(*s); A)5670 B)656667 C) 567 D) ABC,C,2.有以下程序 #include void fun(char *s) while(*s) if(*s%2=0) printf(“ %c”, *s);s+; void main() char a=“good”;fun(a);printf(“n”); 注意:字母a的ASCII码值为97,程序运行后的输出结果是 A) d B) go C) god D) good,A,3.#include void fun(int *a, in

21、t *b) int *c;c=a; a=b; b=c; void main() int x=3,y=5,*p= 程序运行后的输出结果是 A) 3,5,5,3 B) 3,5,3,5 C) 5,3,3,5 D) 5,3,5,3,B,4.有以下程序 #include int b=2; int fun(int *k) b=*k+b; return (b); void main() int a10=1,2,3,4,5,6,7,8, i;for(i=2;i4;i+) b=fun( 程序运行后的输出结果是 A) 10 12 B) 8 10 C)10 28 D) 10 16,C,5.写出程序运行结果 #inc

22、lude void p (int *x, int y) +*x;y-;void main ( ) int x=0,y=3;p ( ,1,3,6.写出程序运行结果#include #include void main ( ) char a =“Language”, b20;char *p1, *p2; int k, n;n=strlen(a);p1=a+n-1; p2=b; for ( k=0; kn; k+) *p2=*p1; p1-; p2+;*p2=0;puts(b); ,逆序复制,#include #include void main() void change(char *p);cha

23、r str80, *p; gets(str);p=str;change(p);puts(str); ,void change(char *p) char *q;q=p;for(;*q!=0;q+) if(*q=A 输入abc123ABC,7.写出程序运行结果,ABC123abc,9 利用函数abcd来交换main中的两个变量的值。#include void main( ) void abcd(float *x,float *y);float x=10, y=20;abcd ( ); printf (“%.1f, %.1fn“, x, y); void abcd (float *x, float *y) float temp;temp = ; ; ;,10.编写一个函数将给定字符串中的大写字母转换成小写字母,主函数中输入一个字符串,调用该子函数,进行转换,将原字符串及转换后的字符串输出。,#include #include void main() void change(char *p);char str80, *p; gets(str);p=str;change(p);puts(str);,void change(char *p) char *q;q=p;for(;*q!=0;q+) if(*q=A ,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 网络科技 > C/C++资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报