欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    C语言程序设计教程第8章.ppt

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

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

    C语言程序设计教程第8章.ppt

    8.1 指针与指针变量8.2 指针与函数8.3 指针与数组8.4 指针与字符串8.5 指针数组与命令行参数8.6 程序举例,第 8 章 指针,C语言程序设计教程,计算机教学中心李勇 C语言程序设计教程,2,8.1 指针与指针变量,8.1.1 指针的概念1.内存与变量地址 内存地址:内存是计算机用于存储数据的存储器,以一个字节作为存储单元,为了便于访问,给每个字节单元一个唯一的编号,第一字节单元编号为0,以后各单元按顺序连续编号,这些单元编号称为内存单元的地址。变量地址:变量所分配存储空间的首字节单元地址(字节单元编号)。,计算机教学中心李勇 C语言程序设计教程,3,2.变量的三要素:名字、类型与值 每个变量都通过变量名与相应的存储单元相连系,具体分配哪些单元给变量,由编译系统完成变量名到对应内存单元地址的变换。变量分配存储空间的大小由类型决定。变量的值则是指相应存储单元的内容。3.内存存取方式 直接存取:把直接按变量名或地址存取变量值的方式称为“直接存取”方式。间接存取:通过定义一种特殊的变量专门存放内存或变量的地址,然后根据该地址值再去访问相应的存储单元。,计算机教学中心李勇 C语言程序设计教程,4,系统为特殊变量p(用来存放地址的)分配的存储空间地址是4800,p中保存的是变量a的地址,即4000,当要读取a变量的值12345时,不是直接通过a变量,也不是直接通过保存12345的内存单元的地址4000去取值,而是先通过变量p得到p的值4000,即a的地址,再根据地址4000读取它所指向单元的值12345。,这种间接的通过变量p得到变量a的地址,再存取变量a的值的方式即为“间接存取”。通常称变量p指向变量a,变量a是变量p所指向的对象,计算机教学中心李勇 C语言程序设计教程,5,4.指针的概念,在语言中,用指针来表示一个变量指向另一个变量这样的指向关系。所谓指针即地址。一个变量的指针即该变量的地址,如4000就是指向变量a的指针。指针变量:专门存放地址的变量,如p即是一个指针变量,它存放的是a的地址4000。,计算机教学中心李勇 C语言程序设计教程,6,8.1.2 指针变量的定义与初始化1.指针变量的定义 类型标识符*指针变量名;例:float*p1;(定义p1为指向实型变量的指针变量)char*p2;(定义p2为指向字符型变量的指针变量)在指针变量定义中,*是一个说明符,它表明其后的变量是指针变量,如p是指针变量,而不要认为“*p”是指针变量。指针变量定义时指定的数据类型不是指针变量本身(变量存放的值)的数据类型,而是指针变量所指向的对象(或称目标)的数据类型 指针变量存放的是所指向的某个变量的地址值,而普通变量保存的是该变量本身的值 指针变量并不固定指向一个变量,可指向同类型的不同变量,计算机教学中心李勇 C语言程序设计教程,7,(1)指针运算符与地址运算符 与指针引用有关的两个运算符:&与*。&:取地址运算符*:指针运算符,或称指向运算符、间接访问运算 符。指针指向的对象的表示形式:*指针变量此处*是访问指针所指对象的运算符,与指针定义时的*不同。,2.指针变量初始化,计算机教学中心李勇 C语言程序设计教程,8,(2)指针变量初始化,若有定义:int a,*p;语句仅仅定义了指针变量p,但指针变量并未指向确定的变量(或内存单元)。因为这些指针变量还没有赋给确定的地址值,只有将某一具体变量的地址赋给指针变量之后,指针变量才指向确定的变量(内存单元)。指针变量初始化:在定义指针时同时给指针一个初始值如:int a,*p=,计算机教学中心李勇 C语言程序设计教程,9,(3)指针变量的引用,*指针变量名代表所指变量的值。指针变量名代表所指变量的地址。有定义:int a,*p=注意:*与&具有相同的优先级,结合方向从右到左。这样,&*p即&(*p),是对变量*p取地址,它与&a等价;p与&(*p)等价,a与*(&a)等价。,计算机教学中心李勇 C语言程序设计教程,10,8.1.3 指针运算,1.指针的赋值运算(1)将变量地址值赋给指针变量,使指针指向该变量。设有如下定义:int a,b,*pa,*pb;float*pf;第一行定义了整型变量a,b及指针变量pa,pb。pa、pb还没有被赋值,因此pa、pb没有指向任何变量,下面语句完成对pa,pb的赋值:pa=,计算机教学中心李勇 C语言程序设计教程,11,例如:int j=2,k=5;int*pointer1,*pointer2;pointer1=,计算机教学中心李勇 C语言程序设计教程,12,(2)相同类型的指针变量间的赋值,pa与pb都是整型指针变量,它们间可以相互赋值,如:pb=pa;即 pa,pb都指向变量a,此时a、*pa、*pb是等价的。指针指向变化如下图:,注意:只有相同类型的指针变量才能相互赋值,如pf=pa;是不允许的。因为pa是整型指针,pf是浮点型指针。,计算机教学中心李勇 C语言程序设计教程,13,()给指针变量赋空值,给指针变量赋空值,说明该指针不指向任何变量。“空”指针值用NULL表示,NULL是在头文件stdio.h中预定义的常量,其值为,在使用时应加上预定义行,如:#include stdio.h int*pa=NULL;亦可以用下面的语句给指针赋“空值”:pa=0;或:pa=0;这里指针pa并非指向0地址单元,而是具有一个确定的“空值”,表示pa不指向任何变量。注意:指针虽然可以赋值0,但却不能把其它的常量地址赋给指针。例如:pa=4000;是非法的。,计算机教学中心李勇 C语言程序设计教程,14,例 8.1 指针定义与初始化,main()int a,b;int*pointer_1,*pointer_2;a=100;b=10;pointer_1=,计算机教学中心李勇 C语言程序设计教程,15,程序运行结果:100,10100,10,计算机教学中心李勇 C语言程序设计教程,16,例8.2 从键盘上输入两个整数到a、b,按由大到小输出。,#include main()int a,b,*pa=/*pa指向大数,pb指向小数*/,计算机教学中心李勇 C语言程序设计教程,17,若输入:12 22输出结果:a=12,b=22 max=22,min=12,(b)(c)指针变化示意图,计算机教学中心李勇 C语言程序设计教程,18,2.指针的算术运算,(1)加减运算:一个指针可以加、减一个整数n,其结果与指针所指对象的数据类型有关。指针变量的值应增加或减少“nsizeof(指针类型)”。加减运算常用于数组的处理。对指向一般数据的指针,加减运算无实际意义。例如:int a10,*p=a,*x;x=p+3;/*实际上是p加上3*2个字节赋给x,x指向数组的第四个分量*/对于不同基类型的指针,指针变量“加上”或“减去”一个整数n所移动的字节数是不同的。例如:float a10,*p=a,*x;p=p+3;/*实际上是p加上3*4个字节赋给x,x依然指向数组的第四个分量*/,计算机教学中心李勇 C语言程序设计教程,19,(2)自增自减运算,指针变量自增、自减运算具有上述运算的特点,但有前置后置、先用后用的考虑,务请小心。例如:int a10,*p=a,*x;x=p+;/*x指向第一个元素分量,p指向第二个元素*/x=+p;/*x、p均指向数组的第二个分量*/*p+相当于*(p+)。*(p+)与(*p)+含义不同,前者表示地址自增,后者表示当前所指向的数据自增。,计算机教学中心李勇 C语言程序设计教程,20,2.*&a的含意是什么?(答:a或*p)3.(*p)+相当于什么?(答:a+),思考:1.若有定义 int a,*p;执行了“p=&a”,则:“&*p”的含意是什么?,(答:相当于&a),计算机教学中心李勇 C语言程序设计教程,21,3.指针的关系运算,与基本类型变量一样,指针可以进行关系运算。在关系表达式中允许对两个指针进行所有的关系运算。若p,q是两个同类型的指针变量,则:pq,p=q都是允许的。指针的关系运算在指向数组的指针中广泛的运用,假设 p、q是指向同一数组的两个指针,执行pq的运算,其含义为,若表达式结果为真(非值),则说明p所指元素在q所指元素之后。或者说q所指元素离数组第一个元素更近些。注意:在指针进行关系运算之前,指针必须指向确定的变量或存储区域,即指针有初始值;另外,只有相同类型的指针才能进行比较。,计算机教学中心李勇 C语言程序设计教程,22,8.1.4 多级指针,把指向指针型数据的指针变量称为指向指针的指针,或称多级指针。二级指针的定义形式如下:数据类型*指针变量例如:int a,*p,*pp;a=22;p=思考:如何用pp得到a的值?假设变量a的地址为4000,指针p的地址为4100,二级指针pp的地址为4800。a、p、pp三者的关系如上图。,pp(4800)p(4100)a(4000),计算机教学中心李勇 C语言程序设计教程,23,8.2 指针与函数,8.2.1 指针作为函数参数 利用指针作函数参数,可以实现函数之间多个数据的传递,当形参为指针变量时,其对应实参可以是指针变量或存储单元地址。函数形参为指针变量,用指针变量或变量地址作实参例8.3 编写一个交换两个变量的函数,在主程序中 调用,实现两个变量值的交换。,计算机教学中心李勇 C语言程序设计教程,24,程序如下:,#includevoid swap(int*p1,int*p2);/*函数声明*/main()int a,b;int*pa,*pb;scanf(%d%d,或:swap(,计算机教学中心李勇 C语言程序设计教程,25,接上页:,void swap(int*p1,int*p2)int temp;temp=*p1;/*交换指针p1、p2所指向的变量的值*/*p1=*p2;*p2=temp;,程序运行结果如下:输入:12 22 输出:a=22,b=12,计算机教学中心李勇 C语言程序设计教程,26,两点说明:,(1)若在函数体中交换指针变量的值,实参a、b的值并不改变,指针参数亦是传值。例如:int*p;p=p1;p1=p2;p2=p;不要希望如此完成a,b值的交换。(2)函数中交换值时不能使用无初值的指针变量作临时变量。例如:int*p;*p=*p1;*p1=*p2;*p2=*p;p无确定值,对 p的使用可能带来不可预期的后果。,计算机教学中心李勇 C语言程序设计教程,27,8.2.2 指针函数,指针函数:是指返回值为指针的函数指针函数的定义形式:类型标识符*函数名(参数)例如:int*fun(int a,int b)函数体语句 在函数体中有返回指针或地址的语句,形如:return(并且返回值的类型要与函数类型一致。,计算机教学中心李勇 C语言程序设计教程,28,例8.3 分析如下程序,main()int a,b,*p;int*max(int x,int y);scanf(“%d,%d”,int*max(int x,int y)if xy)return(,计算机教学中心李勇 C语言程序设计教程,29,8.2.3 指向函数的指针,一个函数包括一组指令序列,存储在某一段内存中,这段内存空间的起始地址称为函数的入口地址 称函数入口地址为函数的指针。函数名代表函数的入口地址 可以定义一个指针变量,其值等于该函数的入口地址,指向这个函数,这样通过这个指针变量也能调用这个函数。这种指针变量称为指向函数的指针变量。定义指向函数的指针变量的一般形式为:类型标识符(*指针变量名)();例如:int(*p)();/*指针变量p可以指向一个整型函数*/float(*q)();/*指针变量q可以指向一个浮点型函数*/,计算机教学中心李勇 C语言程序设计教程,30,刚定义的指向函数的指针变量,亦象其它指针变量一样要赋以地址值才能引用。当将某个函数的入口地址赋给指向函数的指针变量,就可用该指针变量来调用所指向的函数 给函数指针赋初值:将函数名(函数的入口地址值)赋给指针变量 例如 int m,(*p)();int max(int a,int b);则可以 p=max;/*p指向函数max()*/指针调用函数的 一般形式为:(*指针变量)(实参表);如上例:m=(*p)(12,22);/*比较 m=max(12,22);*/,计算机教学中心李勇 C语言程序设计教程,31,注意:,用函数指针调用函数是间接调用,没有参数类型说明,C编译系统也无法进行类型检查,因此,在使用这种形式调用函数时要特别小心。实参一定要和指针所指函数的形参类型一致。函数指针可以作为函数参数,此时,当函数指针每次指向不同的函数时,可执行不同的函数来完成不同的功能 例 8.4 函数max()用来求一维数组的元素的最大值,在主调函数中用函数名调用该函数与用函数指针调用该函数来实现。,计算机教学中心李勇 C语言程序设计教程,32,程序如下:,#include stdio.h#define M 8 main()float sumf,sump;float aM=11,2,-3,4.5,5,69,7,80;float(*p)();/*定义指向函数的指针p*/float max(float a,int n);/*函数声明*/p=max;/*函数名(函数入口地址)赋给指针p*/sump=(*p)(a,M);/*用指针方式调用函数*/sumf=max(a,M);/*用函数名调用max()函数*/printf(sump=%.2fn,sump);printf(sumf=%.2fn,sumf);,计算机教学中心李勇 C语言程序设计教程,33,程序接上页:,float max(float a,int n)int k;float s;s=a0;for(k=0;kn;k+)if(sak)s=ak;return s;程序运行结果:sump=80.00 sumf=80.00,计算机教学中心李勇 C语言程序设计教程,34,指向函数的指针的使用步骤:,(1)定义一个指向函数的指针变量,形如:float(*p)();(2)为函数指针赋值,格式如下:p=函数名;注意:赋值时只需给出函数名,不要带参数。(3)通过函数指针调用函数,调用格式如下:s=(*p)(实参);,计算机教学中心李勇 C语言程序设计教程,35,8.3 指针与数组,8.3.1 指向一维数组的指针数组名是一个常量指针,它的值为该数组的首地址 1.指向数组的指针的定义方法与指向基本类型变量的指针的定义方法相同,例如:int a10=1,3,5,7,9;int*p;p=(把数组的首地址赋给指针变量p),计算机教学中心李勇 C语言程序设计教程,36,C语言规定:数组名代表数组首地址,是一个地址常量。因此,下面两个语句等价:p=两句。,计算机教学中心李勇 C语言程序设计教程,37,指向数组的指针变量p,a+0,p+1 或 a+1,p+9 或 a+9,*(a+9)或*(p+9),计算机教学中心李勇 C语言程序设计教程,38,2.通过指针引用数组元素*p=5;表示对p当前所指的数组元素赋以一个值5。C规定:p+1指向数组的下一元素(而不是将p值简单地加1)。p+1意味着使p的原值(地址)加d个字节(d为一个数组元素所占的字节数)。,如果p的初值为&a0,则:(1)p+i和a+i就是ai的地址,或者说它们指向a数组的第i个元素(见下页图)。(2)*(p+i)或*(a+i)是p+i或a+i所指向的数组元素,即ai。(3)指向数组的指针变量也可以带下标,如pi与*(p+i)、ai等价。,计算机教学中心李勇 C语言程序设计教程,39,综上所述,引用一个数组元素有二法:(1)下标法:如ai、pi形式;(2)指针法:如*(a+i)或*(p+i)。其中a是数组名,p是指向数组的指针变量,其初值p=a。,计算机教学中心李勇 C语言程序设计教程,40,main()int a10;int i;for(i=0;i10;i+)scanf(%d,例8.5 用三种方法输出数组全部元素。(1)下标法,计算机教学中心李勇 C语言程序设计教程,41,main()int a10;int i;for(i=0;i10;i+)scanf(%d,(2)通过数组名计算数组元素地址,输出元素的值,计算机教学中心李勇 C语言程序设计教程,42,(3)用指针变量指向数组元素main()int a10;int*p,i;for(i=0;i10;i+)scanf(%d,三种方法的比较:用下标法比较直观,能直接知道是第几个元素;而用指针法则执行效率更高。,计算机教学中心李勇 C语言程序设计教程,43,使用指针变量时,应注意:(1)指针变量可实现使本身的值改变。P+合法;但a+不合法(a是数组名,代表数组首地址,在程序运行中是固定不变的。)(2)要注意指针变量的当前值。,计算机教学中心李勇 C语言程序设计教程,44,(3)*p+相当于*(p+),因为*与+优先级相同,且结合方向从右向左,其作用是先获得p指向变量的值,然后执行p=p+1;(4)*(p+)与*(+p)意义不同,后者是先p=p+1,再获得p指向的变量值。若p=a,则输出*(p+)是先输出a0,再让p指向a;输出*(+p)是先使p指向a,再输出p所指的a。(5)(*p)+表示的是将p指向的变量值+,计算机教学中心李勇 C语言程序设计教程,45,小结,1、如何使得一个指针指向一个数组?1)利用数组首元素的地址;2)利用数组名;2、如何引用一个数组元素的值?1)下标法:a.利用数组名加下标;b.利用指针变量名加下标;2)指针法:a.利用对数组名的间接访问;b.利用对指针变量的间接访问。,计算机教学中心李勇 C语言程序设计教程,46,8.3.2 二维数组与多维数组的指针表示法,1.二维数组的地址设有一个二维数 组a,它有三行四列:int a34;数组名a:代表整个二维数组的首地址,也就是第0行的首地址。a+i:代表第i行的首地址。(见下页图),计算机教学中心李勇 C语言程序设计教程,47,数组名a代表整个二维数组的首地址:,上图 a数组包含三个元素:a0,a1,a2.而每个元素又是一个一维数组,它包含4个元素(即4个列元素),如:a0又包含:a00,a01,a02,a03.,计算机教学中心李勇 C语言程序设计教程,48,一维数组名ai:代表第i 行的首地址,即第i行中第0列元素的地址(既&ai0)。ai+j:代表第i行中的第j个元素的地址,即为&aij。注意地址变化的单位数值在不同的场合的实际字节数是不同的:“a+1”中的“1”实际代表数组中一行元素所占的总字节数;“ai+1”中的“1”代表数组中一个元素所占的字节数。,计算机教学中心李勇 C语言程序设计教程,49,a代表第0行的首地址,a+1代表第1行的首地址,a+2代表第2行的首地址.每行存放4个整型数据(即1个元素占2个字节),因此,这里+1的含义是:+4*2=+8个字节.,计算机教学中心李勇 C语言程序设计教程,50,计算机教学中心李勇 C语言程序设计教程,51,例8.6 用指针表示法输出二维数组的各元素。,#includemain()static int a23=0,1,2,3,4,5;int k,j,*p;for(j=0;j2;j+)/*方式1*/for(k=0;k3;k+)printf(%5d,*(aj+k);/*aj是j行首地址,aj+k是j行k列元素的地址*/putchar(n);putchar(n);,计算机教学中心李勇 C语言程序设计教程,52,接上页:,for(j=0;j2;j+)/*方式2*/for(k=0;k3;k+)printf(%5d,*(*(a+j)+k);/*(a+j)是j行首地址,*(a+j)+k是j行k列元素的地址*/putchar(n);p=a;/*p指向数组的第一个元素*/for(j=0;j2;j+)/*方式3*/for(k=0;k3;k+)printf(%5d,*(p+);/*输出p所指示的元素*/putchar(n);,计算机教学中心李勇 C语言程序设计教程,53,输出的结果是:0 3 4 5 0 3 4 5 0 3 4 5,计算机教学中心李勇 C语言程序设计教程,54,2.指向二维数组的指针变量有两种情况:一是直接指向数组元素的指针变量;二是指向一个含有m个元素的一维数组。这两种不同形式的指针变量,其使用方法不同。指向数组元素的指针变量,即简单指针变量,如:int*p,a34;p=,计算机教学中心李勇 C语言程序设计教程,55,注意:(1)int(*p)4;定义一个指针变量p,p 指向包含4个元素的一维数组。(2)p+i与*(p+i)的区别:p+i是指向第i行的指针(第i行的首地址);*(p+i)是指向第i行第1个元素的地址;两者数值相等,但含义不同:p+i 的增值将以行长为单位,而*(p+i)增值将以元素长度为单位。,计算机教学中心李勇 C语言程序设计教程,56,即:p+i+1将指向第i行再下一行的首地址,而*(p+i)+1将指向第i行首元素的下一个元素地址。(见下图)设 int a34,(*p)4;p=a;,如果p先指向a0,则p+1不是指向a01,而是指向a1,计算机教学中心李勇 C语言程序设计教程,57,例8.7 main()static int a34=1,3,5,7,9,11,13,15,17,19,21,23;int(*p)4,i,j;p=a;scanf(i=%d,j=%d,计算机教学中心李勇 C语言程序设计教程,58,8.4 指针与字符串,8.4.1 字符串的指针表示法回顾:利用字符数组完成字符串编程。1、字符数组的定义及初始化:,例如:char str=“student”;,2、字符数组的输入/输出:,A)逐个字符的输入/输出;B)字符串整体的输入/输出。,3、字符串中各个字符的引用。,计算机教学中心李勇 C语言程序设计教程,59,1、字符指针变量的定义:char*指针变量;如:char*p;2、字符指针的初始化:A)在定义时初始化指针变量使指针指向一个字 符串。例如:char*string=“I Love China!”;B)先定义后初始化。例如:char*str;str=“I love china”;思考:能否char str20;str=“I love china”;以上语句的含义:定义str为指针变量,它指向字符型数据,且赋值语句把字符串“I love china”的首地址赋给了指针变量str。,计算机教学中心李勇 C语言程序设计教程,60,3、利用字符指针实现字符串的整体输入/输出 A)输入:char a20,*str=a;注意:char*str;scanf(“%s”,str);scanf(“%s”,str);B)输出:char*string=“student”;printf(“%sn”,string);(为何不用*string?如用*string,程序应如何变化?)对字符串的整体输出实际上还是从指针所指示的字符开始逐个显示(系统在输出一个字符后自动执行p+),直到遇到字符串结束标志符0为止。而在输入时,亦是将字符串的各字符自动顺序存储在p指示的存储区中,并在最后自动加上 0。,计算机教学中心李勇 C语言程序设计教程,61,4、用指针变量来实现对字符串的访问 利用字符指针对字符串的访问与利用指向数组的指针来访问各个数组元素的方法相同,需要注意的是字符串结束标志0的使用。,例:将一字符串中大写英文字母转换成小写字母。,main()char a80,*str=a;scanf(%s,str);for(;*str!=0;str+)if(*str=A思考:为什么不用str输出?,计算机教学中心李勇 C语言程序设计教程,62,小 结1、掌握字符指针的定义及初始化;2、理解字符指针与字符串的指向关系;3、利用字符指针引用字符串或其中某个字符;4、注意字符指针移动后指向的变化;5、注意0标志的作用。,计算机教学中心李勇 C语言程序设计教程,63,思考题:将一已知字符串第n个字符开始的剩余字符复制为另一新的字符串。,main()int i,n;char a=computer;char b10,*p,*q;p=a;q=b;scanf(%d,/*指针指到要复制的第一个字符*/,计算机教学中心李勇 C语言程序设计教程,64,for(;*p!=0;p+,q+)*q=*p;*q=0;/*字符串以0 结尾*/printf(String a:%sn,a);printf(String b:%sn,b);,输入:3输出:computer mputer考虑一下,若输出语句改为如下语句会如何?printf(“string a is:%sn”,p);printf(“string b is%sn”,q);,计算机教学中心李勇 C语言程序设计教程,65,本 章 小 结,1、指针是一种存放地址的变量,像其他的变量一样,须在使用前定义。指针变量的命名遵守与其他变量相同的命名规则。指针变量定义格式如下:类型名*指针变量名;,2、两个与指针变量有关的运算符:&(取地址运算符)和*(指针运算符)。其中:&运算符只能作用于变量,包括基本类型变量和数组的元素,不能作用于数组名和常量,其结果是取运算对象的存储地址。*运算符也称间接访问运算符,其操作对象是地址,通过对该地址的间接访问达到存取变量值的目的。,计算机教学中心李勇 C语言程序设计教程,66,4、可以利用指针变量方便地对数组进行存取。如果指针 变量p的初值为数组a的首地址,则p+i和a+i就是ai 的地址,*(p+i)和*(a+i)既是数组元素ai的值。,3、C语言规定向被调函数进行参数传递只能是单向值传 递即传值的方式,采向被调函数传指针变量的方式则 变相地实现了参数传递中非常重要的一种方式传 地址,从而使得主调函数与被调函数发生了某种意义 上的关联,这样使得程序的编制更加灵活,比如我们 可以通过这种参数传递方式从被调函数返回多个值。,计算机教学中心李勇 C语言程序设计教程,67,5、指针指向字符串时,是把字符串的首地址赋 给字符指针。可以通过*运算符对字符指针进行操 作以达到操作字符串各个字符的目的,具体操作方法与利用指向数组的指针相同。,计算机教学中心李勇 C语言程序设计教程,68,例 编写一个交换两个变量的函数,在主程序中 调用,实现两个变量值的交换。(假定a和b两个变量)分析:此程序要求进行模块化程序设计,其中main函数完成数据的输入及结果的输出并进行交换函数(swap)的调用,swap函数完成两个变量值的交换。编程的重点在于考虑如何从swap函数中得到两个返回值及main函数和swap函数参数的传递方法。,8.6 程序举例,计算机教学中心李勇 C语言程序设计教程,69,void swap(int x,int y)int temp;temp=x;x=y;y=x;main()int a,b;scanf(“%d%d”,void swap(int*x,int*y)int*temp=NULL;temp=x;x=y;y=x;main()int a,b,*p,*q;scanf(“%d%d”,void swap(int*x,int*y)int temp;temp=*x;*x=*y;*y=temp;main()int a,b,*p,*q;scanf(“%d%d”,计算机教学中心李勇 C语言程序设计教程,70,两点说明:,(1)若在函数体中交换指针变量的值,实参a、b的值并不改变,指针参数亦是传值。例如:int*p;p=p1;p1=p2;p2=p;不要希望如此完成处理。(2)函数中交换值时不能使用无初值的指针变量作临时变量。例如:int*p;*p=*p1;*p1=*p2;*p2=*p;p无确定值,对 p的使用可能带来不可预期的后果。,计算机教学中心李勇 C语言程序设计教程,71,例2:编制求一个整型数组中所有偶数元素和及奇数元素和的函数并在main函数中输出。,分析:1、数组元素的输入;2、程序结果的输出;3、函数调用时参数传递的方式;4、算法:遍历所给数组的全部元素;如果某个数组元素为偶数则求和并将结 果存入偶数和变量sum1,反之求和后存 入奇数和变量sum2中。,计算机教学中心李勇 C语言程序设计教程,72,main()int a10=1,21,10,34,45,23,11,9,22,18,sum1=0,sum2=0;sum(,void sum(int*x,int*y,int*z)int i;for(i=0;i10;i+)if(*(z+i)%2=0)*x+=*(z+i);else*y+=*(z+i);,计算机教学中心李勇 C语言程序设计教程,73,例3:编制一函数,其功能是将一个字符串中所有数字符号删除形成一个新字符串并在main函数中输出。,分析:1、在main函数中完成待处理字符串的输入及结果输出;其中新产生的字符串用另外的字符数组存放;2、考虑函数调用时参数的传递方式;3、算法:在函数del中遍历待处理字符串,找到非数字 符号即存入结果数组中。,计算机教学中心李勇 C语言程序设计教程,74,main()char str120,str220;gets(str1);del(str1,str2);puts(str2);,void del(char*p,char*q)for(;*p!=0;p+)if(!(*p=0,

    注意事项

    本文(C语言程序设计教程第8章.ppt)为本站会员(牧羊曲112)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

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




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开