C语言程序设计ppt课件-第9章

上传人:风*** 文档编号:240989442 上传时间:2024-05-22 格式:PPT 页数:105 大小:432.60KB
收藏 版权申诉 举报 下载
C语言程序设计ppt课件-第9章_第1页
第1页 / 共105页
C语言程序设计ppt课件-第9章_第2页
第2页 / 共105页
C语言程序设计ppt课件-第9章_第3页
第3页 / 共105页
资源描述:

《C语言程序设计ppt课件-第9章》由会员分享,可在线阅读,更多相关《C语言程序设计ppt课件-第9章(105页珍藏版)》请在装配图网上搜索。

1、C C语言程序设计语言程序设计The C Programming Language华中科技大学计算机学院曹计昌5/22/20241华中科技大学计算机学院C语言程序设计The C Programming Langu9.1 9.1 指针的概念与指针的使用指针的概念与指针的使用 9.1.1 9.1.1 指针的概念指针的概念 数据(变量、常量)(根据类型)占有一定数数据(变量、常量)(根据类型)占有一定数目的连续存储单元;目的连续存储单元;数据的连续存储单元首地址称为数据的地址。数据的连续存储单元首地址称为数据的地址。变量的地址称为指针,存放地址数据的变量称变量的地址称为指针,存放地址数据的变量称为指

2、针变量。为指针变量。指针也是一种变量,也要占用一定的内存单元。指针也是一种变量,也要占用一定的内存单元。指针的特殊之处在于它存放的是另一个变量所指针的特殊之处在于它存放的是另一个变量所占存储单元的起始地址。占存储单元的起始地址。5/22/20242华中科技大学计算机学院9.1 指针的概念与指针的使用 9.1.1 指针的概念指针变量的类型由其基类型决定指针变量的类型由其基类型决定.基类型是指针变量所指基类型是指针变量所指(即所指向即所指向)变量的数据变量的数据类型。类型。因此,称指向某种类型变量的指针为该类型的因此,称指向某种类型变量的指针为该类型的指针。指针。如:指向整型变量的指针称为整型指针

3、,指向如:指向整型变量的指针称为整型指针,指向字符型变量的指针称为字符指针等。字符型变量的指针称为字符指针等。不管是何种类型的指针不管是何种类型的指针,所占的存储与机器字所占的存储与机器字长相当长相当.如如:16:16位机位机,指针占指针占2 2字节字节,思考思考:为什么指针指针有类型为什么指针指针有类型?指针变量的类型指针变量的类型5/22/20243华中科技大学计算机学院指针变量的类型由其基类型决定.指针变量的类型8/4/2023ptrptr指向指向x x 如果整型如果整型变量量x x的地址是的地址是0 xFEC00 xFEC0,x x的的值是是0 xABCD0 xABCD,整型指整型指针

4、ptrptr的地址是的地址是0 xFEBC0 xFEBC,整型指,整型指针ptrptr指向整型指向整型变量量x x的内存存的内存存储和指向情况可以由下和指向情况可以由下图描述:描述:0 xFEBC0 xFEBC,ptrptr之址之址C0C00 xFEBD0 xFEBDFEFE0 xFEC00 xFEC0,x x的低字节的低字节CDCD0 xFEC10 xFEC1ABAB0 xFEC20 xFEC20 xFEC30 xFEC30 xFEC40 xFEC45/22/20244华中科技大学计算机学院ptr指向x 如果整型变量x的地址是0 xFEC0,x的值是9.1.2 9.1.2 指针的声明指针的声

5、明声明指针的一般形式:声明指针的一般形式:T *T *标识符标识符1 1,*标识符标识符2 2,,*,*标识符标识符n n;其中,其中,T T是数据类型。是数据类型。*是指针说明符,用于将是指针说明符,用于将其说明的标识符说明为指针类型。标识符其说明的标识符说明为指针类型。标识符1 1,标,标识符识符2 2,标识符,标识符n n是是T T类型的指针的名字类型的指针的名字.例例9.19.1:char*pc1,*pc2;char*pc1,*pc2;int*pi;int*pi;float*pf;float*pf;5/22/20245华中科技大学计算机学院9.1.2 指针的声明声明指针的一般形式:8/

6、4/2023 指针变量也可以在声明的时候对其进行初指针变量也可以在声明的时候对其进行初始化,但必须用所指变量的地址进行初始化。始化,但必须用所指变量的地址进行初始化。初始化后的指针将指向以初值为地址的变量。初始化后的指针将指向以初值为地址的变量。例例9.2 9.2 声明指针并初始化。声明指针并初始化。int x=10,*p=&x;int x=10,*p=&x;错误的声明错误的声明:int*p=&x,x=10;int*p=&x,x=10;5/22/20246华中科技大学计算机学院 指针变量也可以在声明的时候对其进行初始化,但必须例例9.3 9.3 给出以下一些复杂声明,给出以下一些复杂声明,解释

