指针详细讲解课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《指针详细讲解课件.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 指针 详细 讲解 课件
- 资源描述:
-
1、Chap 8 指针指针 8.1 密码开锁密码开锁 8.2 角色互换角色互换 8.3 冒泡排序冒泡排序 8.4 电码加密电码加密 8.5 任意个整数求和任意个整数求和*本章要点本章要点n变量、内存单元和地址之间是什么关系?变量、内存单元和地址之间是什么关系?n如何定义指针变量,怎样才能使用指针变量?如何定义指针变量,怎样才能使用指针变量?n什么是指针变量的初始化?什么是指针变量的初始化?n指针变量的基本运算有哪些?如何使用指针指针变量的基本运算有哪些?如何使用指针操作所指向的变量?操作所指向的变量?n指针作为函数参数的作用是什么?指针作为函数参数的作用是什么?n如何使用指针实现函数调用返回多个值
2、?如何使用指针实现函数调用返回多个值?n如何利用指针实现内存的动态分配?如何利用指针实现内存的动态分配?8.1 密码开锁密码开锁 一个一个密室逃脱游戏密室逃脱游戏中的密码开锁:中的密码开锁:2626个寄存箱,每个寄存箱个寄存箱,每个寄存箱上按顺序都有一个英文字母和一个编号,字母从上按顺序都有一个英文字母和一个编号,字母从A A到到Z Z,编号,编号从从0101到到2626关键点分析关键点分析n得到线索:得到线索:找到一把钥匙,打开找到一把钥匙,打开p寄存箱(编号为寄存箱(编号为16)n提示地址:提示地址:里面是一把刻着数字里面是一把刻着数字24的钥匙的钥匙n找到目标:找到目标:打开编号为打开编
3、号为24的的X寄存箱寄存箱n取出内容:取出内容:“5342”8.1 寻找密码的途径分析寻找密码的途径分析n密码存放需要一定的存储空间作为存放地,每密码存放需要一定的存储空间作为存放地,每个存放地都会有地址个存放地都会有地址 n如果知道了存放地的名字,当然能够找到密码如果知道了存放地的名字,当然能够找到密码n如果不知道存放地的名字,知道该存放地的地如果不知道存放地的名字,知道该存放地的地址也能够取出密码址也能够取出密码 n如果有另外一个地方存放了该密码存放地的地如果有另外一个地方存放了该密码存放地的地址,那么就能顺藤摸瓜,间接找到密码址,那么就能顺藤摸瓜,间接找到密码8.1 密码存放示意图密码存
4、放示意图534224p2416名字名字px地址地址1624内容内容245342x例例8-1 利用指针模拟利用指针模拟密码开锁游戏密码开锁游戏获取密码的两种方法获取密码的两种方法:#include int main(void)int x=5342;/*变量变量x用于存放密码值用于存放密码值5342*/int*p=NULL;/*定义整型指针变量定义整型指针变量p,NULL值为值为0,代表空指针,代表空指针*/p=&x;/*将变量将变量x的地址存储在的地址存储在p中中*/*通过变量名通过变量名x输出密码值输出密码值*/printf(If I know the name of the variable
5、,I can get its value by name:%dn,x);/*通过变量通过变量x的地址输出密码值的地址输出密码值*/printf(If I know the address of the variable is:%x,then I also can get its value by address:%dn,p,*p);return 0;If I know the name of the variable,I can get its value by name:5342If I know the address of the variable is:12ff7c,then I al
6、so can get its value by address:53428.1.2 地址和指针地址和指针指针指针的的概念概念 内存单元内存单元地址地址 内容内容 变量变量int x=20,y=1,z=155;printf(%d,x;)直接访问直接访问:通过变量名访问:通过变量名访问间接访问间接访问:通过通过另一个变量访另一个变量访问问把变量的地址放到另一变量中把变量的地址放到另一变量中使用时先找到后者使用时先找到后者再再从中取出前者的地址从中取出前者的地址1000 20 x1002 1 y1004 155 z2000 1000 p2002地址地址 指针变量指针变量指针指针 内存单元内存单元地址
7、地址 内容内容 变量变量int x=20,y=1,z=155;printf(%d,x;)1000 20 x1002 1 y1004 155 z2000 1000 p2002地址地址 指针变量指针变量指针变量指针变量:存放地址的变量:存放地址的变量某个某个变量变量的地址的地址指向指向指针变量所指向的变量的类型指针变量所指向的变量的类型int *p;p 是整型指针,指向整型变量是整型指针,指向整型变量float*fp;fp 是浮点型指针,指向浮点型变量是浮点型指针,指向浮点型变量char*cp;cp 是字符型指针,指向字符型变量是字符型指针,指向字符型变量类型名类型名 *指针变量名指针变量名指针声
8、明符指针声明符8.1.3 指针变量的定义指针变量的定义指针变量的定义指针变量的定义类型名类型名 *指针变量名指针变量名int *p;指针变量名是指针变量名是 p,不是不是*p*是指针声明符是指针声明符int k,*p1,*p2;等价于:等价于:int k;int *p1;int *p2;定义多个指针变量时,每一个指针变量定义多个指针变量时,每一个指针变量前面都必须加上前面都必须加上*8.1.4 指针的基本运算指针的基本运算*间接访问运算符间接访问运算符,访问指针所指向的变量访问指针所指向的变量*p:指针变量指针变量 p 所所指向的指向的变量变量a3&ap*p如果指针的值是某个变量的地址,通过指
9、针就如果指针的值是某个变量的地址,通过指针就能能间接访问间接访问那个变量。那个变量。1、取地址运算和间接访问运算、取地址运算和间接访问运算&取地址运算符取地址运算符,给出变量的地址给出变量的地址int*p,a=3;p=&a;把把 a 的地址赋给的地址赋给 p,即即 p 指向指向 a指针变量的类型和它所指向变量的类型相同指针变量的类型和它所指向变量的类型相同#include int main(void)int a=3,*p;p=&a;printf(“a=%d,*p=%dn”,a,*p);*p=10;printf(a=%d,*p=%dn,a,*p);printf(Enter a:);scanf(%
10、d,&a);printf(a=%d,*p=%dn,a,*p);(*p)+;printf(a=%d,*p=%dn,a,*p);return 0;例例8-2指针取地址运算和间接访问运算指针取地址运算和间接访问运算 a3&ap*pa=3,*p=3a=10,*p=10Enter a:5 a=5,*p=5a=6,*p=6 a3&ap*p(1)当当 p=&a 后,后,*p 与与 a 相同相同(2)int*p;定义定义指针指针变量变量 p *p=10;指针指针p所指所指向向的变量的变量,即即a(3)&*p 与与&a 相同,相同,是是地址地址 *&a 与与 a 相同,相同,是是变量变量(4)(*p)+等价于等
11、价于 a+将将 p 所指所指向向的变量值加的变量值加1 *p+等价于等价于*(p+)先取先取*p,然后然后 p 自加,自加,此时此时p不再指向不再指向a说明说明 int a=1,x,*p;p=&a;x=*p+;2、赋值运算、赋值运算a3&ap1&ap2*p1*p2int a=3,*p1,*p2;p1=&a;把把 a 的地址赋给的地址赋给 p1,即即 p1 指向指向 ap2=p1;p2 也指向也指向 a相同类型的指针才能相互赋值相同类型的指针才能相互赋值1)指针变量在定义后也要先赋值再引用指针变量在定义后也要先赋值再引用 2)在定义指针变量时,可以同时对它赋初值在定义指针变量时,可以同时对它赋初
12、值 int a;int*p1=&a;int*p2=p1;3)不能用数值作为指针变量的初值,但可以将一不能用数值作为指针变量的初值,但可以将一 个指针变量初始化为一个空指针个指针变量初始化为一个空指针 int*p=1000;p=0;p=NULL;p=(int*)1732;8.1.5 指针指针变量变量的的初始化初始化使用强制类型转换使用强制类型转换(int*)来避免编译错误,不提倡来避免编译错误,不提倡8.2 角色互换角色互换如何通过函数调用实现代表如何通过函数调用实现代表2 2个角色的变量互个角色的变量互相相三套方案三套方案nswap1()swap1()nswap2()swap2()nswap3
13、()swap3()哪个方案能成功?哪个方案能成功?例例8-3 指针作为函数参数模拟角色互换指针作为函数参数模拟角色互换int main(void)int a=1,b=2;int*pa=&a,*pb=&b;void swap1(int x,int y),swap2(int*px,int*py),swap3(int*px,int*py);swap1(a,b);printf(“After calling swap1:a=%d b=%dn”,a,b);a=1;b=2;swap2(pa,pb);printf(“After calling swap2:a=%d b=%dn”,a,b);a=1;b=2;sw
14、ap3(pa,pb);printf(“After calling swap3:a=%d b=%dn”,a,b);return 0;调用哪个函数,可以交换调用哪个函数,可以交换main()中变量中变量a和和b的值的值?例例8-3 swap1()swap1(a,b);void swap1(int x,int y)int t;t=x;x=y;y=t;例例8-3 swap2()swap2(&a,&b);void swap2(int*px,int*py)int t;t=*px;*px=*py;*py=t;例例8-3 swap3()swap3(&a,&b);void swap3(int*px,int*py
15、)int*pt;pt=px;px=py;py=pt;After calling swap1:a=1,b=2After calling swap2:a=2,b=1After calling swap3:a=1,b=28.2.2 指针作为函数参数指针作为函数参数n函数参数包括函数参数包括实参实参和和形参形参,两者的类型要,两者的类型要一致一致,可以是指针类型可以是指针类型n如果如果实参实参是某个变量的是某个变量的地址地址,相应的,相应的形参形参就是就是指针指针n在在C语言中实参和形参之间的数据传递是语言中实参和形参之间的数据传递是单单向向的的“值传递值传递”方式方式 例例8-3 swap1()a1
16、2bx12y21swap1(a,b);void swap1(int x,int y)int t;t=x;x=y;y=t;在在swap1()函数中改变了形参函数中改变了形参x,y的值的值但不会反过来影响到实参的值但不会反过来影响到实参的值 swap1()不能改变不能改变main()函数中实参函数中实参a和和b的值的值 例例8-3 swap2()swap2(&a,&b);void swap2(int*px,int*py)int t;t=*px;*px=*py;*py=t;abpxpy12值传递,地址未变,值传递,地址未变,但存放的变量的值改变了但存放的变量的值改变了21在在swap2()函数中交换
17、函数中交换*px和和*py的值,主的值,主调函数中调函数中a和和b的值也相应交换了的值也相应交换了 例例8-3 swap3()swap3(&a,&b);void swap3(int*px,int*py)int*pt;pt=px;px=py;py=pt;abpxpy12值传递,形参指针的改变值传递,形参指针的改变不会影响实参不会影响实参swap3()中直接交换了形参指针中直接交换了形参指针px和和py的值的值 指针指针作为函数参数的应作为函数参数的应用用swap2(&a,&b);void swap2(int*px,int*py)int t;t=*px;*px=*py;*py=t;要通过函数调用来
18、改变主调函数中某个变量的值:要通过函数调用来改变主调函数中某个变量的值:(1)在主调函数中,在主调函数中,将该变量的地址或者指向该变量的将该变量的地址或者指向该变量的指针作为实参指针作为实参(2)在被调函数中,在被调函数中,用指针类型形参接受该变量的地址用指针类型形参接受该变量的地址(3)在被调函数中,改变形参所指向变量的值在被调函数中,改变形参所指向变量的值abpxpy1221After calling swap1:a=1,b=2After calling swap2:a=2,b=1After calling swap3:a=1,b=2通过指针实现函数调用返回多个值通过指针实现函数调用返回多
19、个值 例例8-4 输入年和天数,输出对应的年、月、日。输入年和天数,输出对应的年、月、日。例如:输入例如:输入2000和和61,输出,输出2000-3-1。定义函数定义函数month_day(year,yearday,*pmonth,*pday)用用2个指针作为函数的参数,带回个指针作为函数的参数,带回2个结果个结果int main(void)int day,month,year,yearday;void month_day(int year,int yearday,int*pmonth,int*pday);printf(“input year and yearday:”);scanf(%d%
20、d,&year,&yearday);month_day(year,yearday,&month,&day);printf(%d-%d-%d n,year,month,day);return 0;例例8-4void month_day(int year,int yearday,int*pmonth,int*pday)int k,leap;int tab 213=0,31,28,31,30,31,30,31,31,30,31,30,31,0,31,29,31,30,31,30,31,31,30,31,30,31,;/*建立闰年判别条件建立闰年判别条件leap*/leap=(year%4=0&yea
21、r%100!=0)|year%400=0;for(k=1;yearday tableapk;k+)yearday=yearday-tab leapk;*pmonth=k;*pday=yearday;input year and yearday:2000 61 2000-3-1 monthdaypmonthpday318.3 冒泡排序冒泡排序-程序解析程序解析 void bubble(int a,int n);int main(void)int n,a8;int i;printf(Enter n(n=8):);scanf(%d,&n);printf(Enter a%d:,n);for(i=0;i
22、n;i+)scanf(%d,&ai);bubble(a,n);printf(After sorted,a%d=,n);for(i=0;in;i+)printf(%3d,ai);return 0;void bubble(int a,int n)int i,j;for(i=1;i n;i+)for(j=0;j aj+1)t=aj;aj=aj+1;aj+1=t;Enter n(n=8):8Enter a8:7 3 66 3-5 22-77 2After sorted,a8=-77-5 2 3 3 7 22 66 8.3.2 数组和地址间的关系数组和地址间的关系int a100,*p;数组名代表一个地
23、数组名代表一个地址,它的值是数址,它的值是数组首元素的地址组首元素的地址(基地址)(基地址)a+i 是距数组是距数组a的的基地址的第基地址的第i个偏个偏移移3000 a0地址地址 内容内容 数组元素数组元素3002 a13198 a99 ai aa+1a+99a+i&ai*(a+i)sum=0;for(i=0;i 100;i+)sum=sum+ai ;*(a+i)下标运算符下标运算符 的含义的含义指针和数组的关系指针和数组的关系任何由数组下标来实现的操作都能用指针来任何由数组下标来实现的操作都能用指针来完成完成int a100,*p;p=a;或或p=&a0;pp+1p+99p+i3000 a0
24、地址地址 内容内容 数组元素数组元素3002 a13198 a99 ai aa+1a+99a+i&ai aia+i *(a+i)p+i *(p+i)&pi pip=a;sum=0;for(i=0;i 100;i+)sum=sum+pi;等价等价等价等价用指针完成对数组的操作用指针完成对数组的操作int a100,*p;移动指针移动指针 p3000 a0地址地址 内容内容 数组元素数组元素3002 a13198 a99 ai aa+1a+99a+isum=0;for(p=a;p=&a99;p+)sum=sum+*p;p p p#include int main(void)double a2,*p
25、,*q;p=&a0;q=p+1;printf(%dn,q-p);printf(%dn,(int)q-(int)p);return 0;例例8-6 使用指针计算数组元素个数和使用指针计算数组元素个数和数组元素的存储单元数数组元素的存储单元数 18指针指针p p和和q q之间元素的个数之间元素的个数指针指针p p和和q q之间的字节数之间的字节数地址值地址值 pq3000 a0地址地址 内容内容 数组元素数组元素3008 a1 aa+1double *p,*q;nq-p两个相同类型的指针相减,表示它们之间相隔的存储单元两个相同类型的指针相减,表示它们之间相隔的存储单元的数目的数目np+1/p-1指
展开阅读全文