善于利用指针1课件.pptx
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《善于利用指针1课件.pptx》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 善于 利用 指针 课件
- 资源描述:
-
1、C语言程序设计Soochow University1主要内容F地址和指针的概念地址和指针的概念F变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量F数组的指针和指向数组的指针变量数组的指针和指向数组的指针变量F字符串的指针和指向字符串的指针变量字符串的指针和指向字符串的指针变量F函数的指针和指向函数的指针变量函数的指针和指向函数的指针变量F返回指针值的函数返回指针值的函数F指针数组和指向指针的指针指针数组和指向指针的指针F有关指针的数据类型和指针运算的小结有关指针的数据类型和指针运算的小结F习题习题C语言程序设计Soochow University28.1 指针是什么C语言程序设计S
2、oochow University3地址和指针的概念F变量定义时的内存分配变量定义时的内存分配a如果在程序中定义了一个变量,在编如果在程序中定义了一个变量,在编译时就给这个变量分配内存单元。系译时就给这个变量分配内存单元。系统根据程序中定义的变量类型,分配统根据程序中定义的变量类型,分配一定长度的空间。一定长度的空间。F内存单元的地址和内存单元的内内存单元的地址和内存单元的内容这两个概念的区别容这两个概念的区别a内存区的每一个字节有一个编号,内存区的每一个字节有一个编号,这就是这就是“地址地址”,它相当于旅馆,它相当于旅馆中的房间号。中的房间号。a在地址所标志的内存单元中存放在地址所标志的内存
3、单元中存放数据,这相当于旅馆中各个房间数据,这相当于旅馆中各个房间中居住旅客一样。中居住旅客一样。C语言程序设计Soochow University4地址和指针的概念F变量的变量的“直接访问直接访问”方式通过变量名来访问方式通过变量名来访问a在程序中一般是通过变量名来对内存单元进行存取操作的。其实在程序中一般是通过变量名来对内存单元进行存取操作的。其实程序经过编译以后己经将变量名转换为变量的地址,对变量值的程序经过编译以后己经将变量名转换为变量的地址,对变量值的存取都是通过地址进行的。存取都是通过地址进行的。F变量的变量的“间接访问间接访问”方式方式保存变量地址的变量:保存变量地址的变量:i_
4、pointer=&i;这时,这时,i_pointer的值就是的值就是2000,即变量,即变量i所占用单元的起始地址。所占用单元的起始地址。变量的变量的“间接访问间接访问”过程过程:先找到存放先找到存放“i的地址的地址”的变量,即的变量,即i_pointer,从中取出,从中取出i的地址的地址(2000),然后到,然后到2000、2001字节取出字节取出i的值的值(3)。C语言程序设计Soochow University5地址和指针的概念F“直接访问直接访问”和和“间接访问间接访问”方式下变量的存储过程方式下变量的存储过程为了表示将数值为了表示将数值3送到变量中,可以有两种表达方法送到变量中,可以
5、有两种表达方法:(1)将将3送到变量送到变量i所标志的单元中。所标志的单元中。(2)将将3送到变量送到变量i_pointer所所“指向指向”的单元的单元(即即i所标志的单元所标志的单元)中。见上图。所谓中。见上图。所谓“指向指向”就是通过地址来体现的。就是通过地址来体现的。F“指针指针”和和“指针变量指针变量”一个变量的地址称为该变量的一个变量的地址称为该变量的“指针指针”。如果有一个变量专门用来存放另一变量的地址如果有一个变量专门用来存放另一变量的地址(即指针即指针),则它,则它称为称为“指针变量指针变量”。指针变量的值指针变量的值(即指针变量中存放的值即指针变量中存放的值)是指针是指针(地
6、址地址)。请区分。请区分“指针指针”和和“指针变量指针变量”这两个概念。这两个概念。C语言程序设计Soochow University68.2 指针变量C语言程序设计Soochow University7定义一个指针变量F指针变量也必须指针变量也必须先先定义后定义后使用使用F定义指针变量的一般形式:定义指针变量的一般形式:a基类型基类型*指针变量名指针变量名F指针变量的基类型:指针变量的基类型:a用来指定该指针变量可以指向的变量的类型。用来指定该指针变量可以指向的变量的类型。a指针变量只能用来指向和其基类型指针变量只能用来指向和其基类型的变量,如基类型为的变量,如基类型为int的指针变量只能用
7、来指向整型变量,的指针变量只能用来指向整型变量,。aint*pointer_1,*pointer_2,a;a用赋值语句可使一个指针变量指向另一个变量用赋值语句可使一个指针变量指向另一个变量C语言程序设计Soochow University8在定义指针变量时要注意两点F(1)指针变量前面的指针变量前面的“*”,表示该变量的类型为,表示该变量的类型为指针型变量。指针型变量。a注意:注意:指针变量名是指针变量名是pointer_1、pointer_2,而不是,而不是*pointer_1、*pointer_2。F(2)在定义指针变量时必须指定基类型。例如只在定义指针变量时必须指定基类型。例如只有整型变
8、量的地址才能放到指向整型变量的指针有整型变量的地址才能放到指向整型变量的指针变量中。变量中。C语言程序设计Soochow University9指针变量的引用F指针变量中只能存放地址指针变量中只能存放地址(指针指针),不要随便将一个整型不要随便将一个整型常量常量(或任何其他非地址类型的数据或任何其他非地址类型的数据)赋给一个指针变量赋给一个指针变量。F两个有关的运算符两个有关的运算符a(1)&:取地址运算符。取地址运算符。a(2)*:指针运算符指针运算符(或称或称“间接访问间接访问”运算符运算符)。例如:例如:&a为变量为变量a的地址,的地址,*p为指针变量为指针变量p所指向的存储单元。所指向
9、的存储单元。F注意:指针使用前必须先初始化!注意:指针使用前必须先初始化!apointer_1=&i;注意:注意:规则修改:指针必须先定义并且初始化后,才可以使用规则修改:指针必须先定义并且初始化后,才可以使用C语言程序设计Soochow University10指针变量的引用程序举例例:通过指针变量访问整型变量。例:通过指针变量访问整型变量。main()int a,B,*pointer_1,*pointer_2;/*这里出现这里出现*表示指针定义表示指针定义*/a=100;B=10;/*把变量把变量a的地址赋给的地址赋给pointer_1,不是,不是*pointer_1=&a*/pointe
10、r_1=&a;/*把变量把变量B的地址赋给的地址赋给pointer_2,不是不是*pointer_2=&a*/pointer_2=&B;printf(%d,%dn,a,B);/*这里出现的这里出现的*表示对指针的使用表示对指针的使用*/printf(“%d,%dn”,*pointer_1,*pointer_2);/这里会出现什么结果这里会出现什么结果?prinft(“%d,%dn”,pointer_1,pointer_2);运行结果为:运行结果为:100,10100,10C语言程序设计Soochow University11对“&”和“*”运算符的深入说明F(1)如果已执行了如果已执行了“po
11、inter_1=&a;”语句,若有语句,若有&*pointer_1它的含义是什么?它的含义是什么?a&*pointer_1相当于相当于&aapointer_2=&*pointer_1apointer_2=pointer_1C语言程序设计Soochow University12(2)*&a的含义是什么?与a等价;*&a和*pointer_1的作用是一样的(假设已执行了“pointer_1=&a”),它们等价于变量a。即*&a与a等价,见图(3)(*pointer_1)+相当于a+。注意括号是必要的,如果没有括号,就成为了*pointer_1+,+和*为同一优先级别,相当于先做*pointer_1
12、,然后做pointer_1+对对“&”和和“*”运算符的深入说明运算符的深入说明C语言程序设计Soochow University13例:输入a和B两个整数,按先大后小的顺序输出a和B。main()int*p1,*p2,*p,a,B;scanf(%d,%d,&a,&B);p1=&a;p2=&B;if(aB)p=p1;p1=p2;p2=p;printf(na=%D,B=%Dnn,a,B);printf(max=%D,min=%Dn,*p1,*p2);运行情况如下:运行情况如下:5,9a=5,B=9max=9,min=5 当输入当输入a=5,B=9时,由于时,由于aB,将,将p1和和p2交交换。交
13、换前的情况见图换。交换前的情况见图(a),交换后见图,交换后见图(b)。结论:在使用指针时,结论:在使用指针时,我们要清楚操作的是指我们要清楚操作的是指针本身,还是指针所指针本身,还是指针所指向的变量向的变量C语言程序设计Soochow University14函数的参数回顾F形式参数和实际参数形式参数和实际参数a二者具有各自独立的内存空间二者具有各自独立的内存空间aC语言中函数参数传值是单向的语言中函数参数传值是单向的实际参数实际参数 形式参数形式参数F例如:例如:void swap(int n1,int n2)int temp;if(n1 n2)temp=n1;n1=n2;n2=temp;
14、void main()int a,b;scanf(%d%d,&a,&b);printf(a=%d;b=%d,a,b);swap(a,b);printf(a=%d;b=%d,a,b);输入输入:9 5输出输出:a=9;b=5输出输出:a=9;b=5C语言程序设计Soochow University15函数的参数回顾F函数的调用过程函数的调用过程a首先把首先把a、b的值复制到的值复制到swap函函数的堆栈区间,并赋值给行参数的堆栈区间,并赋值给行参n1、n2.a交换交换n1、n2的值。的值。a返回。返回。95调用函数运行状态返回地址9 /55 /99main()swap()abn1n2temp栈区
15、结果结果被调函数进行的操作被调函数进行的操作结果无法反应在主调函结果无法反应在主调函数中。数中。用传地址的形式用传地址的形式C语言程序设计Soochow University16指针作为函数参数F指针作为函数参数指针作为函数参数a将一个变量的地址传到另一个函数中。将一个变量的地址传到另一个函数中。F例如:例如:void swapp(int*n1,int*n2)int temp;if(*n1*n2)temp=*n1;*n1=*n2;*n2=temp;void main()int a,b;scanf(%d%d,&a,&b);printf(a=%d;b=%d,a,b);swapp(&a,&b);pr
16、intf(a=%d;b=%d,a,b);输入输入:9 5输出输出:a=9;b=5输出输出:a=5;b=9C语言程序设计Soochow University17指针作为函数参数F函数的调用过程函数的调用过程a首先把首先把a、b的地址值复制到的地址值复制到swapp函数的堆栈区间,并赋值给行参函数的堆栈区间,并赋值给行参n1、n2.a交换交换n1、n2所指向内存单元的值。所指向内存单元的值。a返回。返回。结果结果被调函数进行的操作结果反应被调函数进行的操作结果反应在主调函数中。在主调函数中。被调函数实际上是在主调函数被调函数实际上是在主调函数的堆栈区间中进行的操作的堆栈区间中进行的操作实际是一种地
17、址传递方式实际是一种地址传递方式95调用函数运行状态返回地址200820049main()swap()abn1n2temp栈区20042008C语言程序设计Soochow University18指针作为函数参数F指针变量作为函数参数典型错误举例一指针变量作为函数参数典型错误举例一swap(int*n1,int*n2)int*temp;*temp=*n1;*n1=*n2;*n2=*temp;F问题:问题:atemp没有初始化,指向的内存单元是不确定的没有初始化,指向的内存单元是不确定的C语言程序设计Soochow University19指针作为函数参数F指针变量作为函数参数典型错误举例二指针
18、变量作为函数参数典型错误举例二swap(int*n1,int*n2)int*p;p=n1;n1=n2;n2=p;95调用函数运行状态返回地址2008 /20042004 /20082008main()swap()abn1n2 p栈区20042008问题问题交换的只是两个形参所指向的内存单元。交换的只是两个形参所指向的内存单元。C语言程序设计Soochow University20指针变量作为函数参数F C语言中实参变量和形参变量之间的数据传递是语言中实参变量和形参变量之间的数据传递是单向的单向的“值传递值传递”方式。方式。指针变量作函数参数也指针变量作函数参数也要遵循这一规则,这时的值是指针的
19、值,也就是要遵循这一规则,这时的值是指针的值,也就是地址值。地址值。F 调用函数不可能改变实参指针变量的值,但可以调用函数不可能改变实参指针变量的值,但可以改变实参指针变量所指变量的值。改变实参指针变量所指变量的值。F 运用指针变量作参数,可以从函数调用中得到多运用指针变量作参数,可以从函数调用中得到多个变化了的值。如果不用指针变量是难以做到这个变化了的值。如果不用指针变量是难以做到这一点的。参考下例:一点的。参考下例:C语言程序设计Soochow University21指针作函数参数的实例main()int a,B,C,*p1,*p2,*p3;scanf(%d,%d,%d,&a,&B,&C
20、);p1=&a;p2=&B;p3=&C;exchange(p1,p2,p3);printf(n%d,%d,%dn,a,B,C);swap(int*pt1,int*pt2)int temp;temp=*pt1;*pt1=*pt2;*pt2=temp;exchange(int*q1,int*q2,int*q3)if(*q1*q2)swap(q1,q2);if(*q1*q3)swap(q1,q3);if(*q2*q3)swap(q2,q3);运行情况如下:运行情况如下:9,0,10 10,9,0指针举例 编写一个函数,实现将大写字母转换从小写字母,小写字母转换成大写字母。在main函数中测试该函数的
21、正确性。C语言程序设计Soochow University22C语言程序设计Soochow University238.3 通过指针引用数组C语言程序设计Soochow University24数组的指针和指向数组的指针变量F数组的指针数组的指针是指数组的起始地址是指数组的起始地址F数组元素的指针数组元素的指针是数组元素的地址。是数组元素的地址。F指向数组元素的指针指向数组元素的指针a定义一个指向数组元素的指针变量的方法,与以前介绍的指向变定义一个指向数组元素的指针变量的方法,与以前介绍的指向变量的指针变量相同。量的指针变量相同。例如:例如:int a10;int *p;p=&a0;C语言程序
22、设计Soochow University25指向数组元素的指针FC语言规定数组名代表数组的首地址,也就是第语言规定数组名代表数组的首地址,也就是第0号元素的地址。号元素的地址。下面语句等价:下面语句等价:p=&a0;p=a;或者或者int*p=&a0;int *p=a;a注意注意数组名数组名a不代表整个数组,上述不代表整个数组,上述“p=a;”的作用是的作用是“把把a数组的数组的首地址赋给指针变量首地址赋给指针变量p”,而不是,而不是“把数组把数组a各元素的值赋给各元素的值赋给p”。C语言程序设计Soochow University26通过指针引用数组元素F通过指针对数组元素赋通过指针对数组元
展开阅读全文