7、其含义。解释其含义。1.int(*p1)3;2.double*p25;3.char(*fp)(int,int);4.int*pf(float a);5.int(*fp_ary2)(char*,int*);5/22/20247华中科技大学计算机学院例9.3 给出以下一些复杂声明,解释其含义。int(*p9.1.3 9.1.3 指针的使用指针的使用 在声明指针变量的前提下,指针的使用首在声明指针变量的前提下,指针的使用首先要获取变量的地址作为指针值,然后要将该先要获取变量的地址作为指针值,然后要将该指针值赋给指针变量,建立指针变量与被指变指针值赋给指针变量,建立指针变量与被指变量间的指向关系。接下

8、来就是如何通过指针变量间的指向关系。接下来就是如何通过指针变量来间接访问和操作指针所指的变量。量来间接访问和操作指针所指的变量。5/22/20248华中科技大学计算机学院9.1.3 指针的使用 在声明指针变量的前提下,1.1.取地址运算符取地址运算符-单目单目&单目单目&在在C C中表示取地址运算。该表达式的一般使中表示取地址运算。该表达式的一般使用形式是:用形式是:&右操作数右操作数 根据表达式的操作语义可知,右操作数必须是根据表达式的操作语义可知,右操作数必须是一个左值表达式。如果右操作数的类型是一个左值表达式。如果右操作数的类型是T T,则表,则表达式达式&右操作数的类型是右操作数的类型

9、是T*T*。5/22/20249华中科技大学计算机学院 1.取地址运算符-单目&8/4/20239 2.2.指针的赋值指针的赋值 指针的声明只是创建了指针变量,获得了指指针的声明只是创建了指针变量,获得了指针变量的存储,但并没有给出指针变量指向那个针变量的存储,但并没有给出指针变量指向那个具体的变量,此时指针的值是不确定的随机值,具体的变量,此时指针的值是不确定的随机值,指针处于指针处于“无所指无所指”的状态。例如:用的状态。例如:用 int*p;int*p;语句来说明语句来说明p p是一个整型指针变量时,是一个整型指针变量时,p p的值是不的值是不确定的随机值。此时称确定的随机值。此时称p

10、p为悬挂指针。为悬挂指针。5/22/202410华中科技大学计算机学院 2.指针的赋值8/4/202310华中科技大学例例9.5 9.5 设有下面说明:设有下面说明:int i,*pi;int i,*pi;char c,*pc;char c,*pc;float x5,*pf;float x5,*pf;则:则:npi=&i;pi=&i;取整型变量取整型变量i i的地址赋给整型指针变量的地址赋给整型指针变量pi.pi.npc=&c;pc=&c;取出字符变量取出字符变量c c的地址赋给字符指针变量的地址赋给字符指针变量pc.pc.npf=&x0;pf=&x0;和和pf=x;pf=x;的作用相同,均表

11、示将的作用相同,均表示将x x数组的起数组的起始地址赋给指针变量始地址赋给指针变量pf,pf,使使pfpf指向指向x x数组的第一个元数组的第一个元素素x0 x0。n数组名数组名x x的数据类型是的数据类型是float*float*,并且标识,并且标识x x数组的起数组的起始地址始地址,因此语句因此语句pf=x;pf=x;合法有效。合法有效。5/22/202411华中科技大学计算机学院例9.5 设有下面说明:8/4/202311华中科技大学计 3.3.间访运算符单目间访运算符单目*n声明指针的目的是希望通过指针实现对内存中变量声明指针的目的是希望通过指针实现对内存中变量的快速访问,必须使用单目

12、的快速访问,必须使用单目*这个间访运算符才能这个间访运算符才能实现利用指针对内存变量的访问。间访的含义是间实现利用指针对内存变量的访问。间访的含义是间接访问。单目接访问。单目*运算实际上是单目运算实际上是单目&运算的逆运算运算的逆运算.n使用单目使用单目*间访变量的一般形式是:间访变量的一般形式是:*操作数操作数n“*“*操作数操作数”称为称为间访表达式间访表达式,它的操作语义是引,它的操作语义是引用以操作数之值为地址的变量。操作数也可以是表用以操作数之值为地址的变量。操作数也可以是表达式,但其值必须是地址值。达式,但其值必须是地址值。n间访表达式的值是一个左值,代表指针所指的变量。间访表达式

13、的值是一个左值,代表指针所指的变量。而指针所指的变量的类型就是间访表达式运算结果而指针所指的变量的类型就是间访表达式运算结果的类型。的类型。5/22/202412华中科技大学计算机学院 3.间访运算符单目*8/4/202312华中科技例例9.6 9.6 间访运算符的基本操作举例。间访运算符的基本操作举例。设有声明和赋值:设有声明和赋值:char ch=a,*pc=&chchar ch=a,*pc=&ch;*pc=b *pc=b;并且假设字符变量并且假设字符变量chch的地址是的地址是0 x1b2a0 x1b2a,试问,试问chch,pcpc,以及,以及*pc*pc的值是什么?的值是什么?5/2

14、2/202413华中科技大学计算机学院例9.6 间访运算符的基本操作举例。8/4/202313华4.4.无值型指针无值型指针 类型为类型为void*void*的指针称为无值型指针或的指针称为无值型指针或voidvoid指针。指针。C C语言规定,任何类型的指针都可以语言规定,任何类型的指针都可以将其值赋给将其值赋给voidvoid指针,但是不能对指针,但是不能对voidvoid指针执指针执行间访操作,即对行间访操作,即对voidvoid指针施行指针施行“*”“*”操作属于操作属于非法操作。非法操作。int x=1,*px=&x;int x=1,*px=&x;char ch=a,*pc=&ch,

15、*pc1;char ch=a,*pc=&ch,*pc1;void*vp;void*vp;则:则:vp=px;vp=px;vp=pc;vp=pc;pc1=(char*)vp;pc1=(char*)vp;*vp=b;/*vp=b;/*非法非法*/*/5/22/202414华中科技大学计算机学院4.无值型指针8/4/202314华中科技大学计算机学院9.2 9.2 指针运算指针运算 指针允许进行算术运算、赋值运算和关系运算。指针允许进行算术运算、赋值运算和关系运算。通过指针运算可以快速定位到指定的内存单元,提通过指针运算可以快速定位到指定的内存单元,提高程序的执行效率。高程序的执行效率。9.2.1

16、9.2.1 指针的算术运算指针的算术运算1.1.指针的移动指针的移动指针的移动指指针在原有位置的基础上,通过加一个指针的移动指指针在原有位置的基础上,通过加一个整数实现指针的前移(地址增大的方向)或者通过整数实现指针的前移(地址增大的方向)或者通过减一个整数实现指针的后移。当然,如果加减的是减一个整数实现指针的后移。当然,如果加减的是一个负数,则移动的方向刚好和前面相反。一个负数,则移动的方向刚好和前面相反。5/22/202415华中科技大学计算机学院9.2 指针运算 指针允许进行算术运算、赋值运算和例例9.9 9.9 指针的算术运算应用举例指针的算术运算应用举例(演示演示EX9_9)EX9_

17、9)。#include stdio.h#include stdio.hvoid main(void)void main(void)int iary5=0,1,2,3,4;int iary5=0,1,2,3,4;int*px=&iary0;int*px=&iary0;printf(display the address and printf(display the address and the value of the elements:n);the value of the elements:n);for(;for(;px&iary0+5px&iary0+5;px+);px+)printf(

