指针C语言大学实用教程课件苏小红.ppt
《指针C语言大学实用教程课件苏小红.ppt》由会员分享,可在线阅读,更多相关《指针C语言大学实用教程课件苏小红.ppt(82页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第第第7 7 7 7章章章章 指针指针指针指针哈尔滨工业大学计算机科学与技术学院哈尔滨工业大学计算机科学与技术学院苏小红苏小红12022/12/11C语言大学实用教程 课件制作人 苏小红2内容提要内容提要 指针的概念;指针的概念;指针的概念;指针的概念;难点:对指针数据类型的理解难点:对指针数据类型的理解难点:对指针数据类型的理解难点:对指针数据类型的理解 用指针做函数参数;用指针做函数参数;用指针做函数参数;用指针做函数参数;利用字符指针存取字符串;利用字符指针存取字符串;利用字符指针存取字符串;利用字符指针存取字符串;字符数组和字符指针的区别与联系字符数组和字符指针的区别与联系字符数组和
2、字符指针的区别与联系字符数组和字符指针的区别与联系 指针数组应用;指针数组应用;指针数组应用;指针数组应用;指向数组的指针与指针数组的区别指向数组的指针与指针数组的区别指向数组的指针与指针数组的区别指向数组的指针与指针数组的区别 带参数的带参数的带参数的带参数的mainmain函数;函数;函数;函数;动态内存分配函数及其应用;动态内存分配函数及其应用;动态内存分配函数及其应用;动态内存分配函数及其应用;一维、二维动态数组的实现一维、二维动态数组的实现一维、二维动态数组的实现一维、二维动态数组的实现2022/12/11C语言大学实用教程 课件制作人 苏小红3为什么引入指针的概念为什么引入指针的概
3、念 铁杆铁杆铁杆铁杆C/C+C/C+程序员最挚爱的武器:指针程序员最挚爱的武器:指针程序员最挚爱的武器:指针程序员最挚爱的武器:指针 C/C+C/C+的高效、高能主要来自于指针的高效、高能主要来自于指针的高效、高能主要来自于指针的高效、高能主要来自于指针 很多不可能的任务由指针完成很多不可能的任务由指针完成很多不可能的任务由指针完成很多不可能的任务由指针完成 2022/12/11C语言大学实用教程 课件制作人 苏小红4为什么引入指针的概念为什么引入指针的概念 指针指针指针指针为函数提供修改变量值的手段为函数提供修改变量值的手段为函数提供修改变量值的手段为函数提供修改变量值的手段 为为为为C C
4、的动态内存分配系统提供支持的动态内存分配系统提供支持的动态内存分配系统提供支持的动态内存分配系统提供支持 为动态数据结构(如例链表、队列、二叉树等)提供支持为动态数据结构(如例链表、队列、二叉树等)提供支持为动态数据结构(如例链表、队列、二叉树等)提供支持为动态数据结构(如例链表、队列、二叉树等)提供支持 可以改善某些子程序的效率可以改善某些子程序的效率可以改善某些子程序的效率可以改善某些子程序的效率 2022/12/11C语言大学实用教程 课件制作人 苏小红5 计算机内的存储部件,所有指令和数据都保存在计算机内的存储部件,所有指令和数据都保存在计算机内的存储部件,所有指令和数据都保存在计算机
5、内的存储部件,所有指令和数据都保存在内存里内存里内存里内存里 速度快,但是掉电即失速度快,但是掉电即失速度快,但是掉电即失速度快,但是掉电即失 可以随机访问可以随机访问可以随机访问可以随机访问只要指明要访问的内存单元的只要指明要访问的内存单元的只要指明要访问的内存单元的只要指明要访问的内存单元的地址地址地址地址,就可以立即访问,就可以立即访问,就可以立即访问,就可以立即访问到该单元到该单元到该单元到该单元地址地址地址地址是一个无符号整数,其字长一般与主机相同是一个无符号整数,其字长一般与主机相同是一个无符号整数,其字长一般与主机相同是一个无符号整数,其字长一般与主机相同内存中的每个字节都有唯一
6、的一个地址内存中的每个字节都有唯一的一个地址内存中的每个字节都有唯一的一个地址内存中的每个字节都有唯一的一个地址地址按字节编号,按类型分配空间地址按字节编号,按类型分配空间地址按字节编号,按类型分配空间地址按字节编号,按类型分配空间内存(内存(Random Access Memory)地址(地址(Address)2022/12/11C语言大学实用教程 课件制作人 苏小红6寻址方式寻址方式 如何读写内存中的数据?如何读写内存中的数据?如何读写内存中的数据?如何读写内存中的数据?通过变量的地址访问变量所在的通过变量的地址访问变量所在的通过变量的地址访问变量所在的通过变量的地址访问变量所在的存储单元
7、存储单元存储单元存储单元 两种寻址方式两种寻址方式两种寻址方式两种寻址方式 直接(寻址)访问直接(寻址)访问直接(寻址)访问直接(寻址)访问通过变量地址直接存取变量内容通过变量地址直接存取变量内容通过变量地址直接存取变量内容通过变量地址直接存取变量内容 间接(寻址)访问间接(寻址)访问间接(寻址)访问间接(寻址)访问通过指针变量来间接存取它所指通过指针变量来间接存取它所指通过指针变量来间接存取它所指通过指针变量来间接存取它所指向的变量向的变量向的变量向的变量任何变量在任何变量在存在期间存在期间总有确定存储位置,有固定总有确定存储位置,有固定地址地址。2022/12/11C语言大学实用教程 课件
8、制作人 苏小红7指针(指针(Pointer)的概念)的概念 指针也是一种数据类型指针也是一种数据类型指针也是一种数据类型指针也是一种数据类型 指针变量指针变量指针变量指针变量 声明为指针类型的变量,专门存放声明为指针类型的变量,专门存放声明为指针类型的变量,专门存放声明为指针类型的变量,专门存放地址数据地址数据地址数据地址数据的变量的变量的变量的变量 2022/12/11C语言大学实用教程 课件制作人 苏小红8指针的主要操作指针的主要操作指针赋值:将程序对象的地址存入指针变量。指针赋值:将程序对象的地址存入指针变量。间接访问:通过指针访问被指对象。间接访问:通过指针访问被指对象。指针还能保存其
9、他对象的地址。下面讨论以变量为例。指针还能保存其他对象的地址。下面讨论以变量为例。指针指针p保存着变量保存着变量x地址,也说指针地址,也说指针p指向指向x。图示:。图示:2022/12/11C语言大学实用教程 课件制作人 苏小红9在在C中使用指针常能写出更简洁有效的程序。有些问题中使用指针常能写出更简洁有效的程序。有些问题必须用指针处理。必须用指针处理。指针在大型复杂软件中使用广泛。指针使用的水平是评指针在大型复杂软件中使用广泛。指针使用的水平是评价人的价人的C程序设计能力的重要方面。程序设计能力的重要方面。C指针灵活指针灵活/功能强。掌握有难度,易用错,应特别注意。功能强。掌握有难度,易用错
10、,应特别注意。应特别注意使用指针的常见错误,应特别注意使用指针的常见错误,注意!注意!指针是变量,可赋值,其指向可以改变。指针是变量,可赋值,其指向可以改变。现在现在p指向指向x,以后可能指向,以后可能指向y。通过通过p访问被指对象的访问被指对象的语句语句目前访问目前访问x,后来就访问,后来就访问y。这种新的灵活性很有用。这种新的灵活性很有用。2022/12/11C语言大学实用教程 课件制作人 苏小红107.2 指针变量的定义和使用指针变量的定义和使用指针有类型,只能保存指针有类型,只能保存特定类型特定类型的变量的地址的变量的地址指向指向int的指针的指针p只能只能指向指向int变量。常变量。
11、常说说int指针指针p1等。等。指指针针是是变变量量,可可赋赋值值取取值值,有有定定义义域域与与存存在在期期。应应赋赋给给类型正确的指针值,取出的值是特定类型的指针值。类型正确的指针值,取出的值是特定类型的指针值。用用(int*)表示整型指针的类型,其他类似。表示整型指针的类型,其他类似。2022/12/11C语言大学实用教程 课件制作人 苏小红11如何定义指针变量?如何定义指针变量?定义指针变量定义指针变量 定义指针需指明指向类型。定义指针需指明指向类型。定义指针需指明指向类型。定义指针需指明指向类型。int*p;定义了一个指针定义了一个指针定义了一个指针定义了一个指针变量变量变量变量p p
12、,简称指针,简称指针,简称指针,简称指针p pp p是变量,是变量,是变量,是变量,int*int*是类型是类型是类型是类型p p里保存一个地址。里保存一个地址。里保存一个地址。里保存一个地址。指针变量可以与其他变量一起定义。指针变量可以与其他变量一起定义。指针变量可以与其他变量一起定义。指针变量可以与其他变量一起定义。如:如:如:如:int *p,n,a10,*q,*p1,m;int *p,n,a10,*q,*p1,m;2022/12/11C语言大学实用教程 课件制作人 苏小红12指针操作指针操作取地址运算符取地址运算符&和间接访问操作和间接访问操作*。都是一元运算符。都是一元运算符取地址运
13、算取地址运算&写在变量描述写在变量描述(如变量名)前(如变量名)前取取变量地址,是对应类变量地址,是对应类型的指针值,可赋给类型合适的指针。型的指针值,可赋给类型合适的指针。指针使用前也要指针使用前也要初始化,下面相当于对指针初始化初始化,下面相当于对指针初始化,例:,例:p=&n;q=p;p1=&a1;2022/12/11C语言大学实用教程 课件制作人 苏小红13指针变量只指针变量只存放地址存放地址!一个指针变量不能一个指针变量不能指向与其类型不同指向与其类型不同的变量的变量!我是真的,我是真的,你猜对了吗?你猜对了吗?应在类型相应在类型相同的指针变同的指针变量之间赋值量之间赋值2022/1
14、2/11C语言大学实用教程 课件制作人 苏小红14&正确使用方法正确使用方法正确使用方法正确使用方法intint i,*p;i,*p;p=&i;p=&i;intint*p,a10;*p,a10;p=a;p=a;intint*p,a10;*p,a10;p=&a0;p=&a0;intint*p,a10;*p,a10;p=&a5;p=&a5;2022/12/11C语言大学实用教程 课件制作人 苏小红15 多个指针可能同时指向同一变量。变量相等是值相多个指针可能同时指向同一变量。变量相等是值相等,等,两个指针变量相等说明它们指向程序里同一东西两个指针变量相等说明它们指向程序里同一东西。间接运算符间接运
15、算符*-用来取指针指向地址的用来取指针指向地址的用来取指针指向地址的用来取指针指向地址的内容内容内容内容 *p=0;-间间间间接接接接运运运运算算算算得得得得到到到到被被被被指指指指针针针针所所所所指指指指的的的的变变变变量量量量,这这这这种种种种表表表表达达达达式式式式可可可可以以以以像像像像普普普普通通通通变变变变量量量量一一一一样样样样使使使使用用用用,其其其其值值值值是是是是p p指指指指向向向向的的的的内内内内存存存存的的的的内内内内容容容容(但但但但寻寻寻寻址址址址方方方方式式式式和和和和普通变量不同普通变量不同普通变量不同普通变量不同)。设。设。设。设p p指向指向指向指向n n
16、。间接赋值:间接赋值:间接赋值:间接赋值:*p=17;-这里写这里写这里写这里写*p p相当于直接写相当于直接写相当于直接写相当于直接写n n。2022/12/11C语言大学实用教程 课件制作人 苏小红16例:例:例:例:int *pint *p,n=17n=17;另一个赋值:另一个赋值:另一个赋值:另一个赋值:*p=17;p=17;m=*p+*q*n;/*m=*p+*q*n;/*访问访问访问访问n n三次三次三次三次*/+*p;/*使变量使变量n的值加的值加1,变成,变成18*/(*p)+;/*使变量使变量n的值再加的值再加1,变成,变成19。*/*p+=*q+n;/*变量变量n被赋以新值被
17、赋以新值57*/q=&a0;/*指针指针q指向了数组指向了数组a的元素的元素*/2022/12/11C语言大学实用教程 课件制作人 苏小红17指针变量与其它类型变量的对比指针变量与其它类型变量的对比 共性共性共性共性在内存中占据一定大小的存储单元在内存中占据一定大小的存储单元在内存中占据一定大小的存储单元在内存中占据一定大小的存储单元先定义,后使用先定义,后使用先定义,后使用先定义,后使用 特殊性特殊性特殊性特殊性 它的内容只能是地址,而不能是数据它的内容只能是地址,而不能是数据它的内容只能是地址,而不能是数据它的内容只能是地址,而不能是数据必须初始化必须初始化必须初始化必须初始化后才能使用,
18、否则指向不确定的存储单元,后才能使用,否则指向不确定的存储单元,后才能使用,否则指向不确定的存储单元,后才能使用,否则指向不确定的存储单元,对该空间进行访问,将可能造成危险对该空间进行访问,将可能造成危险对该空间进行访问,将可能造成危险对该空间进行访问,将可能造成危险可参与的运算:加、减一个整数,自增、自减、关系、可参与的运算:加、减一个整数,自增、自减、关系、可参与的运算:加、减一个整数,自增、自减、关系、可参与的运算:加、减一个整数,自增、自减、关系、赋值赋值赋值赋值只能指向同一基类型的变量只能指向同一基类型的变量只能指向同一基类型的变量只能指向同一基类型的变量2022/12/11C语言大
19、学实用教程 课件制作人 苏小红18指针的指向指针的指向 只能指向同一只能指向同一只能指向同一只能指向同一基类型基类型基类型基类型的变量,否则将引起的变量,否则将引起的变量,否则将引起的变量,否则将引起warningwarningfloatfloat x;x;intint *p=&x;*p=&x;TCTC编译编译编译编译 warning:Suspicious pointer conversion in warning:Suspicious pointer conversion in function mainfunction mainVCVC编译编译编译编译 warning C4133:=:in
20、compatible types-from warning C4133:=:incompatible types-from float*to int*float*to int*2022/12/11C语言大学实用教程 课件制作人 苏小红19指针运算指针运算 算术运算算术运算算术运算算术运算 intint*p,a10;*p,a10;p=a;p=a;p+;p+;/*p/*p的值增加多少?的值增加多少?的值增加多少?的值增加多少?*/指针的加减运算是以指针的加减运算是以指针的加减运算是以指针的加减运算是以其指向的类型的其指向的类型的其指向的类型的其指向的类型的字节长度字节长度字节长度字节长度为单位的为
21、单位的为单位的为单位的另一个例子另一个例子另一个例子另一个例子:int n=17;*p=&nint n=17;*p=&n,m;m;m=(*p)+;m=(*p)+;m=*p+;m=*p+;6000600160026003600460056006p-1pp+1使变量使变量n的值加的值加1,变成,变成18先取出变量先取出变量p所指向的单元中的内容赋给所指向的单元中的内容赋给m,再使,再使p指向下指向下一个地址单元。一个地址单元。实际上,相当于语句:实际上,相当于语句:m=*(p+),可分解为下面两条语句:,可分解为下面两条语句:m=*p;p=p+1;2022/12/11C语言大学实用教程 课件制作人
22、 苏小红20指针运算指针运算 intint*p,*q,a10,k;*p,*q,a10,k;p=a;p=a;q=&a5;q=&a5;k=q p;/kk=q p;/k为两指针的差值,即相差几个单元为两指针的差值,即相差几个单元为两指针的差值,即相差几个单元为两指针的差值,即相差几个单元q=p+3;q=p+3;指针运算不能乱算指针运算不能乱算指针运算不能乱算指针运算不能乱算一般只进行指针和整数的加减运算,一般只进行指针和整数的加减运算,一般只进行指针和整数的加减运算,一般只进行指针和整数的加减运算,同类型同类型同类型同类型指针之间指针之间指针之间指针之间的减法运算的减法运算的减法运算的减法运算其它运
23、算,比如乘法、除法、浮点运算、指针之间的其它运算,比如乘法、除法、浮点运算、指针之间的其它运算,比如乘法、除法、浮点运算、指针之间的其它运算,比如乘法、除法、浮点运算、指针之间的加法等,并无意义,所以也不支持加法等,并无意义,所以也不支持加法等,并无意义,所以也不支持加法等,并无意义,所以也不支持2022/12/11C语言大学实用教程 课件制作人 苏小红21指针运算指针运算 关系运算关系运算关系运算关系运算 指向指向指向指向同一种数据类型同一种数据类型同一种数据类型同一种数据类型的两个指针才能进行关系运算的两个指针才能进行关系运算的两个指针才能进行关系运算的两个指针才能进行关系运算值为值为值为
24、值为1 1或或或或0 0 p q p q p p2).当当p3所所指指的的元元素素在在p2所所指指的的元元素素之之后后时时条条件件成成立立(值值为为1),否否则则不不成成立立(值值为为0)。两两个个指指针针不不指指在在同同一一数数组组里时,比较大小没有意义。里时,比较大小没有意义。两两个个同同类类型型指指针针可可用用=和和!=比比较较相相等等或或不不等等;任任何何指指针针都都能能与与通通用用指指针针比比较较相相等等或或不不等等,任任何何指指针针可可与空指针值(与空指针值(0或或NULL)比较相等或不等。)比较相等或不等。两指针指向同一数据元素,或同为空值时它们相等。两指针指向同一数据元素,或同
25、为空值时它们相等。2022/12/11C语言大学实用教程 课件制作人 苏小红55数组写法与指针写法数组写法与指针写法如果一个如果一个指针指针指在一个数组里,通过指针访问数组元素指在一个数组里,通过指针访问数组元素的操作也可用下标形式写的操作也可用下标形式写。设设p1指向数组指向数组a0,p3指向指向a5。可写:。可写:p13=5;p32=8;p13一一类类写写法法称称为为数数组组写写法法,*(p+3)一一类类写写法法称称为为指指针写法针写法。两类写法有两类写法有等价效力等价效力,可以自由选用。,可以自由选用。2022/12/11C语言大学实用教程 课件制作人 苏小红56指针与数组指针与数组 数
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 指针 语言 大学 实用教程 课件 苏小红
限制150内