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

    C语言课件第08讲.ppt

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

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

    C语言课件第08讲.ppt

    第八讲,Begin:,第八章 指针,指针和指针变量的概念变量的指针和指向变量的指针变量,8.1.1 地址和指针,存储单元:存放一个字节数据的存储器。存储单元的内容:存储单元中存放的数据。存储单元的地址:存储单元的编号。变量的首地址:变量占据的连续存储单元的起始地址,简称变量的地址。指针:存储单元的地址,是一个常量。,8.1.1 地址和指针,int i;char ch;float f;,i=1;ch=A;f=2.5;,8.1.2 指针变量,指针变量是专门用来存放内存单元地址的特殊变量。当把某个变量i的地址存入指针变量p后,我们就说这个指针变量p指向该变量i。,指向,1000,i的地址存入p,int i=10,*p;,p=,指针与指针变量的区别,就是变量值与变量的区别,即指针变量的值是指针。例如,可以说变量i的指针是1000,但不能说变量i的指针变量是1000。,8.1.2 指针变量,对内存单元的访问有两种方式:直接访问:直接根据变量名存取变量的值。间接访问:将变量的地址存放在指针变量中,当要对变量进行存取时,首先读取指针变量的值,得到要存取变量的地址,再对该变量进行访问。,8.2.1 指针变量的定义,定义格式:类型说明符*指针变量名;其中类型说明符指的是指针变量所指向变量的数据类型,“*”表示随后的变量是指针变量。例如:int*ptr1;char*ptr2;ptr1是指向整型变量的指针变量,专门用来存放整型变量的地址。ptr2是指向字符型变量的指针变量,专门用来存放字符型变量的地址。,8.2.1 指针变量的定义,说明:1)指针变量中只能存放地址(指针),不能和整型 变量混淆。例如下面写法是错误的:int*ptr1;ptr1=1000;指针变量可以取值为0(NULL),表示该指针变量不指向任何变量。2)指针变量只能存放与它数据类型相同的变量的地址。例如下面写法是错误的:int*ptr1;char ch;ptr1=,8.2.2 指针变量的引用,指针变量可以通过一对互逆的运算符进行引用。取地址运算符“/*将变量ch的地址赋给指针变量ptr2*/,8.2.2 指针变量的引用,指针运算符“*”作用:间接存取指针变量所指向变量的值。例如:int i,*ptr1;char ch,*ptr2;ptr1=,8.2.2 指针变量的引用,说明:1)定义语句中的“*”和执行语句中的“*”含义不同,定义语句中的“*”说明定义的是一个指针变量,而执行语句中的“*”表示间接存取指针变量所指向变量的值。2)指针变量中必须存放了确定的地址值后才能进行指针运算。例如下面写法是错误的:int*ptr1;*ptr1=10;ptr1中存放的是一个随机的地址值,该地址有可能是系统程序已占用存储单元的地址,将10赋值给ptr1所指向对象后,原来的数据被更新,系统有可能遭到很严重的破坏。,8.2.2 指针变量的引用,例 指针运算符的使用,#include void main()int a=50,*p;p=,程序运行结果:*p=50,p=fff4a=100,&a=fff4,8.2.3 指针变量的初始化,一般格式:类型说明符*指针变量名=初始地址值;例如:int i,*ptr1=说明:1)任何指针变量在使用之前必须初始化,使指针变量指向一个确定的内存单元,未经初始化的指针变量禁止使用。2)必须使用同类型变量的地址进行指针变量的初始化。,8.2.4 指针变量的运算,实质:地址的运算类型:指针变量赋值指针变量加/减一个整数两个指针变量比较两个指针变量相减,8.2.4 指针变量的运算,1.指针变量赋值:将已存在对象的地址赋给指针变量例 交换两个指针变量所指向变量的值#include void main()int*p1,*p2,x1=10,x2=20,t;p1=,程序运行结果:*p1=10,*p2=20*p1=20,*p2=10 x1=20,x2=10,8.2.4 指针变量的运算,程序运行结果:*p1=10,*p2=20*p1=20,*p2=10 x1=10,x2=20,例 交换两个指针变量的值#include void main()int*p1,*p2,*t=NULL,x1=10,x2=20;p1=,8.2.4 指针变量的运算,2.指针变量加/减一个整数:指向另一个存储单元例 移动指针变量访问数组元素#include void main()int a10=1,3,5,7,9,11,13,15,17,19;int n=6,*p1,*p2;p1=p2=,程序运行结果:1)*p1=1,*p2=12)*p1=13,*p2=33)*p1=9,*p2=17,8.2.4 指针变量的运算,3.两个指针变量比较:对两个指针变量中存放的地址进行比较例 比较指针变量逆序数组元素#include void main()int a10=1,3,5,7,9,11,13,15,17,19;int*p1=,程序运行结果:a0=19a1=17a2=15a9=1,指针变量的比较运算经常用于数组,判定两个指针变量所指向的数组元素的位置先后。,8.2.4 指针变量的运算,4.两个指针变量相减:当两个指针变量指向同一数组中的不同数组元素时,指针变量相减的差值即为两个指针变量相隔的元素个数。例 相减指针变量逆序数组元素#include void main()int a10=1,3,5,7,9,11,13,15,17,19;int*p1=,程序运行结果:a0=19a1=17a2=15a9=1,8.2.5 指针变量作为函数参数,特点:将变量地址作为实参传送到被调用函数中;遵循“单向值传递”方式(特殊的地址值);被调用函数不能改变实参指针的值,但可以改变实参指针所指向变量的值;可以得到多个返回值。,8.2.5 指针变量作为函数参数,例 交换实参指针所指向变量的值#include void swap(int*x,int*y)/*形参为相同类型的指针变量*/int t;t=*x;*x=*y;*y=t;/*交换指针变量所指向变量的值*/void main()int a=10,b=20;printf(1)a=%d,b=%dn,a,b);swap(,程序运行结果:a=10,b=20a=20,b=10,地址值传递,8.2.5 指针变量作为函数参数,例 交换形参指针变量的值#include void swap(int*x,int*y)/*形参为相同类型的指针变量*/int*t;t=x;x=y;y=t;/*交换指针变量的值*/void main()int a=10,b=20,*p=,程序运行结果:a=10,b=20a=10,b=20,地址值传递,第八章 指针,数组的指针和指向数组的指针变量字符串的指针和指向字符串的指针变量,8.3.1 一维数组的指针和指向一维数组元素的指针变量,数组的指针:数组的首地址。一维数组的指针:一维数组的首地址,也就是一维数组中第一个元素的地址。C语言规定:数组名代表数组的首地址。若有:int a10;则:a 与 a0 是等价的数组元素的指针:数组元素的地址。指向一维数组元素的指针变量:存放一维数组首地址或数组元素地址的变量。,8.3.1 一维数组的指针和指向一维数组元素的指针变量,一维数组的首地址加上偏移量x即可得到其他数组元素的地址。例如:int a10,*p;p=a;/*等价于 p=&a0*/则有:&a1 等价于 a+1 或 p+1&ai 等价于 a+i 或 p+i 注意:p+i指向数组的第i个元素,而不是简单地使指针变量p的值加i。其所代表的地址实际上是p+isize(size为一个数组元素所占的字节数)。,8.3.1 一维数组的指针和指向一维数组元素的指针变量,访问一个数组元素主要有两种形式:下标法:用 ai 的形式存取数组元素。指针法:用*(a+i)或*(p+i)的形式存取数组元素。其中a是一维数组名,p是指向数组元素的指针变量。p的初值为数组a的首地址,可以通过指针变量赋值或加/减一个整数使p指向不同的数组元素。例如:int a10,*p=a;p+;/*p指向a1*/p=a+5;/*p指向a5*/,8.3.1 一维数组的指针和指向一维数组元素的指针变量,例 通过下标法存取数组元素#include void main()int a10,i;for(i=0;i10;i+)scanf(%d,8.3.1 一维数组的指针和指向一维数组元素的指针变量,例 通过数组名计算元素地址存取数组元素#include void main()int a10,i;for(i=0;i10;i+)scanf(%d,a+i);for(i=0;i10;i+)printf(%5d,*(a+i);printf(n);,8.3.1 一维数组的指针和指向一维数组元素的指针变量,例 通过指针变量存取数组元素#include void main()int a10,*p;for(p=a;pa+10;p+)scanf(%d,p);for(p=a;pa+10;p+)printf(%5d,*p);printf(n);,8.3.1 一维数组的指针和指向一维数组元素的指针变量,用指针法访问数组元素的注意事项:数组名是一个常量,不允许重新赋值。p+i和a+i均表示数组元素ai的地址,均指向ai。*(p+i)和*(a+i)均表示p+i和a+i所指对象的内容,即ai。*p+等价于*(p+),其作用是先得到*p,再使p=p+1。,8.3.1 一维数组的指针和指向一维数组元素的指针变量,用指针法访问数组元素的注意事项:(*p)+:表示将p所指向元素的值加1。例如:int a5=0,2,4,6,8,*p;p=a+2;(*p)+;printf(%dn,*p);程序段输出结果为:5,8.3.1 一维数组的指针和指向一维数组元素的指针变量,例 分析下面程序的输出结果#include void main()int a5=0,2,4,6,8,*p,i;p=a;(*p)+;p=a+1;+(*p);p=a+2;(*p)-;p=a+3;-(*p);for(i=0;i=4;i+)printf(%5d,ai);printf(n);,程序运行结果:1 3 3 5 8,8.3.1 一维数组的指针和指向一维数组元素的指针变量,用指针法访问数组元素的注意事项:实际上是变址运算符,即编译时是将数组元素ai处理成*(a+i)的。因此指向数组元素的指针变量也可带下标。例如:*(p+i)可以表示成 pi。注意:如果p不指向a0,则pi和ai是不一样的。例如:int a10,*p;p=a+3;/*p指向a3*/p3=25;/*p3等价于a6*/这种方式容易出错,一般不提倡使用。,8.3.1 一维数组的指针和指向一维数组元素的指针变量,数组元素的访问小结,8.3.3 数组名作为函数参数,一维数组名作为函数参数的特点:作为实参的数组名表示数组的首地址,是一个地址常量;作为形参的数组名并不表示数组的首地址,它不是一个地址常量而是一个指针变量;在函数调用时,实参向形参传递数组的首地址;可以用指向数组元素的指针变量作为函数参数。,例 用选择法对10个整数由大到小排序,#include void sort(int,int);void main()int*p,i,a10;printf(Input data:n);for(i=0;i10;i+)scanf(%d,a+i);sort(a,10);for(p=a;pa+10;p+)printf(%5d,*p);printf(n);,void sort(int x,int n)int*x_end,*y,temp;x_end=x+n;for(;x*x)temp=*x;*x=*y;*y=temp;,8.3.3 数组名作为函数参数,8.4.1 字符串指针变量的定义与引用,字符串常量的处理是用字符数组来实现的。也就是说,无论是否定义了字符数组,对于程序中出现的字符串,系统都会在内存中开辟一个字符数组连续存储空间来存放该字符串常量。字符串的指针:字符串的首字符地址,也就是存放字符串的字符数组的首地址。字符串指针变量:通常把char型指针变量称为字符串指针变量。也就是说,指向字符串的指针变量等同于指向字符数组元素的指针变量,可以指向字符串中的任意一个字符。,8.4.1 字符串指针变量的定义与引用,字符串指针变量的定义和初始化方式一:将存放字符串的字符数组名赋给字符串指针变量,让字符串指针变量指向字符串的首字符,然后通过移动指针变量来访问字符串的其他字符。例如:char str=Welcome to China!;char*p;p=str;/*等价于 p=&str0*/,8.4.1 字符串指针变量的定义与引用,字符串指针变量的定义和初始化方式二:在程序中定义一个字符串指针变量,并将字符串的首地址直接赋给它,然后通过移动指针变量来访问字符串的其他字符。例如:char*p=Welcome to China!;等价于:char*p;p=Welcome to China!;这里的字符串指针变量p指向字符串的首字符,即第一个字符W。,例 用字符串指针变量实现字符串操作#include void main()char*str=Welcome to China!;printf(%sn,str);/*整体引用字符串*/for(;*str!=0;str+)printf(%c,*str);/*逐个引用字符串中的字符*/printf(n);,8.4.1 字符串指针变量的定义与引用,程序运行结果:Welcome to China!Welcome to China!,8.4.2 字符串指针变量与字符数组,字符数组是由若干个元素组成,每个元素存放一个字符;而字符串指针变量存放的是字符串中某一个字符的地址。赋值方式不同。字符数组只能对各个元素分别赋值,而字符串指针变量只用赋给字符串的首地址就可以了。例如,下面的赋值是正确的:char*str;str=Welcome to China!;/*str是指针变量*/下面的赋值是错误的:char str30;str=Welcome to China!;/*str是数组名*/,8.4.2 字符串指针变量与字符数组,字符串指针变量占用的内存要少于字符数组。例如,编译系统为下面二维字符数组的定义及初始化分配了36个字节的内存空间:char str218=Hello,Welcome to China!;为下面两个字符串指针变量的定义及初始化分配了28个字节的内存空间:char*str1=Hello,*str2=Welcome to China;字符串指针变量的值是可以改变的,而字符数组的数组名永远代表该数组的首地址,它的值是不会变化的。,例 将字符串str1复制到字符串str2#include void main()char str1=Copy string,str230;char*p1=str1,*p2=str2;while(*p1!=0)*p2+=*p1+;*p2=0;printf(String str2=);puts(str2);,程序运行结果:String str2=Copy string,8.4.2 字符串指针变量与字符数组,8.4.3 字符串指针变量作为函数参数,特点:用字符数组名或字符串指针变量名作为实参,向形参传递字符串的首地址;作为形参的字符数组或字符串指针变量本质上都是字符串指针变量;在被调用函数中可以改变字符串的内容,在主调函数中可以得到改变以后的字符串。,例 连接两个字符串str1和str2,连接结果放在str1中#include void strlink(char*,char*);void main()char str115=Hello,str2=World!;strlink(str1,str2);printf(String str1=%sn,str1);void strlink(char*s,char*t)while(*s!=0)s+;/*使s指向字符串str1的末尾*/while(*t!=0)*s+=*t+;/*将str2中的字符逐个连接到str1的末尾*/*s=0;/*在str1的末尾加上字符串结束标志*/,程序运行结果:String str1=Hello World!,8.4.3 字符串指针变量作为函数参数,8.4.3 字符串指针变量作为函数参数,指针变量作为函数参数小结:,

    注意事项

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

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




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开