18、px=%p *px=%dn,px,*px);printf(px=%p *px=%dn,px,*px);px=&iary0;px=&iary0;printf(after executing px=&iary0:n);printf(after executing px=&iary0:n);printf(px=%p *px=%dn,px,*px);printf(px=%p *px=%dn,px,*px);5/22/202416华中科技大学计算机学院例9.9 指针的算术运算应用举例(演示EX9_9)。8/4 px+=3;px+=3;printf(after px plus 3:n);printf(af

19、ter px plus 3:n);printf(px=%p *px=%dn,px,*px);printf(px=%p *px=%dn,px,*px);px-=2;px-=2;printf(after px minus 2:n);printf(after px minus 2:n);printf(px=%p *px=%dn,px,*px);printf(px=%p *px=%dn,px,*px);printf(*(+px)=%dn,*(+px);printf(*(+px)=%dn,*(+px);printf(px=%p *px=%dn,px,*px);printf(px=%p *px=%dn,p

20、x,*px);printf(*(px+)=%dn,*(px+);printf(*(px+)=%dn,*(px+);printf(px=%p *px=%dn,px,*px);printf(px=%p *px=%dn,px,*px);printf(*(-px)=%dn,*(-px);printf(*(-px)=%dn,*(-px);printf(px=%p *px=%dn,px,*px);printf(px=%p *px=%dn,px,*px);printf(*(px-)=%dn,*(px-);printf(*(px-)=%dn,*(px-);printf(px=%p *px=%dn,px,*px

21、);printf(px=%p *px=%dn,px,*px);5/22/202417华中科技大学计算机学院 px+=3;8/4/202317华中科技大学计算机学院 9.2.2 9.2.2 指针的赋值运算和关系运算指针的赋值运算和关系运算1.1.指针的赋值运算指针的赋值运算 指针的初始化和基本赋值操作前面指针的初始化和基本赋值操作前面已有叙述。下面主要进行一些归纳并给出已有叙述。下面主要进行一些归纳并给出应用的例子,其中利用指针的赋值运算以应用的例子,其中利用指针的赋值运算以及类型强制来突破语言的一些制约因素的及类型强制来突破语言的一些制约因素的编程算法和思想可以在底层软件开发时借编程算法和思想

22、可以在底层软件开发时借鉴,达到汇编级别开发的自由度。鉴,达到汇编级别开发的自由度。5/22/202418华中科技大学计算机学院 9.2.2 指针的赋值运算和关系运算8/4/2023指针的赋值运算规则:指针的赋值运算规则:(1)(1)同类型的指针才可以直接使用赋值操作符进行同类型的指针才可以直接使用赋值操作符进行赋值操作赋值操作。如:。如:int a3=1,2,3,*p=a,*q=p;int a3=1,2,3,*p=a,*q=p;(2)(2)如果要实现如果要实现不同基本类型指针之间的赋值运算,不同基本类型指针之间的赋值运算,必须使用类型强制必须使用类型强制。利用指针的赋值运算以及类。利用指针的赋

23、值运算以及类型强制可以实现一些型强制可以实现一些特殊操作特殊操作。5/22/202419华中科技大学计算机学院指针的赋值运算规则:8/4/202319华中科技大学计算机学n例例9.11 一个长整型数占一个长整型数占4个字节,其个字节,其中每个字节又分成高中每个字节又分成高4位和低位和低4位。试位。试从长整型数的低字节开始,依次取出每从长整型数的低字节开始,依次取出每个字节的高个字节的高4位和低位和低4位并以位并以ASCII码码的形式进行显示。的形式进行显示。5/22/202420华中科技大学计算机学院例9.11 一个长整型数占4个字节,其中每个字节又分成高4例例9.119.11(演示演示EX9

24、_11)EX9_11)#include stdio.h“void main(void)long x=0 x1234ABCD,k;char*p=(char*)&x;/*类型强制,类型强制,x被视为被视为4字节字符数组被字节字符数组被p所指所指*/char up_half,low_half;/*up_half存高存高4位,位,low_half存低存低4位位*/for(k=0;k4;k+)low_half=(*p)&0 x0f;/*取低取低4位位*/if(low_half4)&0 x0f;/*取高取高4位位*/if(up_half10)up_half|=0;/*高高4位二进制转换成位二进制转换成AS

25、CII码码0-9*/else up_half=(up_half-10)+A;/*高高4位二进制转换成位二进制转换成ASCII码码A-F*/p+;/*指向整型数指向整型数x下一个字节下一个字节*/printf(%c%cn,up_half,low_half);5/22/202421华中科技大学计算机学院例9.11(演示EX9_11)#include stdio2 2 指针的关系运算指针的关系运算n指针的关系运算指对指针施行诸如:指针的关系运算指对指针施行诸如:,=,以及,以及!=!=这样一些比较操作。这样一些比较操作。n指针属于一种派生类型,它属于何种类型的指针要指针属于一种派生类型,它属于何种类

26、型的指针要受所指变量的类型,即指针的基类型的限制。受所指变量的类型,即指针的基类型的限制。n不同类型的变量在内存中分配的存储不同;对于不不同类型的变量在内存中分配的存储不同;对于不同的数据类型,定义于其上的操作和运算也不尽相同的数据类型,定义于其上的操作和运算也不尽相同。因此,尽管所有指针的值都是二进制正整数,同。因此,尽管所有指针的值都是二进制正整数,从关系运算的操作语义上看,允许不同类型的指针从关系运算的操作语义上看,允许不同类型的指针进行比较没有实际意义,并且只会给语言和程序带进行比较没有实际意义,并且只会给语言和程序带来副作用。来副作用。n因此,因此,C C语言规定指针的关系运算只能限

27、于同类型指语言规定指针的关系运算只能限于同类型指针,不同类型指针之间的关系运算被视为非法操作。针,不同类型指针之间的关系运算被视为非法操作。5/22/202422华中科技大学计算机学院2 指针的关系运算8/4/202322华中科技大学计算机学院9.3 9.3 指针作为函数的参数指针作为函数的参数 9.3.1 9.3.1 形参指针对实参变量的影响形参指针对实参变量的影响 例例9.12 9.12 被调用函数中对形参的修改无法影响调用函被调用函数中对形参的修改无法影响调用函数中实参变量的值举例数中实参变量的值举例(演示演示EX9_12)EX9_12)。#include stdio.h#include

28、 stdio.hvoid swap(void swap(int u,int vint u,int v)int t;int t;printf(in function swap,before swap,u=%d printf(in function swap,before swap,u=%d and v=%dn,u,v);and v=%dn,u,v);t=u;u=v;v=t;t=u;u=v;v=t;printf(in function swap,after swap,u=%d and printf(in function swap,after swap,u=%d and v=%dn,u,v);v=

29、%dn,u,v);5/22/202423华中科技大学计算机学院9.3 指针作为函数的参数 9.3.1 形参指针对实参变量(演示演示EX9_12)EX9_12)void main(void)void main(void)int x,y;int x,y;printf(input two integers for x and y printf(input two integers for x and y please!n);please!n);scanf(%d%d,&x,&y);scanf(%d%d,&x,&y);printf(in function main,before swap,x=%d pr

30、intf(in function main,before swap,x=%d and y=%dn,x,y);and y=%dn,x,y);swap(x,y);swap(x,y);printf(in function main,after swap,x=%d printf(in function main,after swap,x=%d and y=%dn,x,y);and y=%dn,x,y);5/22/202424华中科技大学计算机学院(演示EX9_12)8/4/202324华中科技大学计算机学程序运行中的输入以及运行结果为:程序运行中的输入以及运行结果为:input two integer

31、s for x and y please!input two integers for x and y please!10 2010 20(键盘输入)(键盘输入)in function main,before swap,x=10 and y=20in function main,before swap,x=10 and y=20in function swap,before swap,u=10 and v=20in function swap,before swap,u=10 and v=20in function swap,after swap,u=20 and v=10in functio

32、n swap,after swap,u=20 and v=10in function main,after swap,x=10 and y=20 in function main,after swap,x=10 and y=20 5/22/202425华中科技大学计算机学院程序运行中的输入以及运行结果为:8/4/202325华中科技(演示演示EX9_13)EX9_13)例例9.13 9.13 以指针作为函数的参数实现变量值以指针作为函数的参数实现变量值的交换。的交换。#include stdio.h#include stdio.hvoid swap(void swap(int*p1,int*p

33、2int*p1,int*p2)int t;int t;t=*p1;*p1=*p2;*p2=t;t=*p1;*p1=*p2;*p2=t;5/22/202426华中科技大学计算机学院(演示EX9_13)8/4/202326华中科技大学计算机学void main(void)void main(void)int x,y;int x,y;printf(input two integers for x and y printf(input two integers for x and y please!n);please!n);scanf(%d%d,&x,&y);scanf(%d%d,&x,&y);pri

34、ntf(before swap,x=%d and printf(before swap,x=%d and y=%dn,x,y);y=%dn,x,y);swap(&x,&y);swap(&x,&y);printf(after swap,x=%d and printf(after swap,x=%d and y=%dn,x,y);y=%dn,x,y);5/22/202427华中科技大学计算机学院void main(void)8/4/202327华中科技大程序运行中的输入以及运行结果为:程序运行中的输入以及运行结果为:input two integers for x and y please!inp

35、ut two integers for x and y please!12 4512 45before swap,x=12 and y=45before swap,x=12 and y=45after swap,x=45 and y=12 after swap,x=45 and y=12 5/22/202428华中科技大学计算机学院程序运行中的输入以及运行结果为:8/4/202328华中科技 对于数组,由于数组名标识的数组的起始地址,对于数组,由于数组名标识的数组的起始地址,故可直接作为指针类型的实参;除此之外,都必故可直接作为指针类型的实参;除此之外,都必须以须以&变量名的形式给出变量的地址

36、作为实参,变量名的形式给出变量的地址作为实参,以保证在被调用函数中能够操作调用函数中的对以保证在被调用函数中能够操作调用函数中的对应变量。应变量。例例9.14 将键盘输入的所有数字串逐个的转换为整将键盘输入的所有数字串逐个的转换为整数,并且依次存放于一个数组中。数字串前面可数,并且依次存放于一个数组中。数字串前面可以加以加+、-号,各数字串之间至少用一个空格分开,号,各数字串之间至少用一个空格分开,用回车结束输入。用回车结束输入。演示并解释演示并解释p267 p267 例例9-149-14 9.3.2 指针作为函数形参的应用指针作为函数形参的应用5/22/202429华中科技大学计算机学院 对

37、于数组,由于数组名标识的数组的起始地址,故可直接作为指#include ctype.h#define NUMBER 100int getint(int*pn);int getint(int*pn)int c,sign;while(isspace(c=getchar();/*跳过前导空格跳过前导空格*/if(!isdigit(c)&c!=EOF&c!=+&c!=-)/*若输入为非数字、非若输入为非数字、非EOF、也不是、也不是+、-号,显示出错号,显示出错*/printf(input error!n);return 0;sign=(c=-)?-1:1;/*处理符号处理符号*/if(c=+|c=-

38、)c=getchar();/*跳过跳过+、-号号*/for(*pn=0;isdigit(c);c=getchar()*pn=10*pn+(c-0);/*将数字串转换为对应整数将数字串转换为对应整数*/*pn*=sign;/*处理整数的符号处理整数的符号*/return c;void main(void)int aNUMBER,i,j,k;printf(input integers ends with Entern);for(i=0;i NUMBER&(k=getint(&ai)!=n;)if(k)i+;for(j=0;jb?a:b (求两个数中较大数求两个数中较大数)ne2=ce1?c:e1(

39、求三个数中最大数求三个数中最大数)=c(ab?a:b)?c:(ab?a:b)n对于对于de2?d:e2,将将e2代入可求四个数中最大数代入可求四个数中最大数n学习要注意方法学习要注意方法,学习要注意抽象学习要注意抽象,学习要注意应用学习要注意应用.5/22/202434华中科技大学计算机学院迭代处处都存在上例求bij,Cijk例例9.15 任意位数的超长数据的加法运算。任意位数的超长数据的加法运算。#include stdio.h“(演示演示EX9_15)#include ctype.h#define N 20 /*N表示参与运算数据最长的长度*/void shift(int*a,int n)

40、;void shift(int*a,int n)int k,len,sft;len=N-1-n;/*数据的长度*/sft=N-len;/*右对齐移位的位数*/for(k=0;klen;k+)/*右对齐移位*/*(a+k)=*(a+k+sft);for(k=len;kN;k+)/*右对齐移位的位数*/*(a+k)=0;/*对没有存放数据的位填充零*/5/22/202435华中科技大学计算机学院例9.15 任意位数的超长数据的加法运算。#include求求:12345678901234567+98765432109876543void main(void)int xN,yN,zN+1,i,carr

41、y=0,flag;for(i=0;i=0&isdigit(*(x+i)=getchar()/*处理被加数处理被加数*/*(x+i-)-=0;/*数字字符转换为对应的十进制数数字字符转换为对应的十进制数*/if(i=0)shift(x,i);/*数据长度小于数据长度小于N,右对齐移位,右对齐移位*/i=N-1;while(i=0&isdigit(*(y+i)=getchar()/*处理加数处理加数*/*(y+i-)-=0;/*数字字符转换为对应的十进制数数字字符转换为对应的十进制数*/if(i=0)shift(y,i);/*数据长度小于数据长度小于N,右对齐移位,右对齐移位*/5/22/2024

42、36华中科技大学计算机学院求:12345678901234567+987654321for(i=0;i=0;i-)/*输出结果。和中的前导字符输出结果。和中的前导字符0不输出不输出*/if(flag=0&*(z+i)!=0)flag=1;if(flag=1)putchar(*(z+i);putchar(n);5/22/202437华中科技大学计算机学院for(i=0;iN;i+)8/4/202337华中科2 2以指针变量为数组首地址时一以指针变量为数组首地址时一维数组的指针表示维数组的指针表示n一般的,为了用指针变量表示数组中的元素,应该先声明一一般的,为了用指针变量表示数组中的元素,应该先声

43、明一个数组,再声明一个与数组名类型相同的指针变量,然后通个数组,再声明一个与数组名类型相同的指针变量,然后通过初始化或者赋值操作使指针变量值向数组中的元素。这样过初始化或者赋值操作使指针变量值向数组中的元素。这样就可以指针变量来快速访问数组中的其他元素。就可以指针变量来快速访问数组中的其他元素。n例如例如,先声明指针变量先声明指针变量,然后通过赋值语句将数组的起始地址然后通过赋值语句将数组的起始地址赋给指针变量,使指针变量指向数组中下标为赋给指针变量,使指针变量指向数组中下标为0的元素。的元素。int a6,*p;p=a;或者或者p=&a0;n也可以在声明指针变量的同时用数组名或者数组中打头元

44、素也可以在声明指针变量的同时用数组名或者数组中打头元素的地址对其初始化。的地址对其初始化。int a6,*p=a;或者,或者,int a6,*p=&a0;n一般地,此时称指针变量一般地,此时称指针变量p指向数组指向数组a。5/22/202438华中科技大学计算机学院2以指针变量为数组首地址时一维数组的指针表示一般的,为了用例例9.16 9.16 显示输出指向数组显示输出指向数组a a的指针变量的指针变量p p的地址、值,数组名的地址、值,数组名a a的值,的值,a0a0的地址。数组的地址。数组a a中每个元素的地址和值,以及中每个元素的地址和值,以及p p依次指依次指向数组中各个元素时的取值和

45、所指元素的值。向数组中各个元素时的取值和所指元素的值。#include stdio.hvoid main(void)int i,a5=1,2,3,4,5,*p=a;printf(address of p is%pn,&p);printf(value of p is%pn,p);printf(value of a is%pn,a);printf(address of a0 is%pn,&a0);for(i=0;i5;i+)printf(&a%d=%pta%d=%dn,i,&ai,i,ai);for(i=0;i5;i+)printf(i=%dtp=%pt*p=%dn,i,p,*p);p+;运行结果

46、见运行结果见P2725/22/202439华中科技大学计算机学院例9.16 显示输出指向数组a的指针变量p的地址、值,数组3.3.指向数组元素的指针变量的运指向数组元素的指针变量的运算操作算操作n指向数组的指针变量的运算操作可以分为三类。指向数组的指针变量的运算操作可以分为三类。n一是对指针变量或由指针变量组成的地址表达式进行一是对指针变量或由指针变量组成的地址表达式进行运算,目的是快速定位到数组中的指定元素。运算,目的是快速定位到数组中的指定元素。n二是间访操作,即访问指针变量或由指针变量组成的二是间访操作,即访问指针变量或由指针变量组成的地址表达式所指向的数组元素。地址表达式所指向的数组元

47、素。n三是对间访后的数组元素施行运算。三是对间访后的数组元素施行运算。n这些运算中往往涉及这些运算中往往涉及+和和*操作,操作,+和和*操作在操作在C中中位于第二优先级,结合性是右结合,当两者同时出现位于第二优先级,结合性是右结合,当两者同时出现的时候需要严格通过结合性来进行分析判断。的时候需要严格通过结合性来进行分析判断。5/22/202440华中科技大学计算机学院3.指向数组元素的指针变量的运算操作指向数组的指针变量的运设有说明:设有说明:char s20,*pc;char s20,*pc;对于字符指针对于字符指针pc,pc,下面的操作合法:下面的操作合法:pc=s 对字符指针变量对字符指

48、针变量pc赋值,使其指向字符数组赋值,使其指向字符数组s(即即s0).pc+i 结果为结果为pc后面第后面第i个元素的地址。个元素的地址。*(pc+i)结果为结果为pc后面第后面第i个元素。个元素。*+pc 结果为结果为pc加加1之后所指元素。之后所指元素。+*pc 结果为结果为pc所指元素加所指元素加1。*pc+结果为结果为pc所指元素,然后所指元素,然后pc加加1。(*pc)+结果为结果为pc所指元素,然后所指元素,然后pc所指元素加所指元素加1。&pc 结果为字符指针变量结果为字符指针变量pc的地址,类型为的地址,类型为char*5/22/202441华中科技大学计算机学院设有说明:ch

49、ar s20,*pc;对于字符指针pc,n对于数组名对于数组名s,下面的操作合法:下面的操作合法:s+i 结果为数组结果为数组s中第中第i个元素的地址(即个元素的地址(即si的地址)。的地址)。*(s+i)结果为数组结果为数组s中第中第i个元素个元素si。+*s 结果为元素结果为元素s0加加1。(*s)+结果为元素结果为元素s0的值,然后的值,然后s0加加1。n由于数组名由于数组名s是地址常量,因此下面的操作非法:是地址常量,因此下面的操作非法:s=pc 非法非法.数组名数组名s是地址常量,不能进行赋值是地址常量,不能进行赋值操作。操作。&s 非法非法.数组名数组名s是地址常量,不能取地址。是

50、地址常量,不能取地址。*+s 非法非法.不能对数组名不能对数组名s进行前缀进行前缀+操作。操作。*s+非法非法.不能对数组名不能对数组名s进行后缀进行后缀+操作操作 5/22/202442华中科技大学计算机学院对于数组名s,下面的操作合法:8/4/202342华中科技大9.4.2 9.4.2 一维数组参数的指针表示一维数组参数的指针表示n 一维数组参数的指针表示是讨论在定义函一维数组参数的指针表示是讨论在定义函数时如何用指针表示函数的形参,以及在调数时如何用指针表示函数的形参,以及在调用函数时如何用指针表示函数的实参。用函数时如何用指针表示函数的实参。n对于形如对于形如int f(int a)

51、int f(int a)的函数,调用的函数,调用时应该用一个整型数组时应该用一个整型数组x x的数组名的数组名x x,或者数,或者数组打头元素的地址组打头元素的地址&x0&x0作为实参。数组名作为实参。数组名x x和打头元素的地址和打头元素的地址&x0&x0的类型都是的类型都是int*int*。n所以,一维数组作为函数的参数时,形参和所以,一维数组作为函数的参数时,形参和实参的类型都应该是数组元素类型的指针。实参的类型都应该是数组元素类型的指针。n因此,可以用数组元素类型的指针变量来表因此,可以用数组元素类型的指针变量来表示形参和实参。示形参和实参。5/22/202443华中科技大学计算机学院

52、9.4.2 一维数组参数的指针表示8/4/202343华中例例9.17 9.17 用指针变量表示一维数组参数,计算两个向量的数用指针变量表示一维数组参数,计算两个向量的数量积(向量的数乘)。量积(向量的数乘)。见见P274P274#include stdio.h#define SIZE 3double scalar(double*a,double*b,int n);void main(void)double xSIZE,ySIZE,*px,*py;for(px=x;pxx+SIZE;px+)/*x+SIZE是元素是元素xSIZE的地址的地址*/scanf(%lf,px);getchar();f

53、or(py=y;py&ySIZE;)/*&ySIZE是是y+SIZE*/scanf(%lf,py+);px=x;py=y;printf(the scalar of vector x and vector y is%lfn,scalar(px,py,SIZE);double scalar(double*a,double*b,int n)double s,*p;printf(the vector a isn);for(p=a;pa+n;)printf(%lft,*p+);printf(nthe vector b isn);for(p=b;pb+n;)printf(%lft,*p+);/*b+n是元

54、素是元素bn的地址的地址*/printf(n);for(s=0,p=a;pa+n;)/*a+n是元素是元素an的地址的地址*/s+=(*p+)*(*b+);return s;5/22/202444华中科技大学计算机学院例9.17 用指针变量表示一维数组参数,计算两个向量的数量9.4.3 9.4.3 用指向数组基本元素的指针表示多维数组用指向数组基本元素的指针表示多维数组n用指向数组基本元素的指针变量访问数组元素指:用指向数组基本元素的指针变量访问数组元素指:如果数组基本元素的数据类型为如果数组基本元素的数据类型为T T,则指向数组基,则指向数组基本元素的指针的数据类型为本元素的指针的数据类型为

55、T*T*。一旦该指针指向。一旦该指针指向了一个对应数组的元素,就可以了一个对应数组的元素,就可以(象用数组名一样象用数组名一样来来?)?)用该指针来表示数组元素。同时对该指针还可用该指针来表示数组元素。同时对该指针还可以施行运算,使它指向数组中的其它元素。以施行运算,使它指向数组中的其它元素。n对于二维整型数组对于二维整型数组uMNuMN,设有声明:,设有声明:int int*p=&u00;*p=&u00;则其则其uijuij元的地址可以写成元的地址可以写成 (p+i*N+j)(p+i*N+j)。而用指针。而用指针p p间访其间访其uijuij元的形式为:元的形式为:*(p+i*N+j)*(p

56、+i*N+j)。n对于三维整型数组对于三维整型数组vLMNvLMN,设有声明:,设有声明:int int*p=&v000;*p=&v000;则其则其vijkvijk元的地址可以写元的地址可以写成成(p+i*M*N+j*N+k)(p+i*M*N+j*N+k)。而用指针。而用指针p p间访其间访其vijkvijk元的形式为:元的形式为:*(p+i*M*N+j*N+k)*(p+i*M*N+j*N+k)。5/22/202445华中科技大学计算机学院9.4.3 用指向数组基本元素的指针表示多维数组8/4/2例例9.18 9.18 用指向数组基本元素的指针变量实现三维数组元素的输入和输出。用指向数组基本元

57、素的指针变量实现三维数组元素的输入和输出。#include“stdio.h”见见P274#define I 2#define J 3#define K 4void main(void)int vIJK,*p,n=1;int i,j,k;p=&v000;/*使使p指向三维数组指向三维数组v的打头的基本元素的打头的基本元素*/for(i=0;iI;i+)for(j=0;jJ;j+)/*访问数组访问数组v的的vijk元素元素*/for(k=0;kK;k+)*(p+i*J*K+j*K+k)=n+;for(i=0;iI;i+)for(j=0;jJ;j+)/*vij也是指向基本元素的指针也是指向基本元素的

58、指针*/for(k=0;kK;k+)printf(%4d,*(vij+k);printf(n);printf(n);5/22/202446华中科技大学计算机学院例9.18 用指向数组基本元素的指针变量实现三维数组元素的9.5 9.5 指针数组指针数组 9.5.1 9.5.1 指针数组的声明及使用指针数组的声明及使用1.1.指针数组的声明指针数组的声明n声明指针数组的一般形式是:声明指针数组的一般形式是:cv T*cv cv T*cv 标识符标识符 常量表达式常量表达式=初值表初值表;n其中,其中,T T是数据类型,表示数组元素为是数据类型,表示数组元素为T T类型的指针,类型的指针,可以指向可

59、以指向T T类型的变量。类型的变量。cvcv是是constconst、volatilevolatile或者或者const volatileconst volatile,它是可选项。标识符是指针数组,它是可选项。标识符是指针数组名。常量表达式是指针数组的大小。名。常量表达式是指针数组的大小。“=“=初值表初值表”是可选项,用于初始化指针数组。是可选项,用于初始化指针数组。5/22/202447华中科技大学计算机学院9.5 指针数组 9.5.1 指针数组的声明及使用8/4nchar*pstr2=123,456;该声明语句说明该声明语句说明pstr是一个有是一个有2个元素的字符指针数组。其个元素的字

60、符指针数组。其中,中,p0指向字符串指向字符串123,p1指向字符串指向字符串456,p0和和p1的类型都是的类型都是char*。例如声明语句:。例如声明语句:nconst int x=1,y=2;const int*ps2;ps0=&x;ps1=&y;其中,第其中,第1个声明语句说明变量个声明语句说明变量x,y已经初始化,其值不已经初始化,其值不可更改;也称可更改;也称x,y为常量。第为常量。第2个声明语句说明个声明语句说明ps是由是由2个个指向整型常量的指针组成的指针数组;简称为指向常量的指向整型常量的指针组成的指针数组;简称为指向常量的整型指针数组。并且通过赋值使整型指针数组。并且通过赋

61、值使ps0指向指向x,ps1指向指向y。显然,指针数组显然,指针数组ps的元素所指的对象不能修改;但的元素所指的对象不能修改;但ps的元的元素本身可以修改,使之指向其他对象。素本身可以修改,使之指向其他对象。nchar*const sp2=abcd,1234;该声明语句说明该声明语句说明sp的元素为常量,即常量指针,不能修改,的元素为常量,即常量指针,不能修改,但但sp的元素所指变量可以修改。的元素所指变量可以修改。nconst char*const p2=left,right;它说明它说明p是一个指向常量字符串的字符型常量指针数组。此是一个指向常量字符串的字符型常量指针数组。此时,时,p的元

62、素本身不能修改,的元素本身不能修改,p的元素所指对象也不能修改。的元素所指对象也不能修改。5/22/202448华中科技大学计算机学院char*pstr2=123,456;8/例例9.19 9.19 理解指针数组含义的编程举例。理解指针数组含义的编程举例。见见P277P277#include stdio.hvoid main(void)int x=1,y=2,z=3,i;int*p3;p0=&x;p1=&y;p2=&z;printf(&x=%ptx=%dn,&x,x);printf(&y=%pty=%dn,&y,y);printf(&z=%ptz=%dn,&z,z);for(i=0;icopy

63、 abc.txt def.txtc:copy abc.txt def.txt就就是一个命令行是一个命令行 n声明具有命令行参数的声明具有命令行参数的mainmain函数的一般形式是:函数的一般形式是:类型类型 main(int argc,char*argv)main(int argc,char*argv)/函数体函数体 5/22/202453华中科技大学计算机学院*9.6 带参数的main函数 9.6.1 命令行参数例例9.26 9.26 回显命令行参数并显示命令行参数个数的程序实例。回显命令行参数并显示命令行参数个数的程序实例。#include stdio.h#include stdio.h

64、void main(int argc,char*argv)void main(int argc,char*argv)int n=0;int n=0;while(nargc)while(nargc)printf(“%s”,argvn);printf(“%s”,argvn);(nargc-1)?printf():printf(“n”);(n show I like C programming.C:show I like C programming.argcargc5 5显示:显示:show I like C+programming.show I like C+programming.the num

65、ber of command-line arguments are 5 the number of command-line arguments are 5 5/22/202455华中科技大学计算机学院argv0argv1argv2argv3ar9.7 9.7 函数的指针函数的指针9.7.1 9.7.1 函数指针的声明函数指针的声明n声明函数指针的一般形式是:声明函数指针的一般形式是:类型类型(*(*函数指针名函数指针名)()(形参表形参表);其中,其中,(*(*函数指针名函数指针名)表示括号内的标识符是一个表示括号内的标识符是一个函数指针。类型则表示函数指针所指函数的返回函数指针。类型则表示

66、函数指针所指函数的返回类型,形参表表示函数指针所指函数的形式参数类型,形参表表示函数指针所指函数的形式参数的类型与个数。的类型与个数。n函数指针要通过初始化或赋值使其指向特定的函函数指针要通过初始化或赋值使其指向特定的函数,然后才能通过函数指针来调用它所指的函数。数,然后才能通过函数指针来调用它所指的函数。对函数指针赋值的一般形式是:对函数指针赋值的一般形式是:函数指针名函数指针名=函数名;函数名;5/22/202456华中科技大学计算机学院9.7 函数的指针9.7.1 函数指针的声明8/4/20例例9.29 9.29 函数指针的应用举例。函数指针的应用举例。#include stdio.h#include stdio.hvoid f1(int x)void f1(int x)printf(function f1 is called!n);printf(function f1 is called!n);printf(x=%dn,x);printf(x=%dn,x);void f2(int x,int y)void f2(int x,int y)printf(function f2 is

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

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

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


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