第7章+指针--C语言大学实用教程课件

上传人:沈*** 文档编号:241660977 上传时间:2024-07-14 格式:PPT 页数:82 大小:1.64MB
返回 下载 相关 举报
第7章+指针--C语言大学实用教程课件_第1页
第1页 / 共82页
第7章+指针--C语言大学实用教程课件_第2页
第2页 / 共82页
第7章+指针--C语言大学实用教程课件_第3页
第3页 / 共82页
点击查看更多>>
资源描述
第第第第7 7 7 712024/7/14C语言大学实用教程 课件制作人 苏小红2内容提要内容提要 指针的概念;指针的概念;指针的概念;指针的概念;难点:对指针数据类型的理解难点:对指针数据类型的理解难点:对指针数据类型的理解难点:对指针数据类型的理解 用指针做函数参数;用指针做函数参数;用指针做函数参数;用指针做函数参数;利用字符指针存取字符串;利用字符指针存取字符串;利用字符指针存取字符串;利用字符指针存取字符串;字符数组和字符指针的区别与联系字符数组和字符指针的区别与联系字符数组和字符指针的区别与联系字符数组和字符指针的区别与联系 指针数组应用;指针数组应用;指针数组应用;指针数组应用;指向数组的指针与指针数组的区别指向数组的指针与指针数组的区别指向数组的指针与指针数组的区别指向数组的指针与指针数组的区别 带参数的带参数的带参数的带参数的mainmain函数;函数;函数;函数;动态内存分配函数及其应用;动态内存分配函数及其应用;动态内存分配函数及其应用;动态内存分配函数及其应用;一维、二维动态数组的实现一维、二维动态数组的实现一维、二维动态数组的实现一维、二维动态数组的实现2024/7/14C语言大学实用教程 课件制作人 苏小红3为什么引入指针的概念为什么引入指针的概念 铁杆铁杆铁杆铁杆C/C+C/C+程序员最挚爱的武器:指针程序员最挚爱的武器:指针程序员最挚爱的武器:指针程序员最挚爱的武器:指针 C/C+C/C+的高效、高能主要来自于指针的高效、高能主要来自于指针的高效、高能主要来自于指针的高效、高能主要来自于指针 很多不可能的任务由指针完成很多不可能的任务由指针完成很多不可能的任务由指针完成很多不可能的任务由指针完成 2024/7/14C语言大学实用教程 课件制作人 苏小红4为什么引入指针的概念为什么引入指针的概念 指针指针指针指针为函数提供修改变量值的手段为函数提供修改变量值的手段为函数提供修改变量值的手段为函数提供修改变量值的手段 为为为为C C的动态内存分配系统提供支持的动态内存分配系统提供支持的动态内存分配系统提供支持的动态内存分配系统提供支持 为动态数据结构(如例链表、队列、二叉树等)提供支持为动态数据结构(如例链表、队列、二叉树等)提供支持为动态数据结构(如例链表、队列、二叉树等)提供支持为动态数据结构(如例链表、队列、二叉树等)提供支持 可以改善某些子程序的效率可以改善某些子程序的效率可以改善某些子程序的效率可以改善某些子程序的效率 2024/7/14C语言大学实用教程 课件制作人 苏小红5 计算机内的存储部件,所有指令和数据都保存在计算机内的存储部件,所有指令和数据都保存在计算机内的存储部件,所有指令和数据都保存在计算机内的存储部件,所有指令和数据都保存在内存里内存里内存里内存里 速度快,但是掉电即失速度快,但是掉电即失速度快,但是掉电即失速度快,但是掉电即失 可以随机访问可以随机访问可以随机访问可以随机访问只要指明要访问的内存单元的只要指明要访问的内存单元的只要指明要访问的内存单元的只要指明要访问的内存单元的地址地址地址地址,就可以立即访问,就可以立即访问,就可以立即访问,就可以立即访问到该单元到该单元到该单元到该单元地址地址地址地址是一个无符号整数,其字长一般与主机相同是一个无符号整数,其字长一般与主机相同是一个无符号整数,其字长一般与主机相同是一个无符号整数,其字长一般与主机相同内存中的每个字节都有唯一的一个地址内存中的每个字节都有唯一的一个地址内存中的每个字节都有唯一的一个地址内存中的每个字节都有唯一的一个地址地址按字节编号,按类型分配空间地址按字节编号,按类型分配空间地址按字节编号,按类型分配空间地址按字节编号,按类型分配空间内存(内存(Random Access Memory)地址(地址(Address)2024/7/14C语言大学实用教程 课件制作人 苏小红6寻址方式寻址方式 如何读写内存中的数据?如何读写内存中的数据?如何读写内存中的数据?如何读写内存中的数据?通过变量的地址访问变量所在的通过变量的地址访问变量所在的通过变量的地址访问变量所在的通过变量的地址访问变量所在的存储单元存储单元存储单元存储单元 两种寻址方式两种寻址方式两种寻址方式两种寻址方式 直接(寻址)访问直接(寻址)访问直接(寻址)访问直接(寻址)访问通过变量地址直接存取变量内容通过变量地址直接存取变量内容通过变量地址直接存取变量内容通过变量地址直接存取变量内容 间接(寻址)访问间接(寻址)访问间接(寻址)访问间接(寻址)访问通过指针变量来间接存取它所指通过指针变量来间接存取它所指通过指针变量来间接存取它所指通过指针变量来间接存取它所指向的变量向的变量向的变量向的变量任何变量在任何变量在存在期间存在期间总有确定存储位置,有固定总有确定存储位置,有固定地址地址。2024/7/14C语言大学实用教程 课件制作人 苏小红7指针(指针(Pointer)的概念)的概念 指针也是一种数据类型指针也是一种数据类型指针也是一种数据类型指针也是一种数据类型 指针变量指针变量指针变量指针变量 声明为指针类型的变量,专门存放声明为指针类型的变量,专门存放声明为指针类型的变量,专门存放声明为指针类型的变量,专门存放地址数据地址数据地址数据地址数据的变量的变量的变量的变量 2024/7/14C语言大学实用教程 课件制作人 苏小红8指针的主要操作指针的主要操作指针赋值:将程序对象的地址存入指针变量。指针赋值:将程序对象的地址存入指针变量。间接访问:通过指针访问被指对象。间接访问:通过指针访问被指对象。指针还能保存其他对象的地址。下面讨论以变量为例。指针还能保存其他对象的地址。下面讨论以变量为例。指针指针p保存着变量保存着变量x地址,也说指针地址,也说指针p指向指向x。图示:。图示:2024/7/14C语言大学实用教程 课件制作人 苏小红9在在C中使用指针常能写出更简洁有效的程序。有些问题中使用指针常能写出更简洁有效的程序。有些问题必须用指针处理。必须用指针处理。指针在大型复杂软件中使用广泛。指针使用的水平是评指针在大型复杂软件中使用广泛。指针使用的水平是评价人的价人的C程序设计能力的重要方面。程序设计能力的重要方面。C指针灵活指针灵活/功能强。掌握有难度,易用错,应特别注意。功能强。掌握有难度,易用错,应特别注意。应特别注意使用指针的常见错误,应特别注意使用指针的常见错误,注意!注意!指针是变量,可赋值,其指向可以改变。指针是变量,可赋值,其指向可以改变。现在现在p指向指向x,以后可能指向,以后可能指向y。通过通过p访问被指对象的访问被指对象的语句语句目前访问目前访问x,后来就访问,后来就访问y。这种新的灵活性很有用。这种新的灵活性很有用。2024/7/14C语言大学实用教程 课件制作人 苏小红107.2 指针变量的定义和使用指针变量的定义和使用指针有类型,只能保存指针有类型,只能保存特定类型特定类型的变量的地址的变量的地址指向指向int的指针的指针p只能只能指向指向int变量。常变量。常说说int指针指针p1等。等。指指针针是是变变量量,可可赋赋值值取取值值,有有定定义义域域与与存存在在期期。应应赋赋给给类型正确的指针值,取出的值是特定类型的指针值。类型正确的指针值,取出的值是特定类型的指针值。用用(int*)表示整型指针的类型,其他类似。表示整型指针的类型,其他类似。2024/7/14C语言大学实用教程 课件制作人 苏小红11如何定义指针变量?如何定义指针变量?定义指针变量定义指针变量 定义指针需指明指向类型。定义指针需指明指向类型。定义指针需指明指向类型。定义指针需指明指向类型。int*p;定义了一个指针定义了一个指针定义了一个指针定义了一个指针变量变量变量变量p p,简称指针,简称指针,简称指针,简称指针p pp p是变量,是变量,是变量,是变量,int*int*是类型是类型是类型是类型p p里保存一个地址。里保存一个地址。里保存一个地址。里保存一个地址。指针变量可以与其他变量一起定义。指针变量可以与其他变量一起定义。指针变量可以与其他变量一起定义。指针变量可以与其他变量一起定义。如:如:如:如:int *p,n,a10,*q,*p1,m;int *p,n,a10,*q,*p1,m;2024/7/14C语言大学实用教程 课件制作人 苏小红12指针操作指针操作取地址运算符取地址运算符&和间接访问操作和间接访问操作*。都是一元运算符。都是一元运算符取地址运算取地址运算&写在变量描述写在变量描述(如变量名)前(如变量名)前取取变量地址,是对应类变量地址,是对应类型的指针值,可赋给类型合适的指针。型的指针值,可赋给类型合适的指针。指针使用前也要指针使用前也要初始化,下面相当于对指针初始化初始化,下面相当于对指针初始化,例:,例:p=&n;q=p;p1=&a1;2024/7/14C语言大学实用教程 课件制作人 苏小红13指针变量只指针变量只存放地址存放地址!一个指针变量不能一个指针变量不能指向与其类型不同指向与其类型不同的变量的变量!我是真的,我是真的,你猜对了吗?你猜对了吗?应在类型相应在类型相同的指针变同的指针变量之间赋值量之间赋值2024/7/14C语言大学实用教程 课件制作人 苏小红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;2024/7/14C语言大学实用教程 课件制作人 苏小红15 多个指针可能同时指向同一变量。变量相等是值相多个指针可能同时指向同一变量。变量相等是值相等,等,两个指针变量相等说明它们指向程序里同一东西两个指针变量相等说明它们指向程序里同一东西。间接运算符间接运算符*-用来取指针指向地址的用来取指针指向地址的用来取指针指向地址的用来取指针指向地址的内容内容内容内容 *p=0;-间间间间接接接接运运运运算算算算得得得得到到到到被被被被指指指指针针针针所所所所指指指指的的的的变变变变量量量量,这这这这种种种种表表表表达达达达式式式式可可可可以以以以像像像像普普普普通通通通变变变变量量量量一一一一样样样样使使使使用用用用,其其其其值值值值是是是是p p指指指指向向向向的的的的内内内内存存存存的的的的内内内内容容容容(但但但但寻寻寻寻址址址址方方方方式式式式和和和和普通变量不同普通变量不同普通变量不同普通变量不同)。设。设。设。设p p指向指向指向指向n n。间接赋值:间接赋值:间接赋值:间接赋值:*p=17;-这里写这里写这里写这里写*p p相当于直接写相当于直接写相当于直接写相当于直接写n n。2024/7/14C语言大学实用教程 课件制作人 苏小红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被赋以新值被赋以新值57*/q=&a0;/*指针指针q指向了数组指向了数组a的元素的元素*/2024/7/14C语言大学实用教程 课件制作人 苏小红17指针变量与其它类型变量的对比指针变量与其它类型变量的对比 共性共性共性共性在内存中占据一定大小的存储单元在内存中占据一定大小的存储单元在内存中占据一定大小的存储单元在内存中占据一定大小的存储单元先定义,后使用先定义,后使用先定义,后使用先定义,后使用 特殊性特殊性特殊性特殊性 它的内容只能是地址,而不能是数据它的内容只能是地址,而不能是数据它的内容只能是地址,而不能是数据它的内容只能是地址,而不能是数据必须初始化必须初始化必须初始化必须初始化后才能使用,否则指向不确定的存储单元,后才能使用,否则指向不确定的存储单元,后才能使用,否则指向不确定的存储单元,后才能使用,否则指向不确定的存储单元,对该空间进行访问,将可能造成危险对该空间进行访问,将可能造成危险对该空间进行访问,将可能造成危险对该空间进行访问,将可能造成危险可参与的运算:加、减一个整数,自增、自减、关系、可参与的运算:加、减一个整数,自增、自减、关系、可参与的运算:加、减一个整数,自增、自减、关系、可参与的运算:加、减一个整数,自增、自减、关系、赋值赋值赋值赋值只能指向同一基类型的变量只能指向同一基类型的变量只能指向同一基类型的变量只能指向同一基类型的变量2024/7/14C语言大学实用教程 课件制作人 苏小红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:=:incompatible types-from warning C4133:=:incompatible types-from float*to int*float*to int*2024/7/14C语言大学实用教程 课件制作人 苏小红19指针运算指针运算 算术运算算术运算算术运算算术运算 intint*p,a10;*p,a10;p=a;p=a;p+;p+;/*p/*p的值增加多少?的值增加多少?的值增加多少?的值增加多少?*/指针的加减运算是以指针的加减运算是以指针的加减运算是以指针的加减运算是以其指向的类型的其指向的类型的其指向的类型的其指向的类型的字节长度字节长度字节长度字节长度为单位的为单位的为单位的为单位的另一个例子另一个例子另一个例子另一个例子: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;2024/7/14C语言大学实用教程 课件制作人 苏小红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;指针运算不能乱算指针运算不能乱算指针运算不能乱算指针运算不能乱算一般只进行指针和整数的加减运算,一般只进行指针和整数的加减运算,一般只进行指针和整数的加减运算,一般只进行指针和整数的加减运算,同类型同类型同类型同类型指针之间指针之间指针之间指针之间的减法运算的减法运算的减法运算的减法运算其它运算,比如乘法、除法、浮点运算、指针之间的其它运算,比如乘法、除法、浮点运算、指针之间的其它运算,比如乘法、除法、浮点运算、指针之间的其它运算,比如乘法、除法、浮点运算、指针之间的加法等,并无意义,所以也不支持加法等,并无意义,所以也不支持加法等,并无意义,所以也不支持加法等,并无意义,所以也不支持2024/7/14C语言大学实用教程 课件制作人 苏小红21指针运算指针运算 关系运算关系运算关系运算关系运算 指向指向指向指向同一种数据类型同一种数据类型同一种数据类型同一种数据类型的两个指针才能进行关系运算的两个指针才能进行关系运算的两个指针才能进行关系运算的两个指针才能进行关系运算值为值为值为值为1 1或或或或0 0 p q p q p p2).当当p3所所指指的的元元素素在在p2所所指指的的元元素素之之后后时时条条件件成成立立(值值为为1),否否则则不不成成立立(值值为为0)。两两个个指指针针不不指指在在同同一一数数组组里时,比较大小没有意义。里时,比较大小没有意义。两两个个同同类类型型指指针针可可用用=和和!=比比较较相相等等或或不不等等;任任何何指指针针都都能能与与通通用用指指针针比比较较相相等等或或不不等等,任任何何指指针针可可与空指针值(与空指针值(0或或NULL)比较相等或不等。)比较相等或不等。两指针指向同一数据元素,或同为空值时它们相等。两指针指向同一数据元素,或同为空值时它们相等。2024/7/14C语言大学实用教程 课件制作人 苏小红55数组写法与指针写法数组写法与指针写法如果一个如果一个指针指针指在一个数组里,通过指针访问数组元素指在一个数组里,通过指针访问数组元素的操作也可用下标形式写的操作也可用下标形式写。设设p1指向数组指向数组a0,p3指向指向a5。可写:。可写:p13=5;p32=8;p13一一类类写写法法称称为为数数组组写写法法,*(p+3)一一类类写写法法称称为为指指针写法针写法。两类写法有两类写法有等价效力等价效力,可以自由选用。,可以自由选用。2024/7/14C语言大学实用教程 课件制作人 苏小红56指针与数组指针与数组 数组名就是一个指针数组名就是一个指针数组名就是一个指针数组名就是一个指针只是不能修改这个指针的指向只是不能修改这个指针的指向只是不能修改这个指针的指向只是不能修改这个指针的指向可以定义函数的参数为数组可以定义函数的参数为数组可以定义函数的参数为数组可以定义函数的参数为数组 指针也可当作数组名使用指针也可当作数组名使用指针也可当作数组名使用指针也可当作数组名使用intint*p,a10;*p,a10;p=a;p=a;数组元素的几种等价引用形式数组元素的几种等价引用形式数组元素的几种等价引用形式数组元素的几种等价引用形式aiai*(a+i)*(a+i)pipi*(p+i)*(p+i)60006001600260036004600560066007a0a1a2a3aa+1a+260006001600260036004600560066007a0a1a2a3app+p+2024/7/14C语言大学实用教程 课件制作人 苏小红57输入输出数组的全部元素输入输出数组的全部元素mainmain()()intint a10;a10;intint i;i;forfor(i=0;i10;i+)(i=0;i10;i+)scanf(%d,&ai);scanf(%d,&ai);forfor(i=0;i10;i+)(i=0;i10;i+)printf(%d,ai);printf(%d,ai);方法方法方法方法1 1:下标法下标法下标法下标法mainmain()()intint a10;a10;intint *p,i;*p,i;forfor(p=a;p(a+10);p+)(p=a;p(a+10);p+)scanf(%d,p);scanf(%d,p);forfor(p=a;p(a+10);p+)(p=a;p(a+10);p+)printf(%d,*p);printf(%d,*p);方法方法方法方法2 2:指针法指针法指针法指针法2024/7/14C语言大学实用教程 课件制作人 苏小红58例例7.7:插入排序:插入排序 关键是:找到该插入的位置,然后依次移动插入位置关键是:找到该插入的位置,然后依次移动插入位置关键是:找到该插入的位置,然后依次移动插入位置关键是:找到该插入的位置,然后依次移动插入位置及其后的所有元素腾出这一位置放入待插入的元素及其后的所有元素腾出这一位置放入待插入的元素及其后的所有元素腾出这一位置放入待插入的元素及其后的所有元素腾出这一位置放入待插入的元素 1 3 5 7 9a0 a1 a2 a3 a4 a5插入位置pos x=4x插入前:1 3 4 5 7 9 x插入后:插入元素xa0 a1 a2 a3 a4 a52024/7/14C语言大学实用教程 课件制作人 苏小红59例例7.7:插入排序:插入排序voidvoid Inseart(Inseart(intint a,a,intint n,n,intint x)x)intint i,pos;i,pos;forfor(i=0;(i ai);i+)(i=0;(i ai);i+)pos=i;pos=i;forfor(i=n-1;i=pos;i-)(i=n-1;i=pos;i-)ai+1=ai;ai+1=ai;/*/*向后移动向后移动向后移动向后移动*/apos=x;apos=x;/*/*插入元素插入元素插入元素插入元素x x到位置到位置到位置到位置pos*/pos*/0 01 12 23 34 45 51 13 35 5要插入的:要插入的:要插入的:要插入的:X=6X=67 79 910102024/7/14C语言大学实用教程 课件制作人 苏小红60指针与二维数组指针与二维数组 C C语言将二维数组看作一维数组,其每个数组元素语言将二维数组看作一维数组,其每个数组元素语言将二维数组看作一维数组,其每个数组元素语言将二维数组看作一维数组,其每个数组元素又是一个一维数组又是一个一维数组又是一个一维数组又是一个一维数组 按行顺序存放所有元素按行顺序存放所有元素按行顺序存放所有元素按行顺序存放所有元素a00a01a02a10a11a12aa0+0a+1a1+0a0+1a0+2&a00&a10&a11a1+1&a12&a01&a02 a00 a0a01a02a10 a1 a11a12 a a1+2intint a23;2024/7/14C语言大学实用教程 课件制作人 苏小红61例例7.8 任意输入英文的星期几,在查找星期表后输出其对应任意输入英文的星期几,在查找星期表后输出其对应任意输入英文的星期几,在查找星期表后输出其对应任意输入英文的星期几,在查找星期表后输出其对应的数字。的数字。的数字。的数字。char weekDay710=char weekDay710=Sunday,Monday,Tuesday,Wednesday,Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday;Thursday,Friday,Saturday;表表表表7-1 7-1 星期表的内容星期表的内容星期表的内容星期表的内容0 0SundaySunday1 1MondayMonday2 2TuesdayTuesday3 3WednesdayWednesday4 4ThursdayThursday5 5FridayFriday6 6SaturdaySaturdayweekDay0weekDay1weekDay2weekDay3weekDay4weekDay5weekDay6Sunday0Monday0Tuesday0Wednesday0Thursday0Friday0Saturday02024/7/14C语言大学实用教程 课件制作人 苏小红62#includeinclude main()main()intint i,pos;i,pos;intint findFlag=0;findFlag=0;charchar x10;x10;charchar weekDay10=Sunday,Monday,Tuesday,weekDay10=Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Wednesday,Thursday,Friday,Saturday;Saturday;printf(Please enter a string:);printf(Please enter a string:);scanf(%s,x);scanf(%s,x);forfor(i=0;i 7&!findFlag;i+)(i=0;i 7&!findFlag;i+)ifif(strcmp(x,weekDayi)=0)(strcmp(x,weekDayi)=0)pos=i;pos=i;findFlag=1;findFlag=1;ifif(findFlag)(findFlag)printf(%s is%dn,x,pos);printf(%s is%dn,x,pos);elseelse printf(Not found!n);printf(Not found!n);例例7.8weekDay0weekDay1weekDay2weekDay3weekDay4weekDay5weekDay6Sunday0Monday0Tuesday0Wednesday0Thursday0Friday0Saturday0 xSunday02024/7/14C语言大学实用教程 课件制作人 苏小红63指针与二维数组指针与二维数组 a a 代表代表代表代表二二二二维数组的首地址,维数组的首地址,维数组的首地址,维数组的首地址,第第第第0 0行行行行的地址的地址的地址的地址 a+i a+i 代表代表代表代表第第第第i i行行行行的地址的地址的地址的地址*(a(a+i)+i)即即即即 ai ai 代表代表代表代表第第第第i i行第行第行第行第0 0列列列列的地址的地址的地址的地址*(a(a+i)+j+i)+j 即即即即 ai+j ai+j 代表代表代表代表第第第第i i行第行第行第行第j j列列列列的地址的地址的地址的地址*(*(a(*(a+i)+j)+i)+j)即即即即 aij aij 代表代表代表代表第第第第i i行第行第行第行第j j列列列列的的的的元素元素元素元素行地址行地址行地址行地址转变成转变成转变成转变成列地址列地址列地址列地址2024/7/14C语言大学实用教程 课件制作人 苏小红64指针与二维数组指针与二维数组 二维数组的指针二维数组的指针二维数组的指针二维数组的指针列指针列指针列指针列指针int int*p;*p;p=*a;/p=*a;/用列地址初始化用列地址初始化用列地址初始化用列地址初始化,/等价于等价于等价于等价于*(a+0),(a+0),即第即第即第即第0 0行第行第行第行第0 0列的地址列的地址列的地址列的地址 逐个元素查找元素所在位置逐个元素查找元素所在位置逐个元素查找元素所在位置逐个元素查找元素所在位置 相对于数组起始地址的偏移量相对于数组起始地址的偏移量相对于数组起始地址的偏移量相对于数组起始地址的偏移量i*n+j/i*n+j/对于对于对于对于m m行行行行n n列的二维数组来说列的二维数组来说列的二维数组来说列的二维数组来说forfor(i=0;im;i+)(i=0;im;i+)forfor(j=0;jn;j+)(j=0;jn;j+)printf(printf(%d%d,*(p+i*n+j)*(p+i*n+j););a00a01a02a10a11a12pp+代表第代表第代表第代表第i i行第行第行第行第j j列的地址列的地址列的地址列的地址2024/7/14C语言大学实用教程 课件制作人 苏小红65指针与二维数组指针与二维数组 二维数组的指针二维数组的指针二维数组的指针二维数组的指针行指针行指针行指针行指针int int(*p)p)3 3;常量常量常量常量3 3规定了行指针所指一维数组的长度,它规定了行指针所指一维数组的长度,它规定了行指针所指一维数组的长度,它规定了行指针所指一维数组的长度,它是不可省略的是不可省略的是不可省略的是不可省略的p=a;/p=a;/用行地址初始化用行地址初始化用行地址初始化用行地址初始化 先逐行查找元素所在行先逐行查找元素所在行先逐行查找元素所在行先逐行查找元素所在行 再在行内逐列查找元素所在位置再在行内逐列查找元素所在位置再在行内逐列查找元素所在位置再在行内逐列查找元素所在位置forfor(i=0;im;i+)(i=0;im;i+)forfor(j=0;jn;j+)(j=0;jn;j+)printf(printf(%d%d,*(*(p+i)+j)*(*(p+i)+j););a00a01a02a10a11a12pp+2024/7/14C语言大学实用教程 课件制作人 苏小红66例例7.3:在:在一个班级一个班级中找出最高分中找出最高分及其学号及其学号 void void FindMax(FindMax(floatfloat score,score,longlong num,num,intint n,n,float float pMaxScore,pMaxScore,longlong pMaxNum)pMaxNum)intint i;i;pMaxScore=score0;pMaxScore=score0;pMaxNum=num0;pMaxNum=num0;forfor(i=1;in;i+)(i=1;i pMaxScore)(scorei pMaxScore)pMaxScore=scorei;pMaxScore=scorei;pMaxNum=numi;pMaxNum=numi;能返回这两个值吗?能返回这两个值吗?2024/7/14C语言大学实用教程 课件制作人 苏小红67例例7.3:在:在一个班级一个班级中找出最高分中找出最高分及其学号及其学号 void void FindMax(FindMax(floatfloat score,score,longlong num,num,intint n,n,float float*pMaxScore,*pMaxScore,longlong*pMaxNum)*pMaxNum)intint i;i;*pMaxScore=score0;*pMaxScore=score0;*pMaxNum=num0;*pMaxNum=num0;forfor(i=1;in;i+)(i=1;i*pMaxScore)(scorei *pMaxScore)*pMaxScore=scorei;*pMaxScore=scorei;*pMaxNum=numi;*pMaxNum=numi;指针参数指定了存放指针参数指定了存放这两个值的地址这两个值的地址2024/7/14C语言大学实用教程 课件制作人 苏小红68例例例例7.9:7.9:在在在在多个班级多个班级多个班级多个班级中找出最高分及其所在班级和学号中找出最高分及其所在班级和学号中找出最高分及其所在班级和学号中找出最高分及其所在班级和学号 intint FindMax(FindMax(intint pmnpmn,int m,int n,int m,int n,int*pRow,int*pCol)int*pRow,int*pCol)intint i,j,max;i,j,max;max=max=p00p00;*pRow=0;*pRow=0;*pCol=0;*pCol=0;forfor(i=0;im;i+)(i=0;im;i+)forfor(j=0;jn;j+)(j=0;j max)(pij max)max=pij;max=pij;*pRow=i;*pRow=i;*pCol=j;*pCol=j;returnreturn(max);(max);能这样传递能这样传递m个班(每个班(每班班n个学生)的成绩吗?个学生)的成绩吗?2024/7/14C语言大学实用教程 课件制作人 苏小红69intint FindMax(FindMax(intint *p*p,int m,int n,int*pRow,int*pCol),int m,int n,int*pRow,int*pCol)intint i,j,max;i,j,max;max=max=p0p0;*pRow=0;*pRow=0;*pCol=0;*pCol=0;forfor(i=0;im;i+)(i=0;im;i+)forfor(j=0;jn;j+)(j=0;j max)max)max=max=pi*n+jpi*n+j;*pRow=i;*pRow=i;*pCol=j;*pCol=j;returnreturn(max);(max);由此可见,此处的由此可见,此处的p是列是列指针指针例例例例例例7.9:7.9:7.9:在多个班级中找出最高分及其所在班级和学号在多个班级中找出最高分及其所在班级和学号在多个班级中找出最高分及其所在班级和学号在多个班级中找出最高分及其所在班级和学号在多个班级中找出最高分及其所在班级和学号在多个班级中找出最高分及其所在班级和学号 指定存储指定存储m个班(每班个班(每班n个学生)成绩的首地址个学生)成绩的首地址2024/7/14C语言大学实用教程 课件制作人 苏小红70#include#include#define CLASS 3 /*#define CLASS 3 /*班级数班级数班级数班级数*/#define STUD 4 /*#define STUD 4 /*每班学生数每班学生数每班学生数每班学生数*/intint FindMax(int*p,int m,int n,int*pRow,int*pCol);/*FindMax(int*p,int m,int n,int*pRow,int*pCol);/*函数声明函数声明函数声明函数声明*/main()main()int int scoreCLASSSTUD,i,j,maxScore,row,col;scoreCLASSSTUD,i,j,maxScore,row,col;forfor(i=0;iCLASS;i+)(i=0;iCLASS;i+)printf(Please enter scores of class%d:n,i+1);printf(Please enter scores of class%d:n,i+1);forfor(j=0;jSTUD;j+)(j=0;jSTUD;j+)scanf(%d,&scoreij);/*scanf(%d,&scoreij);/*输入成绩输入成绩输入成绩输入成绩*/maxScore=FindMax(*score,CLASS,STUD,maxScore=FindMax(*score,CLASS,STUD,&row,&col&row,&col);/*);/*函数调用函数调用函数调用函数调用*/*/*输出最高分输出最高分输出最高分输出最高分maxmax及其所在的班级和学号及其所在的班级和学号及其所在的班级和学号及其所在的班级和学号*/printf(maxScore=%d,class=%d,number=%dn,maxScore,printf(maxScore=%d,class=%d,number=%dn,maxScore,row+1,col+1row+1,col+1););2024/7/14C语言大学实用教程 课件制作人 苏小红71指针、数组以及其它的类型混合指针、数组以及其它的类型混合 基本数据类型基本数据类型基本数据类型基本数据类型intint、longlong、charchar、shortshort、floatfloat、doubledouble 指针是一种数据类型指针是一种数据类型指针是一种数据类型指针是一种数据类型是从其它类型派生的类型是从其它类型派生的类型是从其它类型派生的类型是从其它类型派生的类型 XXXX类型的指针类型的指针类型的指针类型的指针 数组也是一种数据类型数组也是一种数据类型数组也是一种数据类型数组也是一种数据类型是从其它类型派生的类型是从其它类型派生的类型是从其它类型派生的类型是从其它类型派生的类型 每个元素都有一个类型每个元素都有一个类型每个元素都有一个类型每个元素都有一个类型 任何类型都可以做指针或者数组的任何类型都可以做指针或者数组的任何类型都可以做指针或者数组的任何类型都可以做指针或者数组的基础类型基础类型基础类型基础类型它们自己也可以做彼此或自己的基础类型它们自己也可以做彼此或自己的基础类型它们自己也可以做彼此或自己的基础类型它们自己也可以做彼此或自己的基础类型2024/7/14C语言大学实用教程 课件制作人 苏小红72指针数组指针数组 元素均为指针类型数据的数组,称为指针数组元素均为指针类型数据的数组,称为指针数组元素均为指针类型数据的数组,称为指针数组元素均为指针类型数据的数组,称为指针数组 定义形式为:定义形式为:定义形式为:定义形式为:类型关键字类型关键字类型关键字类型关键字 *数组名数组名数组名数组名 数组长度数组长度数组长度数组长度;例如例如例如例如 char char*pStr5;*pStr5;pStrpStr55*charchar2024/7/14C语言大学实用教程 课件制作人 苏小红73例例7.11 main()main()intint i;i;charchar str10str10=Pascal,Basic,Fortran,=Pascal,Basic,Fortran,Java,Visual C;Java,Visual C;forfor(i=0;i5;i+)(i=0;i5;i+)printf(%sn,printf(%sn,stristri););strstr0str0Pascalstrstr11strstr22strstr33BasicFortranJava二维数组二维数组字符串字符串Visual Cstrstr442024/7/14C语言大学实用教程 课件制作人 苏小红74例例7.11 main()main()intint i;i;charchar *ptr*ptr=Pascal,Basic,Fortran,=Pascal,Basic,Fortran,Java,Visual C;Java,Visual C;forfor(i=0;i5;i+)(i=0;i5;i+)printf(%sn,printf(%sn,ptriptri););ptr0ptr0Pascalptrptr11ptrptr22ptrptr33BasicFortranJavaptr指针数组指针数组字符串字符串ptrVisual Cptrptr442024/7/14C语言大学实用教程 课件制作人 苏小红75例例7.10:字符串按字典顺序排序字符串按字典顺序排序二维数组编程二维数组编程charchar strN10=Pascal,Basic,Fortran,strN10=Pascal,Basic,Fortran,Java,Visual C;Java,Visual C;forfor(i=0;iN-1;i+)(i=0;iN-1;i+)forfor(j=i+1;jN;j+)(j=i+1;jN;j+)ifif(strcmp(strj,stri)0)(strcmp(strj,stri)0)strcpy(temp,stri);strcpy(temp,stri);strcpy(stri,strj);strcpy(stri,strj);strcpy(strj,temp);strcpy(strj,temp);strstrstrstrstrstrstrstrstrstrstrstrstrstrstrstrstrstrstrstr2024/7/14C语言大学实用教程 课件制作人 苏小红76例例7.10:字符串按字典顺序排序字符串按字典顺序排序指针数组编程指针数组编程charchar *ptrN=Pascal,Basic,Fortran,*ptrN=Pascal,Basic,Fortran,Java,Java,Visual C;Visual C;forfor(i=0;iN-1;i+)(i=0;iN-1;i+)forfor(j=i+1;jN;j+)(j=i+1;jN;j+)ifif(strcmp(ptrj,ptri)0)(strcmp(ptrj,ptri)1)(argc 1)printf(The other arguments are following:n);printf(The other arguments are following:n);forfor(i=1;iargc;i+)(i=1;iargc;i+)printf(%sn,argvi);printf(%sn,argvi);argv0argv0echo.exeargv1argv1argv2argv2argv3argv3programmingisfunptr指针数组指针数组字符串字符串name2024/7/14C语言大学实用教程 课件制作人 苏小红79动态分配内存动态分配内存#includeinclude#includeinclude voidvoid*malloc(*malloc(unsignedunsigned intint size);size);向系统申请大小为向系统申请大小为向系统申请大小为向系统申请大小为sizesize的内存块,把首地址返回。如果申请不成功,的内存块,把首地址返回。如果申请不成功,的内存块,把首地址返回。如果申请不成功,的内存块,把首地址返回。如果申请不成功,返回返回返回返回NULLNULL voidvoid*calloc(*calloc(unsigned intunsigned int num,num,unsignedunsigned intint size);size);向系统申请向系统申请向系统申请向系统申请numnum个个个个sizesize大小的内存块,把首地址返回。如果申请不大小的内存块,把首地址返回。如果申请不大小的内存块,把首地址返回。如果申请不大小的内存块,把首地址返回。如果申请不成功,返回成功,返回成功,返回成功,返回NULLNULL voidvoid free(free(voidvoid*p);*p);释放由释放由释放由释放由malloc()malloc()和和和和calloc()calloc()申请的内存块。申请的内存块。申请的内存块。申请的内存块。p p是指向此块的指针是指向此块的指针是指向此块的指针是指向此块的指针 voidvoid*类型的指针可以指向任意类型的变量类型的指针可以指向任意类型的变量类型的指针可以指向任意类型的变量类型的指针可以指向任意类型的变量2024/7/14C语言大学实用教程 课件制作人 苏小红80动态数组动态数组 一维动态数组一维动态数组一维动态数组一维动态数组例例例例7.137.13 intint *p=NULL;*p=NULL;printf(Please enter array size:);printf(Please enter array size:);scanf(%d,&n);scanf(%d,&n);p=(p=(int*int*)malloc(n*)malloc(n*sizeofsizeof(int);(int);pi /pi /像使用一维数组一样使用像使用一维数组一样使用像使用一维数组一样使用像使用一维数组一样使用 二维动态数组二维动态数组二维动态数组二维动态数组例例例例7.147.14printf(Please enter array size m,n:);printf(Please enter array size m,n:);scanf(%d,%d,&m,&n);scanf(%d,%d,&m,&n);p=(p=(int*int*)calloc(m*n,)calloc(m*n,sizeofsizeof(int);(int);pi*n+j);/pi*n+j);/像使用一维数组一样使用像使用一维数组一样使用像使用一维数组一样使用像使用一维数组一样使用 2024/7/14C语言大学实用教程 课件制作人 苏小红81这一章我们学习了这一章我们学习了 指针的概念指针的概念指针的概念指针的概念指针是一种特殊的数据类型指针是一种特殊的数据类型指针是一种特殊的数据类型指针是一种特殊的数据类型 指针的使用原则指针的使用原则指针的使用原则指针的使用原则永远要清楚每个指针指向了什么位置永远要清楚每个指针指向了什么位置永远要清楚每个指针指向了什么位置永远要清楚每个指针指向了什么位置 永远要清楚每个指针指向的位置中的内容是什么永远要清楚每个指针指向的位置中的内容是什么永远要清楚每个指针指向的位置中的内容是什么永远要清楚每个指针指向的位置中的内容是什么 指针与数组之间的关系指针与数组之间的关系指针与数组之间的关系指针与数组之间的关系掌握二维数组在内存中的存放方式,是理解二维数组的掌握二维数组在内存中的存放方式,是理解二维数组的掌握二维数组在内存中的存放方式,是理解二维数组的掌握二维数组在内存中的存放方式,是理解二维数组的行指针和列指针的关键行指针和列指针的关键行指针和列指针的关键行指针和列指针的关键 指针的应用指针的应用指针的应用指针的应用做函数参数,传地址调用做函数参数,传地址调用做函数参数,传地址调用做函数参数,传地址调用动态分配内存,实现动态数组,对于动态分配的内存,动态分配内存,实现动态数组,对于动态分配的内存,动态分配内存,实现动态数组,对于动态分配的内存,动态分配内存,实现动态数组,对于动态分配的内存,不要忘记在不使用时释放不要忘记在不使用时释放不要忘记在不使用时释放不要忘记在不使用时释放2024/7/14C语言大学实用教程 课件制作人 苏小红82作业作业 P286289P286289,7.1(5)7.1(5),7.27.47.27.4 P289P289,7.77.87.77.8
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!