欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    第三版C语言PPT课件讲解第10章+指针.ppt

    • 资源ID:57946899       资源大小:1.36MB        全文页数:90页
    • 资源格式: PPT        下载积分:20金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要20金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    第三版C语言PPT课件讲解第10章+指针.ppt

    第三版第三版C语言语言PPT课件课件讲解第讲解第10章章+指针指针一个比方一个比方:旅旅 客客 变量数据变量数据 旅旅 客客 名名 字字 变量名变量名 旅馆房间旅馆房间 内内 存存 区区 旅馆房间号旅馆房间号 地地 址址 查找旅客查找旅客:旅客名字:旅客名字房间号码房间号码房房 间间找到旅客找到旅客 存取数据存取数据:变量名变量名 内存地址内存地址内存区内存区数数 据据注意注意:内存单元的地址内存单元的地址与与内存单元的内容内存单元的内容是不同的。是不同的。内存单元内存单元地址地址旅馆房间旅馆房间号码号码 内存单元内存单元内容内容住在房间内的住在房间内的旅客旅客。内存地址内存地址 331 220 2000 2002 20042006内存用户数据区内存用户数据区内存中存内存中存放的数据放的数据3、数据存取举例、数据存取举例 设程序中已定义三个整型变量设程序中已定义三个整型变量设程序中已定义三个整型变量设程序中已定义三个整型变量 i i,j j,k k,编译时系统将,编译时系统将,编译时系统将,编译时系统将20002000和和和和20012001两个字节给变量两个字节给变量两个字节给变量两个字节给变量i i ,20022002、20032003给给给给j j,20042004、20052005给给给给k k。内存。内存。内存。内存分配示意图如下分配示意图如下分配示意图如下分配示意图如下 内存地址内存地址3 6 9 2000 2002 2004内存用户数据区内存用户数据区变量变量 i i 变量变量 j j 变量变量 k kprintf(“%d”,i)printf(“%d”,i)变量名变量名变量名变量名i i 地址地址地址地址2000 2000 取变量值取变量值取变量值取变量值3 3 送到送到送到送到PRNPRNk=i+jk=i+j 变量名变量名变量名变量名i i 地址地址地址地址2000 2000 取变量值取变量值取变量值取变量值3 3 变量名变量名变量名变量名j j 地址地址地址地址2002 2002 取变量值取变量值取变量值取变量值6 6 相加得相加得9 送到送到K占用的占用的2004,20054、直接访问与间接访问、直接访问与间接访问 直接访问:直接访问:在数据存取中,直接得到变量在数据存取中,直接得到变量 i 地址然后按变量地址然后按变量 i 的地址存取变量的地址存取变量 i 的值的方式。的值的方式。间接访问:间接访问:在数据存放中,变量在数据存放中,变量 i 的地址不是直接得到,的地址不是直接得到,而是而是存放在另一个变量存放在另一个变量i_pointer中,须先从变量中,须先从变量i_pointer中中 获取变量获取变量 i 地址,然后按变量地址,然后按变量i地址存取变量值地址存取变量值i的方式。的方式。一个比方(取抽屉一个比方(取抽屉A中的东西):中的东西):直接访问:直接访问:直接得到钥匙直接得到钥匙A 打开抽屉打开抽屉A,取出东西,取出东西(直接获得变量(直接获得变量 i 地址地址按变量按变量 i 地址存取变量的地址存取变量的 i 值值)间接访问:间接访问:钥匙钥匙A在抽屉在抽屉B中中用钥匙用钥匙B打开抽屉打开抽屉B得到钥匙得到钥匙A打开抽屉打开抽屉A取得东西取得东西变量变量i地址放在地址放在 变变量量i_pointer中中读取变量读取变量i_pointer值得到变量值得到变量i的地址的地址按变量按变量i地址存取地址存取i值值*间接访问例子间接访问例子间接访问例子间接访问例子过程:根据变量名过程:根据变量名过程:根据变量名过程:根据变量名i_pointeri_pointer获得地址获得地址获得地址获得地址30103010,到地址,到地址,到地址,到地址30103010 读取数据,得到读取数据,得到读取数据,得到读取数据,得到20002000(变量(变量(变量(变量i i的地址),到的地址),到的地址),到的地址),到20002000地地地地 址读取数据,得到变量址读取数据,得到变量址读取数据,得到变量址读取数据,得到变量i i的值。的值。的值。的值。内存地址内存地址3 6 92000 2000 2002 20043010内存用户数据区内存用户数据区变量变量 i i变量变量 j j变量变量 k k变量变量 i_pointeri_pointer5 5、指针和指针变量、指针和指针变量、指针和指针变量、指针和指针变量指针:指针:指针:指针:一个变量的在内存区中的一个变量的在内存区中的一个变量的在内存区中的一个变量的在内存区中的地址地址地址地址称为指针。通过变量的指称为指针。通过变量的指称为指针。通过变量的指称为指针。通过变量的指 针,可以找到变量的存储单元,从而读取其中存放的值;针,可以找到变量的存储单元,从而读取其中存放的值;针,可以找到变量的存储单元,从而读取其中存放的值;针,可以找到变量的存储单元,从而读取其中存放的值;指针变量:指针变量:指针变量:指针变量:专门用来存放指针的专门用来存放指针的专门用来存放指针的专门用来存放指针的变量变量变量变量,称为指针变量。指针变,称为指针变量。指针变,称为指针变量。指针变,称为指针变量。指针变 量存放的数据为量存放的数据为量存放的数据为量存放的数据为另一变量的地址另一变量的地址另一变量的地址另一变量的地址(指针)。(指针)。(指针)。(指针)。注意:指针与指针变量的区别注意:指针与指针变量的区别注意:指针与指针变量的区别注意:指针与指针变量的区别 指针指针指针指针是一个是一个是一个是一个地址地址地址地址,用于指向存放变量数据的内存单元;,用于指向存放变量数据的内存单元;,用于指向存放变量数据的内存单元;,用于指向存放变量数据的内存单元;指针变量指针变量指针变量指针变量是一个是一个是一个是一个变量变量变量变量,它的值是指针,它的值是指针,它的值是指针,它的值是指针 例如:例如:例如:例如:变量变量变量变量 i i 的的的的地址地址地址地址20002000为该变量的为该变量的为该变量的为该变量的指针指针指针指针,变量,变量,变量,变量i_pointeri_pointer是是是是 用来存放用来存放用来存放用来存放 变量变量变量变量i i的指针的,它是一个的指针的,它是一个的指针的,它是一个的指针的,它是一个指针变量指针变量指针变量指针变量。10.2 10.2 变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量指针指针指针指针:它首先是一个地址,是指变量在内存中的:它首先是一个地址,是指变量在内存中的:它首先是一个地址,是指变量在内存中的:它首先是一个地址,是指变量在内存中的地址地址地址地址 ;指针变量指针变量指针变量指针变量:它是一个变量,是一个专门:它是一个变量,是一个专门:它是一个变量,是一个专门:它是一个变量,是一个专门存放变量地址存放变量地址存放变量地址存放变量地址的的的的 变量变量变量变量,用来指向另一个变量。,用来指向另一个变量。,用来指向另一个变量。,用来指向另一个变量。为了表示指针变量和它所指向的变量之间的联系,为了表示指针变量和它所指向的变量之间的联系,为了表示指针变量和它所指向的变量之间的联系,为了表示指针变量和它所指向的变量之间的联系,在程序中用在程序中用在程序中用在程序中用“”表示表示表示表示“指向指向指向指向”例:例:例:例:i_pointeri_pointer代表指针变量,而代表指针变量,而代表指针变量,而代表指针变量,而i_pointeri_pointer是是是是i_pointeri_pointer所指所指所指所指向的变量。如下图所示:向的变量。如下图所示:向的变量。如下图所示:向的变量。如下图所示:i_pointeri_pointer200032000i ii_pointer与与 i 是等效的,都是等效的,都表示同一变量,该变量存放表示同一变量,该变量存放地址为地址为2000。因此:。因此:i3;i_pointer3两语句作用相同两语句作用相同10.2.1定义一个指针变量定义一个指针变量例例:int i,j;int pointer_1,pointer_2;第一条命令定义了两个整型变量第一条命令定义了两个整型变量 i,j;第二条命令定义了第二条命令定义了 两个指针变量两个指针变量 pointer_1,pointer_2,它们,它们指向整型变量;指向整型变量;两个整型变量两个整型变量pointer_1,pointer_2,它们与它们与 i,j为相同类型,被为相同类型,被pointer_1,pointer_2两个指针所指向;两个指针所指向;基类型基类型:指针变量的基类型是指该指针变量可以指向的变量指针变量的基类型是指该指针变量可以指向的变量的类型;的类型;定义指针变量的一般形式定义指针变量的一般形式:基类型基类型 指针变量名指针变量名例:例:float pointer_3;(pointer_3是指向实型变量的指针变量)是指向实型变量的指针变量)char pointer_4;(pointer_4是指向字符型变量的指针变量)是指向字符型变量的指针变量)指针变量指向的改变:指针变量指向的改变:指针变量指向的改变:指针变量指向的改变:方法:方法:方法:方法:将一个该指针将一个该指针将一个该指针将一个该指针允许指向允许指向允许指向允许指向的变量的的变量的的变量的的变量的地址地址地址地址赋给该指针;赋给该指针;赋给该指针;赋给该指针;pointer_1=&ipointer_1ipointer_1i执行赋值语句之前执行赋值语句之前执行赋值语句之后执行赋值语句之后定义指针变量时应注意的两点:定义指针变量时应注意的两点:定义指针变量时应注意的两点:定义指针变量时应注意的两点:(1 1)“”表明它后面所跟的变量类型是指针型变量;需要指表明它后面所跟的变量类型是指针型变量;需要指表明它后面所跟的变量类型是指针型变量;需要指表明它后面所跟的变量类型是指针型变量;需要指出的,出的,出的,出的,指针变量名指针变量名指针变量名指针变量名为为为为pointer_1pointer_1,而不是,而不是,而不是,而不是pointer_1pointer_1,pointer_1pointer_1是一个是一个是一个是一个整型变量整型变量整型变量整型变量;(2 2)在定义指针变量时必须指定基类型。因为不同数据类型在定义指针变量时必须指定基类型。因为不同数据类型在定义指针变量时必须指定基类型。因为不同数据类型在定义指针变量时必须指定基类型。因为不同数据类型占用的内存空间大小不同,在进行指针移动和运算时,将导占用的内存空间大小不同,在进行指针移动和运算时,将导占用的内存空间大小不同,在进行指针移动和运算时,将导占用的内存空间大小不同,在进行指针移动和运算时,将导致不同的结果。如致不同的结果。如致不同的结果。如致不同的结果。如“指针值指针值指针值指针值1 1”,对于基类型为,对于基类型为,对于基类型为,对于基类型为整型整型整型整型,将向,将向,将向,将向后移动后移动后移动后移动两个两个两个两个字节,对于基类型为字节,对于基类型为字节,对于基类型为字节,对于基类型为实型实型实型实型,将向后移动,将向后移动,将向后移动,将向后移动四个四个四个四个字节;字节;字节;字节;10.2.2指针变量的引用指针变量的引用WARNING:指针变量中只能存放地址(指针),不能把其它类型的数指针变量中只能存放地址(指针),不能把其它类型的数 据赋给指针变量。据赋给指针变量。例例:pointer_1为指针变量为指针变量 pointer_1=100 为非法赋值,因为为非法赋值,因为100为整型变量。为整型变量。有关的两个运算符:有关的两个运算符:(1)&:取地址运算符;:取地址运算符;(2):指针运算符(或称为:指针运算符(或称为“间接访问间接访问”运算符)运算符)例:例:&a为变量为变量a的的地址地址,p为指针变量为指针变量p所指向的所指向的存储单元存储单元;二二.指针变量的引用指针变量的引用例例10.1main()int a ,b;int *p1 ,*p2;a=100;b=10;p1=&a;p2=&b;printf(“%d,%d n”,a,b);/*“直接访问直接访问”方式方式*/printf(“%d,%d n”,*p1 ,*p2);/*“间接访问间接访问”方式方式*/结果结果:100,10 100,10 程序中程序中:*p1表示指针变量表示指针变量 p1所指向的变量所指向的变量,即即 a.*p2表示指针变量表示指针变量 p2所指向的变量所指向的变量,即即 b.p1 a&a&b10010p2 b *p1*p2关于关于&与与*运算符的说明运算符的说明:1:&是取地址运算符是取地址运算符.如如:&a ,&b 等等.*是指针运算符是指针运算符.用于定义时表示其后的标识用于定义时表示其后的标识符是指针变量符是指针变量.而在程序中而在程序中*p 则表示指针变量则表示指针变量 p所所指向的变量指向的变量,即即目标变量目标变量。2.&,*,+,同优先级同优先级,按从按从右至左方向右至左方向结合结合.a:如如:int a,*p1,*p2;p1=&a;则则:&*p1 与与&a 等效等效 如:如:p2=&*p1;或或 p2=&a;则则:p2 也指向变量也指向变量 a.b:如如:int a,*p1;p1=&a;则则:*&a 与与*p1 等效等效,即等价于变量即等价于变量a.c:如如:int a,*p1;p1=&a;则则:(*p1)+等价于等价于 a+但注意但注意 *p1+不等价于不等价于 (*p1)+&ap1*p1*&a a 因为因为 *p1+等价于等价于*(p1+)即先得即先得 p1 所指向变所指向变量的值量的值,再使指针变量再使指针变量 p1的值自增的值自增,此时此时 p1 已不在指向原已不在指向原来的变量了来的变量了.例例 10.2 void main()int *p1,*p2,*p,a,b;scanf(“%d,%d”,&a,&b);p1=&a;p2=&b;if(a b)p=p1;p1=p2;p2=p;(进行地址交换进行地址交换)printf(“a=%d,b=%d n”,a,b);printf(“max=%d,min=%d n”,*p1,*p2);如输入如输入:5,9 输出输出:a=5,b=9 max=9,min=5 (注意注意:本程序是采用交换指针变量本程序是采用交换指针变量 p1 和和p2 的指的指向来实现两个数的比较的向来实现两个数的比较的.且比较前后且比较前后 a,b 的值的值并未发生变化并未发生变化)&a&b59&b&a95p1p2p pp1p2aba b三三.指针变量作为函数的参数指针变量作为函数的参数 指针变量可以作函数的参数指针变量可以作函数的参数,其作用是将一个变量的其作用是将一个变量的地地址址传送到另一个函数中。传送到另一个函数中。例例 10.3 void swap(int*p1,int*p2)int p;p=*p1;*p1=*p2;*p2=p;void main()int a,b,*pointer_1 ,*pointer_2;scanf(“%d,%d”,&a,&b);pointer_1=&a;pointer_2=&b;if(ab)swap(pointer_1,pointer_2);printf(“n%d,%d n”,a,b);若输入若输入:5,9 输出为输出为:9,5&a&b59abpointer_1pointer_2(a)&a&b&a&b59abp1p2pointer_1pointer_2(b)&a&a&b&b95p1pointer_1p2pointer_2ab(c)&a&b95abpointer_1pointer_2(d)本程序采用的是交换本程序采用的是交换 a 和和 b 的值的值,而而 p1和和p2 的值不变的值不变.同例同例9.2相反相反.如果把如果把 swap 函数改成函数改成:swap(p1,p2)int *p1,*p2;int *p;*p=*p1;(此句有问题此句有问题)*p1=*p2;*p2=*p;又如又如:swap(int x,int y)int t ;t=x;x=y;y=t;P无确定的地址值无确定的地址值,它的,它的的值不可预见,的值不可预见,*p所指所指向的单元也是不可预见,向的单元也是不可预见,对对*p赋值可能会破坏系赋值可能会破坏系统的正常状态统的正常状态。注意参数的传递注意参数的传递类型为类型为“值传递值传递”55995995abxya bxy(a)(b)说明说明:1.不能通过改变不能通过改变形参指针变量的值形参指针变量的值而使而使实参指针变实参指针变量的值量的值改变改变.2.可以通过改变形参指针变量所指向的变量可以通过改变形参指针变量所指向的变量的值来改变实参指针变量所指向的变量的值的值来改变实参指针变量所指向的变量的值.3.如想通过函数调用得到如想通过函数调用得到 n 个要改变的值个要改变的值,可以可以:(1)在主调函数中设在主调函数中设 n 个变量个变量,并用并用 n 个指针变量指个指针变量指 向它们向它们;(2)将指针变量作实参将指针变量作实参,使使 n 个变量的地址传给所调个变量的地址传给所调 用的函数形参用的函数形参;(3)通过形参指针变量通过形参指针变量,改变该改变该 n 个变量的值个变量的值;(4)主调函数中就可以使用这些改变了值的变量。主调函数中就可以使用这些改变了值的变量。swap(int*p1,int*p2)int *p;p=p1;p1=p2;p2=p;main()int a,b,*pointer_1 ,*pointer_2;scanf(“%d,%d”,&a,&b);pointer_1=&a;pointer_2=&b;if(a b)swap(pointer_1,pointer_2);printf(“n%d,%d n”,a,b);本函数中试图通过改变形参本函数中试图通过改变形参指针变量的值来使实参指针指针变量的值来使实参指针变量的值改变变量的值改变.&a&b59abpointer_1pointer_2(a)&a&b59abp1p2(b)&b&a59abp1p2(c)&b&a59abpointer_1pointer_2(d)作者原意图是实作者原意图是实现这样的结果现这样的结果&a&b59abpointer_1pointer_2(d)C语言中实参变量和形语言中实参变量和形参变量之间的数据传递参变量之间的数据传递是单向的是单向的“值传递值传递”方式,方式,指针变量作为函数参数指针变量作为函数参数也要遵循这一规律也要遵循这一规律总结:总结:要实现变量值的双向传递,在被调函要实现变量值的双向传递,在被调函数中必须对数中必须对指针变量所指向的目标变量指针变量所指向的目标变量进进行操作。行操作。如果只是对如果只是对指针变量本身指针变量本身进行操作,进行操作,仍然是仍然是单向传递单向传递。这点是指针变量作为这点是指针变量作为函数参数的难点函数参数的难点和重点和重点。例例 10.4输入输入a,b,c 3个整数,按大小顺序输出个整数,按大小顺序输出swap(int*pt1,int*pt2)int p;p=*pt1;*pt1=*pt2;*pt2=p;exchange(int *q1,*q2,*q3;)if(*q1 *q2)swap(q1,q2);if(*q1 *q3)swap(q1,q3);if(*q2 *q3)swap(q2,q3);main()int a,b,c,*p1,*p2,*p3;scanf(“%d,%d,%d”,&a,&b,&c);p1=&a;p2=&b;p3=&c;exchange(p1,p2,p3);printf(“n%d,%d,%dn”,a,b,c);10.3 数组的指针和指向数组的指针变量数组的指针和指向数组的指针变量 C语言中,指针变量可以指向变量,也可以指向数组语言中,指针变量可以指向变量,也可以指向数组和数组元素和数组元素.数组的指针数组的指针:数组的起始地址数组的起始地址.数组元素的指针数组元素的指针:数组元素的地址数组元素的地址.一一.指向数组的指针变量的定义与赋值指向数组的指针变量的定义与赋值 指向数组的指针变量的定义同指向变量的指针变量指向数组的指针变量的定义同指向变量的指针变量的定义相同的定义相同.如如:int a10;int *p ;若若:p=&a0;则则 p 指向了指向了a 数组的第数组的第 0 号元素号元素.由于由于数组名代表数组的首地址数组名代表数组的首地址(即起始地址即起始地址).故故:p=&a0;等价于等价于 p=a;也可也可:int a10;int *p=&a0;int*p=a;注意注意 int *p=&a0;的含义是将数组首地址赋给指的含义是将数组首地址赋给指针变量变量 p,而不是赋给而不是赋给(*p).二二.通过指针引用数组元素通过指针引用数组元素 如如:int a10 ,*p ;p=a;则则:(1)p a0的地址的地址;p+1 a1的地址的地址;p+i ai的地址的地址.(2)*p=a0,*(p+1)=a1,*(p+i)=ai 说明说明:1.数组元素在内存中是连续存放的数组元素在内存中是连续存放的,C语言语言规定规定,指针变量指针变量 p+1 指向下一个元素指向下一个元素(不是简单的不是简单的加加 1).&a0 1 320 a0a1a9p2.(p+i)表示指向表示指向 ai 的地址的地址,而而 a+i 也表示也表示 ai 的地址的地址,故故 程序中程序中(p+i)等价于等价于a+i.如如:p+2;a+2;3.指向数组的指针变量可以带下标指向数组的指针变量可以带下标.如如:pi *(p+i)a数组数组 p p+1,a+1 p+i,a+i p+9,a+9 a0 a1 ai a9*(p+i)综上所述综上所述:数组元素的引用可以数组元素的引用可以:(假定假定:int a10 ,*p=a;)(1)下标法下标法:数组名数组名下标下标 或或 指针变量名指针变量名下标下标 ai pi(2)指针法指针法:*(p+i)或或 *(a+i)例例 10.5 用二种方法输出数组各元素用二种方法输出数组各元素.(1)下标法下标法 main()int a10,i;for(i=0;i 10;i+)scanf(“%d”,&ai);printf(“n”);for(i=0;i 10;i+)printf(“%d”,ai);(2)用数组名计算元素地址用数组名计算元素地址.main()int a10,i;for(i=0;i 10;i+)scanf(“%d”,&ai);printf(“n”);for(i=0;i 10;i+)printf(“%d”,*(a+i);注意几点注意几点:(1)指针变量可以作自增指针变量可以作自增,自减运算自减运算.如如:+p ,p .而数组名不能作自增而数组名不能作自增,自减运算自减运算.如如 a+,a 等等,均不合法均不合法.因为因为数组名是常量数组名是常量.(2)注意指针变量的当前值注意指针变量的当前值.如如:例例 10.6:main()int a10,i,*p;p=a;for(i=0;i 10;i+)scanf(“%d”,p+);printf(“n”);for(i=0;i 10;i+,p+)printf(“%d”,*p);(3)注意指针变量的运算注意指针变量的运算.如如:int a10,i,*p;p=a;则则:a.p+(或或 p+=1)表示表示 p 指向指向 a1,此时若执行此时若执行*p,则取出则取出 a1 元素的值元素的值.b.“*”与与“+”同优先级同优先级,自右往左结合自右往左结合.如如:*p+等效于等效于*(p+),即先取即先取 p 所指向所指向变量的值变量的值,再使再使 p+1.而而*(p+)与与*(+p)的作用不同的作用不同.前者先取前者先取*p 的值的值,后使后使p+1;后者后者是先使是先使 p+1,再取再取*p的值的值.d.(*p)+表示使目标变量的值加表示使目标变量的值加 1.而不是指针变量的而不是指针变量的值加值加 1。e.*(p+)等价于等价于 ai+.*(+p)等价于等价于 a+i 即先使即先使 p 自增自增,再作再作*运算运算.如如:main()int a100,*p;p=a;while(p a+100)printf(“%d”,*p+);main()int a100,*p;p=a;while(p a+100)printf(“%d”,*p);p+;三三.数组名作函数参数数组名作函数参数 数组名作函数参数时数组名作函数参数时,实际上是将实际上是将实参实参数组的首地址传给形参数组的首地址传给形参。这样实参数组与形这样实参数组与形参数组共占同一段内存参数组共占同一段内存。使得在。使得在 调用函数调用函数过程中,形参数组中元素值发生变化也就使过程中,形参数组中元素值发生变化也就使实参数组的元素值随之而发生变化。实参数组的元素值随之而发生变化。如:如:main()int array10;f(array,10);f(arr,n)int arr ,n;arrayarr1)实参传递给形参后实参传递给形参后arr和和array指向同一内存地址;指向同一内存地址;2)将将“10”传递给形参传递给形参n后,界后,界定了形参数组的范围;定了形参数组的范围;3)这种这种“数组名数组元素个数组名数组元素个数数”的参数形式是常用的。的参数形式是常用的。例例 10.7 将数组将数组 a 中中 n 个整数按相反顺序存放个整数按相反顺序存放.题意分析:题意分析:本题的关键是最后交换的两个元素的上下标值本题的关键是最后交换的两个元素的上下标值的确定。即将第一个元素和最后一个元素对换的确定。即将第一个元素和最后一个元素对换,将第将第二个同倒数第二个对换二个同倒数第二个对换.即两两对换即两两对换,直到直到:a int(n 1)/2 与与 an int(n 1)/2-1)对换对换为止。为止。3 7 9 11 0 6 7 5 4 2 2 4 5 7 6 0 11 9 7 3imjvoid inv(int x,int n)int t,i,j,m=(n 1)/2;for(i=0;i=m;i+)j=n1i;t=xi;xi=xj;xj=t;return;main()static int i,a10=3,7,9,11,0,6,7,5,4,2;printf(“The original array :n”);for(i=0;i10;i+)printf(“%d”,ai);printf(“n”);inv(a,10);printf(“The array has been inverted:n”);for(i=0;i 10;i+)printf(“%d”,ai);printf(“n”);例例10.8 从从 10 个数中找出其中最大值和最小值个数中找出其中最大值和最小值int max,min;void max_min_value(int array ,int n)int *p,*array_end;array_end=array+n;max=min=*array;for(p=array+1;pmax)max=*p;else if(*p min)min=*p ;main()int i,number10;printf(“enter 10 data n”);for(i=0;i10;i+)scanf(“%d”,&numberi);max_min_value(number,10);printf(“n max=%d,min=%d n”,max,min);此例也可改用指针变量来传送地址此例也可改用指针变量来传送地址,程序可改为程序可改为:int max ,min;void max_min_value(int*array,int n)int *p ,*array_end;array_end=array+n;max=min=*array;for(p=array+1;p max)max=*p;else if(*p min)min=*p ;return;main()int i,number10 ,*p;p=number;printf(“enter 10 data n”);for(i=0;i 10;i+,p+)scanf(“%d”,p);printf(“the 10 data:n”);for(p=number,i=0;i10;i+,p+)printf(“%d”,*p);p=number;max_min_value(p,10);printf(“n max=%d,min=%d n”,max,min);for(p=number;p(number+10);p+)等效于:等效于:综上所述综上所述,对于实参数组对于实参数组,想在被调函数中想在被调函数中改变此数组改变此数组元素的值元素的值,实参与形参的对应关系实参与形参的对应关系可以如下可以如下:(1)二者都用数组名二者都用数组名 main()int a10;f(a,10);f(int x,int n)特点特点:a 和和 x 数组共用同一数组共用同一段内存单元。段内存单元。(2)实参为数组名实参为数组名,形参用形参用指针变量指针变量.main()int a10;f(a,10);f(int*x,int n)特点特点:实参将数组的首地址传给实参将数组的首地址传给形参指针变量形参指针变量,通过指针变量指通过指针变量指向数组中的任一元素向数组中的任一元素,进而作相进而作相应的处理。应的处理。(3)二者都用指针变量。二者都用指针变量。main()int a10 ,*p;p=a;f(p,10);f(int*x,int n)特点特点:先使先使 p 指向指向 a 数组数组,再再将将 p 传给传给 x,使使 x 也指向也指向 a 数组数组,从而进行处理从而进行处理.(4)实参为指针变量实参为指针变量,而形参而形参为数组名。为数组名。main()int a10 ,*p;p=a;f(p,10);f(int x,int n)特点特点:利用指针变量将利用指针变量将 a 数组的数组的首地址传给首地址传给 x 数组数组.使两数组共用使两数组共用同一段内存单元同一段内存单元.利用利用xi值的变值的变化化,使使ai的值也发生变化的值也发生变化.注意注意:在上述四种处理方式中在上述四种处理方式中,当用当用指针变量作实指针变量作实参时,必须先使指针变量有确定的值,即指向一参时,必须先使指针变量有确定的值,即指向一个已定义的数组。个已定义的数组。四、四、指针与二维数组指针与二维数组1、指针与二维数组、指针与二维数组 一一个个数数组组的的名名字字代代表表该该数数组组的的首首地地址址,并并可可看看成成是是地地址址常常量量,这这一一规规定定对对二二维维数数组组或或更更高高维维数组同样适用。数组同样适用。若有定义:若有定义:float*p,d35;则:则:d24d23d22d21d20d14d13d12d11d10d04d03d02d01d00d2d1d0d2.二维数组元素和二维数组元素的地址二维数组元素和二维数组元素的地址假设数组名为假设数组名为a,起始地址设为起始地址设为200 int a34=1,3,5,7,9,11,13,15,17,19,21,23;则:则:a代表整个二维数组的首地址,即第代表整个二维数组的首地址,即第0行的首地址行的首地址 a+1是数组是数组a第第1行首地址行首地址(208)a0,a1,a2是二维数组中三个一维数组的名字(地址)是二维数组中三个一维数组的名字(地址),是第,是第0行,第行,第1行,第行,第2行的首地址,即:行的首地址,即:a0=a+0、a1=a+1、a2=a+2 ai+j是第是第i行行j列的地址列的地址*(ai+j)是该地址存储的值,是该地址存储的值,即即aij考虑考虑 *(a2+3)=?a0a1a2a数组数组a(200)a+1a+2(216)注意:注意:ai和和*(a+i)无条件等价无条件等价 a+i、ai、*(a+i)、&ai0均表示第均表示第i行首地址;行首地址;&aij、ai+j、*(a+i)+j都是第都是第i行行j列元素的列元素的地址地址;aij、*(ai+j)、*(*(a+i)+j)都是第都是第i行行j列元素的列元素的值值;二维数组名(如二维数组名(如a)是指向行的;一维数组名)是指向行的;一维数组名(如(如a1,a2)是指向列元素的。在指向行的指针前面)是指向列元素的。在指向行的指针前面加上一个,就转换成为指向列的指针。反之,在指向加上一个,就转换成为指向列的指针。反之,在指向列的指针前面加列的指针前面加&,就成为指向行的指针。,就成为指向行的指针。3、指向多维数组元素的指针、指向多维数组元素的指针 指向多维数组元素的指针形式有指向多维数组元素的指针形式有2种:种:(1)指向数组元素的指针变量。)指向数组元素的指针变量。这种方式跟指向变量的指针变量的使用方法一样。这种方式跟指向变量的指针变量的使用方法一样。这里,主要要掌握的是:这里,主要要掌握的是:aij在数组中相对位置的在数组中相对位置的计算公式计算公式im+j,从这个公式可以看到,从这个公式可以看到,C语语言规定数组的下标从言规定数组的下标从0开始,对计算上述相对位置比开始,对计算上述相对位置比较方便,只要知道了较方便,只要知道了i和和j的值,就可以用公式计算出的值,就可以用公式计算出aij相对于数组开头的相对位置。相对于数组开头的相对位置。(2)指向由)指向由m个元素组成的一维数组的指针变量。个元素组成的一维数组的指针变量。定义格式:定义格式:基类型基类型 (*指针变量名指针变量名)常量表达式常量表达式例如:例如:int (*p)4 (与(与int a4比较)比较)表示表示*p有有4个元素,每个元素为整数,也就是个元素,每个元素为整数,也就是p所指向的对象是有所指向的对象是有4个整型元素的数组。个整型元素的数组。假设:假设:p开始指向的地址为开始指向的地址为2000那么:那么:p+1=?4、用指向数组的指针作为函数参数、用指向数组的指针作为函数参数在用在用指针变量作形参指针变量作形参以接受以接受实参数组名实参数组名传递来的地传递来的地址时,有两种方法:址时,有两种方法:(1)用指向变量的指针变量作为用指向变量的指针变量作为形参。形参。(2)用指向一维数组的指针变量作为形参。用指向一维数组的指针变量作为形参。例例10.13 有一个班,有一个班,3个学生,各学个学生,各学4门课,计算总门课,计算总平均分数以及第平均分数以及第n个学生的成绩。程序如下:个学生的成绩。程序如下:#include void main()void average(float*p,int n);void search(float(*p)4,int n);float score34=65,67,70,60,80,87,90,81,90,99,100,98;average(*score,12);search(score,2);void average(float*p,int n)float*p_end;float sum=0,aver;p_end=p+n-1;for(;p=p_end;p+)sum=sum+(*p);aver=sum/n;printf(average=%5.2fn,aver);void search(float(*p)4,int n)int i;printf(the score of No.%d are:n,n);for(i=0;i4;i+)printf(%5.2f,*(*(p+n)+i);例例:将将a矩阵与矩阵与b矩阵相加矩阵相加,和存入和存入c矩阵。矩阵。int i,j;main()int*p,a34,b34,c34;printf(The value of a:n);for(i=0;i3;i+)for(j=0;j4;j+)scanf(%d,ai+j);printf(The value of b:n);for(i=0;i3;i+)for(j=0;j4;j+)scanf(%d,*(b+i)+j);matrix(*a,b0,&

    注意事项

    本文(第三版C语言PPT课件讲解第10章+指针.ppt)为本站会员(豆****)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

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

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开