书签 分享 收藏 举报 版权申诉 / 102
上传文档赚钱

类型c语言指针(总结)课件.ppt

  • 上传人(卖家):ziliao2023
  • 文档编号:6100631
  • 上传时间:2023-05-29
  • 格式:PPT
  • 页数:102
  • 大小:1.09MB
  • 【下载声明】
    1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
    2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
    3. 本页资料《c语言指针(总结)课件.ppt》由用户(ziliao2023)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
    4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
    5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
    配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    语言 指针 总结 课件
    资源描述:

    1、第第11章章 指针指针C程序设计快速进阶大学教程程序设计快速进阶大学教程C程序设计快速进阶大学教程2023-5-292第第11章章 指针指针本章要点本章要点 指针概念指针概念 指针与数组指针与数组 指针与函数指针与函数 字符串字符串 动态空间管理动态空间管理C程序设计快速进阶大学教程2023-5-29311 指针指针知识点知识点 指针概念指针概念 指向数组的指针、指针数组指向数组的指针、指针数组 指针做参数、指针做为函数值、指向函数的指针指针做参数、指针做为函数值、指向函数的指针 字符串字符串 动态空间管理动态空间管理C程序设计快速进阶大学教程2023-5-29411.1 理解指针理解指针当问

    2、路时,经常听到这样的回答:当问路时,经常听到这样的回答:“向前走过向前走过3个个路口右转,再过两个路口左转,再前行路口右转,再过两个路口左转,再前行200米。米。”当在图书馆中找一本时,经常是这样找:当在图书馆中找一本时,经常是这样找:“第五排第五排书架,从上向下数第二层,左数第书架,从上向下数第二层,左数第6本。本。”老师提问学生,在不知道学生姓名的情况下,经常老师提问学生,在不知道学生姓名的情况下,经常说:说:“第第4排左数第二个同学。排左数第二个同学。”上述例子说明对一个事务的访问,当不能够通过名上述例子说明对一个事务的访问,当不能够通过名称直接访问,只能够通过其位置进行访问。称直接访问

    3、,只能够通过其位置进行访问。C程序同样的道理,前面的章节对数据的访问是通程序同样的道理,前面的章节对数据的访问是通过变量名称实现的,但是,有时候不知道其名称,过变量名称实现的,但是,有时候不知道其名称,甚至其没有名称,这时候只能通过该数据所在的地甚至其没有名称,这时候只能通过该数据所在的地址进行访问。址进行访问。C程序设计快速进阶大学教程2023-5-29511.2 指向变量的指针指向变量的指针C语言中定义一个变量时,例如:语言中定义一个变量时,例如:int i1=3;描述了变量相关的描述了变量相关的3方面的属性:方面的属性:值、地值、地址、类型址、类型。1.值为值为3,通过变量访问,如,通过

    4、变量访问,如i1+52.地址为地址为0012ff78(32位机器,位机器,0012ff78为为16进制数),进制数),占用内存空间的位置,通过占用内存空间的位置,通过&i1访问,访问,&在在scanf语句中语句中使用过。使用过。3.类型为类型为int,决定了其能够参加的运算,同时也决定了其,决定了其能够参加的运算,同时也决定了其占用空间的大小(从起始地址开始占用的连续字节数),占用空间的大小(从起始地址开始占用的连续字节数),占用空间的大小通过占用空间的大小通过sizeof运算符,在运算符,在vc中中sizeof(i1)为为4个字节。个字节。C程序设计快速进阶大学教程2023-5-29611.

    5、2 指向变量的指针指向变量的指针把变量把变量i1的地址存放于指针变量的地址存放于指针变量pi1中中 C程序设计快速进阶大学教程2023-5-29711.2.1 指针变量的定义指针变量的定义指针变量定义的一般形式为:指针变量定义的一般形式为:类型说明符类型说明符 *变量名变量名;例如:例如:int*pi1;对指针变量的定义包括三个内容:对指针变量的定义包括三个内容:1.指针类型说明,指针类型说明,*表示这是一个指针变量;表示这是一个指针变量;2.指针变量名,指针变量名,pi1为指针变量名;为指针变量名;3.指针所指向的变量的数据类型,指针所指向的变量的数据类型,int为指针变量所指向的为指针变量

    6、所指向的变量的数据类型,说明变量的数据类型,说明pi1只能储存整型变量的地址。只能储存整型变量的地址。再如:再如:float*pf1;/*pf1是指向浮点变量的指针变量是指向浮点变量的指针变量*/char*pc1 /*pc1是指向字符变量的指针变量是指向字符变量的指针变量*/C程序设计快速进阶大学教程2023-5-29811.2.2 指针变量的引用指针变量的引用 指针变量同普通变量一样,使用之前不仅要指针变量同普通变量一样,使用之前不仅要定义说明,而且必须赋予具体的值。定义说明,而且必须赋予具体的值。未经赋值的指针变量不能使用,否则将造成系未经赋值的指针变量不能使用,否则将造成系统混乱,甚至死

    7、机。(统混乱,甚至死机。(问路时别人告诉你一个不问路时别人告诉你一个不存在的地址,会怎么样?存在的地址,会怎么样?)C程序设计快速进阶大学教程2023-5-29911.2.2 指针变量的引用指针变量的引用 和指针相关有两个运算符和指针相关有两个运算符&和和*:1.&:取地址运算符。:取地址运算符。其一般形式为:其一般形式为:&变量名变量名 取一个内存变量的地址。取一个内存变量的地址。2.*:指针运算符(或称:指针运算符(或称“间接访问间接访问”运算符)。运算符)。其一般形式为:其一般形式为:*指针变量名指针变量名通过指针变量间接访问指针变量所指向变量的数据。通过指针变量间接访问指针变量所指向变

    8、量的数据。int i1;int *pi1;pi1=&i1;int i2=*pi1+1;此处此处*代表间接访问运算符,取指针变量代表间接访问运算符,取指针变量pi1所指向的变量所指向的变量i1的值(对的值(对i1间接访问)加间接访问)加1赋值给变量赋值给变量i2。此语句结果完。此语句结果完全等价于:全等价于:int i2=i1+1;C程序设计快速进阶大学教程2023-5-291011.2.2 指针变量的引用指针变量的引用指针变量说明:指针变量说明:1.对对*要区别类型说明符与间接访问符。要区别类型说明符与间接访问符。2.不能用一个数给指针变量赋值,下面赋值是错误的:不能用一个数给指针变量赋值,下

    9、面赋值是错误的:int*pi1;pi1=20;但是,指针可用但是,指针可用0赋值,代表空指针,哪里也不指向。赋值,代表空指针,哪里也不指向。3.给指针变量赋值时,指针变量前不能加给指针变量赋值时,指针变量前不能加“*”说明符,下面的说明符,下面的写法是错误的:写法是错误的:int i1;int*pi1;*pi1=&i1;指针变量指针变量pi1前面加前面加*就代表间接访问了,代表就代表间接访问了,代表i1。C程序设计快速进阶大学教程2023-5-291111.2.2 指针变量的引用指针变量的引用指针变量说明:指针变量说明:4.指针变量未指向具体有效地址,间接访问会有问题指针变量未指向具体有效地址

    10、,间接访问会有问题 int*pi1;/*指针变量指针变量pi1未赋值,不知道指向哪里未赋值,不知道指向哪里*/*pi1=200;/*向向pi1所指向的地址空间赋值所指向的地址空间赋值200*/(随机给你一个账户,存钱后怎样取呢?随机给你一个账户,存钱后怎样取呢?)判定一个指针变量是否指向有效空间:判定一个指针变量是否指向有效空间:int*pi1=0;if(pi1!=0)*pi1=200;省略号部分,若未使省略号部分,若未使pi1指向有效空间,这对指向有效空间,这对*pil的赋值就不会的赋值就不会执行。执行。C程序设计快速进阶大学教程2023-5-291211.2.2 指针变量的引用指针变量的引

    11、用指针变量说明:指针变量说明:5.指针变量的值是可以改变的指针变量的值是可以改变的int i1=3,i2=4,*pi1;pi1=&i1;i2=i2+*pi1;C程序设计快速进阶大学教程2023-5-291311.2.2 指针变量的引用指针变量的引用指针变量说明:指针变量说明:5.指针变量的值是可以改变的指针变量的值是可以改变的pi1=&i2;改变指针变量改变指针变量pi1指向指向i2 C程序设计快速进阶大学教程2023-5-291411.2.2 指针变量的引用指针变量的引用指针变量说明:指针变量说明:5.指针变量只能用同类型的地址赋值指针变量只能用同类型的地址赋值float*pf1;/*pf1

    12、是指向浮点变量的指针变量是指向浮点变量的指针变量*/char c1;/*字符变量字符变量*/pf1=&c1;pf1只能存储只能存储float数据的地址,用字符型数据地址赋值是错误数据的地址,用字符型数据地址赋值是错误的。的。C程序设计快速进阶大学教程2023-5-291511.2.2 指针变量的引用指针变量的引用指针变量说明:指针变量说明:7.同类型指针变量间可以相互赋值同类型指针变量间可以相互赋值例例11.1 交换指针变量交换指针变量#include int main()int i1=3,i2=4;int*pi1,*pi2,*pi3;pi1=&i1;pi2=&i2;pi3=0;/*交换指针变

    13、量交换指针变量*/pi3=pi1;pi1=pi2;pi2=pi3;printf(i1=%dni2=%dn,i1,i2);printf(*pi1=%dn*pi2=%dn,*pi1,*pi2);return 0;程序运行结果:程序运行结果:i1=3i2=4*pi1=4*pi2=3C程序设计快速进阶大学教程2023-5-291611.2.2 指针变量的引用指针变量的引用指针变量说明:指针变量说明:7.同类型指针变量间可以相互赋值同类型指针变量间可以相互赋值例例11.1 交换指针变量交换指针变量C程序设计快速进阶大学教程2023-5-291711.2.2 指针变量的引用指针变量的引用指针变量说明:指针

    14、变量说明:7.同类型指针变量间可以相互赋值同类型指针变量间可以相互赋值例例11.2 交换指针变量所指向的数据交换指针变量所指向的数据#include int main()int i1=3,i2=4;int*pi1,*pi2;int iTemp=0;pi1=&i1;pi2=&i2;/*交换指针变量所指向的数据交换指针变量所指向的数据*/iTemp=*pi1;*pi1=*pi2;*pi2=iTemp;printf(i1=%dni2=%dn,i1,i2);printf(*pi1=%dn*pi2=%dn,*pi1,*pi2);return 0;程序运行结果:程序运行结果:i1=4i2=3*pi1=4*

    15、pi2=3C程序设计快速进阶大学教程2023-5-291811.2.2 指针变量的引用指针变量的引用指针变量说明:指针变量说明:7.同类型指针变量间可以相互赋值同类型指针变量间可以相互赋值例例11.2 交换指针变量所指向的数据交换指针变量所指向的数据C程序设计快速进阶大学教程2023-5-291911.3 数组与指针数组与指针 一个变量有一个地址,一个数组包含若干元素,一个变量有一个地址,一个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都每个数组元素都在内存中占用存储单元,它们都有相应的地址。所谓数组的指针是指数组的起始有相应的地址。所谓数组的指针是指数组的起始地址,数组元素的指

    16、针是数组元素的地址。地址,数组元素的指针是数组元素的地址。对数组元素也可以采用指针进行访问,效率相对数组元素也可以采用指针进行访问,效率相对更高。对更高。C程序设计快速进阶大学教程2023-5-292011.3.1 一维数组与指针一维数组与指针一个数组是由连续的一块内存单元组成的。一个数组是由连续的一块内存单元组成的。数组名就是这块连续内存单元的首地址(常量)。数组名就是这块连续内存单元的首地址(常量)。int iArr5=1,2,3,4,5;int*pi;pi=&iArr0;C程序设计快速进阶大学教程2023-5-292111.3.1 一维数组与指针一维数组与指针 C语言规定,数组名代表数组

    17、的首地址,也语言规定,数组名代表数组的首地址,也就是第就是第0号元素的地址。因此,下面两个语句等价:号元素的地址。因此,下面两个语句等价:pi=&iArr0;pi=iArr;iArr数组名是整型数组名是整型常量地址常量地址 int i;iArr=&i;/*不可以,因为不可以,因为iArr为常量为常量*/C程序设计快速进阶大学教程2023-5-292211.3.1 一维数组与指针一维数组与指针1.指针相关的运算符指针相关的运算符(1)取地址运算符取地址运算符&:单目运算符:单目运算符(注意其优先级注意其优先级),其结合性为自右至左,其功能是取变量的地址。其结合性为自右至左,其功能是取变量的地址。

    18、(2)间接访问运算符间接访问运算符*:单目运算符,其结合性为:单目运算符,其结合性为自右至左,用来表示指针变量所指的变量。自右至左,用来表示指针变量所指的变量。(3)赋值运算符赋值运算符=:可以给指针变量赋值。:可以给指针变量赋值。(4)算术运算符算术运算符+、-、+、-。+:地址表达式(:地址表达式(pi)+整型表达式(整型表达式(in),),结果为在结果为在pi地址值位置跳过地址值位置跳过in(pi所指类型字所指类型字节数)个字节后的地址。节数)个字节后的地址。C程序设计快速进阶大学教程2023-5-292311.3.1 一维数组与指针一维数组与指针1.指针相关的运算符指针相关的运算符-:

    19、地址表达式(:地址表达式(pi)-整型表达式(整型表达式(in),结果为),结果为在在pi地址值位置跳回地址值位置跳回in(pi所指类型字节数)所指类型字节数)个字节后的地址。个字节后的地址。-:地址表达式(:地址表达式(pi1)-地址表达式(地址表达式(pi12),结果),结果为在为在pi2和和pi1相差的字节数相差的字节数(pi1所指类型字所指类型字节数)。节数)。pi1与与pi2必须指向相同数据类型。必须指向相同数据类型。+:地址变量(:地址变量(pi)+或者或者+地址变量(地址变量(pi),),结果为在结果为在pi地址值位置跳过地址值位置跳过pi所指类型字节数所指类型字节数个字节后的地

    20、址。分前个字节后的地址。分前+和后和后+。-:地址变量(:地址变量(pi)-或者或者-地址变量(地址变量(pi),结果),结果为在为在pi地址值位置跳回地址值位置跳回pi所指类型字节数个字所指类型字节数个字节后的地址。分前节后的地址。分前-和后和后-。C程序设计快速进阶大学教程2023-5-292411.3.1 一维数组与指针一维数组与指针1.指针相关的运算符指针相关的运算符(5)关系运算。支持关系运算。支持6种关系运算符,用来比较地种关系运算符,用来比较地址的大小。例如:址的大小。例如:&iArr1&iArr3 为真;为真;piiArr+3为真(为真(pi的值为的值为iArr)。)。C程序设

    21、计快速进阶大学教程2023-5-292511.3.1 一维数组与指针一维数组与指针1.指针相关的运算符指针相关的运算符(5)关系运算。关系运算。int iArr5=0,1,2,3,4;int*pi,*pi1,*pi2;pi=&iArr1;pi1=&iArr2;pi2=&iArr4;*pi+:由于:由于+和和*同优先级,结合方向自右而左,等价于同优先级,结合方向自右而左,等价于*(pi+)。先对。先对*pi,然后,然后pi加加1。表达式的值为。表达式的值为iArr1,pi的值为的值为&iArr2。*+pi:等价于:等价于*(+pi)。先。先pi加加1,然后,然后*pi。表达式的值为。表达式的值为

    22、iArr2,pi的的值为值为&iArr2。(*pi)+:先:先*pi,然后(,然后(*pi)加)加1。表达式的值为。表达式的值为iArr1+,iArr1的值的值改变了,改变了,pi的值为的值为&iArr1,pi的值未改变。的值未改变。pi2-pi1:pi2和和pi1相差两个整型数所占字节数的大小,它的返回值不是相相差两个整型数所占字节数的大小,它的返回值不是相差字节数,而是相差整数的个数,所以值为差字节数,而是相差整数的个数,所以值为2。上述算术运算符对简单变量地址运算是无意义的,因为对于一个简单变量上述算术运算符对简单变量地址运算是无意义的,因为对于一个简单变量x,&x+5计算的结果地址不知

    23、道是哪个数据的地址。而数组空间是连续计算的结果地址不知道是哪个数据的地址。而数组空间是连续的,对于一个数组的,对于一个数组arr,arr+5就是就是arr5的地址。的地址。C程序设计快速进阶大学教程2023-5-292611.3.1 一维数组与指针一维数组与指针1.指针相关的运算符指针相关的运算符(5)关系运算。关系运算。int iArr5=0,1,2,3,4;int*pi,*pi1,*pi2;pi=&iArr1;pi1=&iArr2;pi2=&iArr4;*pi+:由于:由于+和和*同优先级,结合方向自右而左,等价于同优先级,结合方向自右而左,等价于*(pi+)。先对。先对*pi,然后,然后

    24、pi加加1。表达式的值为。表达式的值为iArr1,pi的值为的值为&iArr2。*+pi:等价于:等价于*(+pi)。先。先pi加加1,然后,然后*pi。表达式的值为。表达式的值为iArr2,pi的的值为值为&iArr2。(*pi)+:先:先*pi,然后(,然后(*pi)加)加1。表达式的值为。表达式的值为iArr1+,iArr1的值的值改变了,改变了,pi的值为的值为&iArr1,pi的值未改变。的值未改变。pi2-pi1:pi2和和pi1相差两个整型数所占字节数的大小,它的返回值不是相相差两个整型数所占字节数的大小,它的返回值不是相差字节数,而是相差整数的个数,所以值为差字节数,而是相差整

    25、数的个数,所以值为2。上述算术运算符对简单变量地址运算是无意义的,因为对于一个简单变量上述算术运算符对简单变量地址运算是无意义的,因为对于一个简单变量x,&x+5计算的结果地址不知道是哪个数据的地址。而数组空间是连续计算的结果地址不知道是哪个数据的地址。而数组空间是连续的,对于一个数组的,对于一个数组arr,arr+5就是就是arr5的地址。的地址。C程序设计快速进阶大学教程2023-5-292711.3.1 一维数组与指针一维数组与指针2.引用数组元素引用数组元素 int iArr5=1,2,3,4,5;int*pi;pi=iArr;(1)pi+i1和和iArr+i1就是就是iArri1的地

    26、址,或者说它们指向的地址,或者说它们指向iArr数组的第数组的第i个元素。个元素。(2)*(pi+i1)或或*(iArr+i1)就是就是pi+i1或或iArr+i1所指向的数组元所指向的数组元素,即素,即iArr i1。例如,。例如,*(pi+2)或或*(iArr+2)就是就是iArr2。(3)指向数组指针变量可以带下标,如指向数组指针变量可以带下标,如pii1与与*(pi+i1)等价。等价。引入指针变量后,对于数组引入指针变量后,对于数组iArr,pi是指向数组的指针变量,是指向数组的指针变量,其初值其初值pi=iArr。就可以用两种方法来访问数组元素。就可以用两种方法来访问数组元素:(1)

    27、下标法,即用下标法,即用iArri1形式访问数组元素,也可以用形式访问数组元素,也可以用pii1访问数组元素。访问数组元素。(2)指针法,即采用指针法,即采用*(iArr+i1)或或*(pi+i1)形式,用间接访问形式,用间接访问的方法来访问数组元素。的方法来访问数组元素。C程序设计快速进阶大学教程2023-5-292811.3.1 一维数组与指针一维数组与指针例例11.3 数组元素赋值并输出(数组名下标法)数组元素赋值并输出(数组名下标法)#include int main()int iArr5,i1;for(i1=0;i15;i1+)iArri1=i1;for(i1=0;i15;i1+)p

    28、rintf(iArr%d=%dn,i1,iArri1);return 0;C程序设计快速进阶大学教程2023-5-292911.3.1 一维数组与指针一维数组与指针例例11.4 数组元素赋值并输出(指针变量下标法)数组元素赋值并输出(指针变量下标法)#include int main()int iArr5,i1;int*pi=iArr;/*pi为变量,为变量,iArr为常量为常量*/for(i1=0;i15;i1+)pii1=i1;for(i1=0;i15;i1+)printf(iArr%d=%dn,i1,pii1);return 0;C程序设计快速进阶大学教程2023-5-293011.3.

    29、1 一维数组与指针一维数组与指针例例11.5 数组元素赋值并输出(数组名指针法)数组元素赋值并输出(数组名指针法)#include int main()int iArr5,i1;for(i1=0;i15;i1+)*(iArr+i1)=i1;for(i1=0;i15;i1+)printf(iArr%d=%dn,i1,*(iArr+i1);return 0;C程序设计快速进阶大学教程2023-5-293111.3.1 一维数组与指针一维数组与指针例例11.6 数组元素赋值并输出(指针变量指针法)数组元素赋值并输出(指针变量指针法)#include int main()int iArr5,i1;in

    30、t*pi=iArr;for(i1=0;i15;i1+)*(pi+i1)=i1;for(i1=0;i15;i1+)printf(iArr%d=%dn,i1,*(pi+i1);return 0;C程序设计快速进阶大学教程2023-5-293211.3.1 一维数组与指针一维数组与指针例例11.7 数组元素赋值并输出(指针变量指针移动法)数组元素赋值并输出(指针变量指针移动法)#include int main()int iArr5,i1;int*pi=iArr;for(i1=0;i15;i1+)*pi=i1;pi+;/*此时,此时,pi已经指向已经指向iArr4之后,输出数组元素,之后,输出数组元

    31、素,pi重新指回数组头部重新指回数组头部*/pi=iArr;for(i1=0;i15;i1+)printf(iArr%d=%dn,i1,*pi);pi+;return 0;C程序设计快速进阶大学教程2023-5-293311.3.1 一维数组与指针一维数组与指针例例11.8 数组元素赋值并输出(指针变量关系运算指针法)数组元素赋值并输出(指针变量关系运算指针法)#include int main()int iArr5,i1=0;int*pi=iArr;for(;piiArr+5;pi+,i1+)*pi=i1;/*此时,此时,pi已经指向已经指向iArr4之后,之后,为下面输出数组,必须让为下面

    32、输出数组,必须让pi重新指回数组头部重新指回数组头部*/pi=iArr;i1=0;for(;piiArr+5;pi+,i1+)printf(iArr%d=%dn,i1,*pi);return 0;C程序设计快速进阶大学教程2023-5-293411.3.2 二维数组与指针二维数组与指针1.理解二维数组理解二维数组 C语言对二维数组的存储是行优先方式的,对于整语言对二维数组的存储是行优先方式的,对于整型二维数组型二维数组iArr。int iArr34=1,2,3,4,5,6,7,8,9,10,11,12C程序设计快速进阶大学教程2023-5-293511.3.2 二维数组与指针二维数组与指针1.

    33、理解二维数组理解二维数组一个二维数组是以一维数组为元素构造的一维数组,也就是二一个二维数组是以一维数组为元素构造的一维数组,也就是二维数组可以看作一维数组,只不过该一维数组的每个元素维数组可以看作一维数组,只不过该一维数组的每个元素又是一个一维数组。如又是一个一维数组。如iArr,把,把iArr当作一维数组看待,当作一维数组看待,iArr有有3个元素,分别为个元素,分别为iArr0,iArr1,iArr2,每个,每个元素是一个有元素是一个有4个整型元素构成的一维数组。个整型元素构成的一维数组。C程序设计快速进阶大学教程2023-5-293611.3.2 二维数组与指针二维数组与指针1.理解二维

    34、数组理解二维数组iArri1有两层含义,它既是有两层含义,它既是“一维数组一维数组iArr”的数组的数组元素,又是一维数组名。元素,又是一维数组名。iArr1是数组是数组iArr的一个数组元素;的一个数组元素;同时,同时,iArr1是一个一维数组名,含有是一个一维数组名,含有iArr10,iArr11,iArr12,iArr13四个元素。四个元素。C程序设计快速进阶大学教程2023-5-293711.3.2 二维数组与指针二维数组与指针1.理解二维数组(对比一维)理解二维数组(对比一维)对于一维数组:对于一维数组:int iArr14=11,12,13,14;iArr1是一个其数组元素类型的常

    35、量地址,即是一个其数组元素类型的常量地址,即int型的型的常量地址常量地址,则,则iArr1+1的值会跳过一个数组元素,的值会跳过一个数组元素,即跳过即跳过4个字节(假定一个个字节(假定一个int,4个字节)。个字节)。对于当作一维数组的对于当作一维数组的“iArr”,iArr是一个其数组元素是一个其数组元素类型的常量地址,它的数组元素为类型的常量地址,它的数组元素为iArri1(iArri1为为4个个int类型的一维数组),类型的一维数组),所以所以iArr为大小为为大小为4的一维整型数组型的常量地址的一维整型数组型的常量地址,则,则iArr+1的值会跳过一个数组元素,即跳过大小为的值会跳过

    36、一个数组元素,即跳过大小为4的一维整型数组(一行,的一维整型数组(一行,16个字节,假定一个个字节,假定一个int为为4个字节)。因此也把个字节)。因此也把iArr称为称为行地址行地址。C程序设计快速进阶大学教程2023-5-293811.3.2 二维数组与指针二维数组与指针1.理解二维数组(对比一维)理解二维数组(对比一维)在一维数组中在一维数组中iArr1中,中,iArr1i1等价于等价于*(iArr1+i1),代表取出第代表取出第i1个元素。个元素。在二维数组在二维数组iArr中,中,iArri1也等价于也等价于*(iArr+i1),iArri1和和*(iArr+i1)是一维数组的数组名

    37、和首地是一维数组的数组名和首地址址。因为。因为iArri1和和*(iArr+i1)为一维数组,为整数为一维数组,为整数类型常量地址,所以类型常量地址,所以iArri1+1和和*(iArr+i1)+1都都会跳过一个整型数据(一列,会跳过一个整型数据(一列,4个字节,假定一个个字节,假定一个int为为4个字节),因此,也把个字节),因此,也把iArri1和和*(iArr+i1)称为称为列地址列地址。C程序设计快速进阶大学教程2023-5-293911.3.2 二维数组与指针二维数组与指针1.理解二维数组(对比一维)理解二维数组(对比一维)行地址(一维数组地址),一次跳过一行,如行地址(一维数组地址

    38、),一次跳过一行,如iArr、iArr+i1、&iArri1、&*(iArr+i1);列地址(数据元素),一次跳过一列,如列地址(数据元素),一次跳过一列,如*iArr、*(iArr+i1)、iArri1。*(*(iArr+1)+2):iArr+1一行指针,*(iArr+1)一列指针,*(iArr+1)+2 一行二列地址,*(*(iArr+1)+2)一行二列地址间接访问到iArr12,值为7。C程序设计快速进阶大学教程2023-5-294011.3.2 二维数组与指针二维数组与指针例例11.9 行列地址行列地址#include int main()int iArr34=1,2,3,4,5,6,

    39、7,8,9,10,11,12;/*行地址行地址*/printf(行地址行地址n);printf(iArr=%x,iArr);printf(iArr+1=%xn,iArr+1);printf(&iArr0=%x,&iArr0);printf(&iArr0+1=%xn,&iArr0+1);printf(&*(iArr+0)=%x,&*(iArr+0);printf(&*(iArr+0)+1=%xn,&*(iArr+0)+1);/*列地址列地址*/printf(列地址列地址n);printf(*iArr=%x,*iArr);printf(*iArr+1=%xn,*iArr+1);printf(iAr

    40、r0=%x,iArr0);printf(iArr0+1=%xn,iArr0+1);printf(*(iArr+0)=%x,*(iArr+0);printf(*(iArr+0)+1=%xn,*(iArr+0)+1);程序运行结果:程序运行结果:行地址行地址iArr=12ff50,iArr+1=12ff60&iArr0=12ff50,&iArr0+1=12ff60&*(iArr+0)=12ff50,&*(iArr+0)+1=12ff60列地址列地址*iArr=12ff50,*iArr+1=12ff54iArr0=12ff50,iArr0+1=12ff54*(iArr+0)=12ff50,*(iAr

    41、r+0)+1=12ff54数据元素数据元素iArr12=7 /*访问元素访问元素*/printf(数据元素数据元素n);printf(iArr12=%dn,*(*(iArr+1)+2);return 0;C程序设计快速进阶大学教程2023-5-294111.3.2 二维数组与指针二维数组与指针2.指向一维数组的指针指向一维数组的指针 对于一维数组对于一维数组int iArr14;可以把可以把iArr赋值给指向赋值给指向int型的指针变量。如:型的指针变量。如:int*pi1;pi1=iArr1;对于二维数组对于二维数组int iArr34=1,2,3,4,5,6,7,8,9,10,11,12;

    42、同样可以把同样可以把iArr赋值给指向赋值给指向一维数组一维数组的指针变量,因为二维数的指针变量,因为二维数组可以看成以一维数组为成员的一维数组。组可以看成以一维数组为成员的一维数组。int(*pia)4;它表示它表示pia是一个指针变量,它指向包含是一个指针变量,它指向包含4个元素的一维数组。个元素的一维数组。然后就可以赋值:然后就可以赋值:pia=iArr;C程序设计快速进阶大学教程2023-5-294211.3.2 二维数组与指针二维数组与指针2.指向一维数组的指针指向一维数组的指针 pia指向第一个一维数组指向第一个一维数组iArr0,其值等于,其值等于iArr。而。而pia+1则指向

    43、一维数组则指向一维数组iArr1。从前面的行列地址。从前面的行列地址分析可得出分析可得出*(pia+iRow)+iCol是二维数组是二维数组iRow行行iCol 列的元素的地址,而列的元素的地址,而*(*(pia+iRow)+iCol)则则是是iRow行行iCol列元素的值。列元素的值。C程序设计快速进阶大学教程2023-5-294311.3.2 二维数组与指针二维数组与指针2.指向一维数组的指针指向一维数组的指针 指向一维数组的指针变量定义的一般形式为:指向一维数组的指针变量定义的一般形式为:类型说明符类型说明符(*指针变量名指针变量名)数组长度数组长度;其中其中“类型说明符类型说明符”为所

    44、指数组的数组元素类型,为所指数组的数组元素类型,“*”表示其后的变量是指针类型,表示其后的变量是指针类型,“数组长度数组长度”表示所指向一维数组的长度。应注意表示所指向一维数组的长度。应注意“(*指针变指针变量名量名)”两边的括号不可少,如缺少括号则表示是两边的括号不可少,如缺少括号则表示是指针数组指针数组(后面介绍后面介绍),意义就完全不同了。,意义就完全不同了。可以这样理解:先看小括号内,有可以这样理解:先看小括号内,有*号是在定义指针号是在定义指针变量;然后是中括号,表示指针变量指向该长度变量;然后是中括号,表示指针变量指向该长度的一维数组;最后看类型说明符,表示该数组的的一维数组;最后

    45、看类型说明符,表示该数组的每个元素为类型说明符说明的类型。每个元素为类型说明符说明的类型。C程序设计快速进阶大学教程2023-5-294411.3.2 二维数组与指针二维数组与指针例例11.10 一个学习小组有一个学习小组有5个人,每个人有个人,每个人有3门课的考试成绩。要求利用函门课的考试成绩。要求利用函数计算每门课程的平均成绩数计算每门课程的平均成绩如:如:赵赵钱钱 孙孙李李张张Math 80 61598576C 7565638777English 9271709085问题分析:问题分析:可定义一个二维数组可定义一个二维数组score35存储五个人存储五个人3门课的成绩。再定义一个一维门课

    46、的成绩。再定义一个一维数组数组courseAverage3存储计算所得各门课平均成绩。存储计算所得各门课平均成绩。要完成的两个函数都要接收一门课程(数组的一行)为参数,所以应该设要完成的两个函数都要接收一门课程(数组的一行)为参数,所以应该设指向一维数组的指针为参数。指向一维数组的指针为参数。算法描述:算法描述:1.依次输入每门课程的成绩(每门课一行)。依次输入每门课程的成绩(每门课一行)。2.计算每门课程平均成绩,即对每行计算平均成绩(函数完成)。计算每门课程平均成绩,即对每行计算平均成绩(函数完成)。3.输出每门课程平均成绩。输出每门课程平均成绩。C程序设计快速进阶大学教程2023-5-2

    47、94511.3.2 二维数组与指针二维数组与指针#include int main()int i,j;float sum;float score35;/*存储成绩存储成绩*/float courseAverage3;/*存储每门课程平均成绩存储每门课程平均成绩*/float average(float(*p)5);/*输入成绩输入成绩*/for(i=0;i3;i+)/*行(每门课)循环行(每门课)循环*/for(j=0;j5;j+)/*行内每列循环行内每列循环*/scanf(%f,&scoreij);/*输出成绩表输出成绩表*/for(i=0;i3;i+)/*行(每门课)循环行(每门课)循环*

    48、/for(j=0;j5;j+)/*行内每列循环行内每列循环*/printf(%ft,scoreij);printf(n);/*每行结束输出一个换行每行结束输出一个换行*/*计算平均成绩计算平均成绩*/for(i=0;i3;i+)/*行(每门课)循环行(每门课)循环*/courseAveragei=average(score+i);/*每行地址为参数每行地址为参数*/*输出成绩表输出成绩表*/for(i=0;i3;i+)printf(%ft,courseAveragei);return 0;/*计算平均成绩,参数为行地址计算平均成绩,参数为行地址(指向一维数组指针)(指向一维数组指针)*/flo

    49、at average(float(*p)5)int i;float sum=0;for(i=0;i5;i+)/*p转为列地址,转为列地址,(*p+i)偏移偏移i,间接访问间接访问*(*p+i)*/sum+=*(*p+i);return sum/5;C程序设计快速进阶大学教程2023-5-294611.3.3 指针数组指针数组一个数组的元素值为指针,则该数组称为一个数组的元素值为指针,则该数组称为指针数组指针数组。指针数组所有元素都必须是指向相同数据类型的指针。指针数组所有元素都必须是指向相同数据类型的指针。指针数组定义的一般形式为:指针数组定义的一般形式为:类型说明符类型说明符*数组名数组名数

    50、组长度数组长度;可以这样理解:先看可以这样理解:先看“数组名数组名数组长度数组长度”,表示定义,表示定义一个该长度的一维数组;然后看一个该长度的一维数组;然后看“类型说明符类型说明符*”,表示该数组的每个元素为指向该类型说明符类型表示该数组的每个元素为指向该类型说明符类型的指针。的指针。例如:例如:int*pa3;表示表示pa是一个指针数组,它有三个数组元素,每个元是一个指针数组,它有三个数组元素,每个元素值都是一个指针,指向整型变量。素值都是一个指针,指向整型变量。C程序设计快速进阶大学教程2023-5-294711.3.3 指针数组指针数组例例11.11 通过指针数组访问二维数组通过指针数

    展开阅读全文
    提示  163文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    关于本文
    本文标题:c语言指针(总结)课件.ppt
    链接地址:https://www.163wenku.com/p-6100631.html

    Copyright@ 2017-2037 Www.163WenKu.Com  网站版权所有  |  资源地图   
    IPC备案号:蜀ICP备2021032737号  | 川公网安备 51099002000191号


    侵权投诉QQ:3464097650  资料上传QQ:3464097650
       


    【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。

    163文库