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

    C语言程序设计善于利用指针.ppt

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

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

    C语言程序设计善于利用指针.ppt

    1,第8章 善于利用指针,C 语言程序设计,北京航空航天大学 交通科学与工程学院徐国艳,2/56,指针的概念指针和指针变量指针与数组指针做函数参数,8.1 8.2 8.38.4,章节内容,3/56,访问内存的两种方式:直接访问:按地址直接存取&a间接访问:通过指针i间接存取,8.1指针的概念,什么是指针?如何使用指针?,对于int a=10,c=5;float b=3.5;,内存分配,例,a的地址,a的内容,指针,a的地址,a是整型变量,存放内容i是指针变量,存放地址,a的地址a的指针,指向a,4/56,用指针i访问:用i+可以指向字符串中的每个地址!,8.1指针的概念,用指针实现顺序访问,char c=“GOOD!”;,例,为什么要使用指针?,5/56,8.2 指针和指针变量,一、指针、指针变量与指向,例:int a=10,*i,x;float b=3.5,*p1;char c,*p2=,10,i,*i,a1000,指针地址指针变量:存放地址的变量指针变量是一种新的数据类型,1000是a 的指针i是指针变量,*i=a,二、指针变量的定义与赋值,数据类型*指针变量名,1000,*i是i指向的变量a,指针运算,*i,*i,定义指针变量,指针初始化,指针赋值,6/56,三、指针变量的赋值与操作,*-指针运算符&-取地址运算符同级,右结合,指针变量的赋值,int a=3,*p,*p1,*p2,*p3,p4;p=,指针变量的操作,int a=3,*p,*p1,k;p=/*因为&*p=&a,操作结果使p1指向a*/,7/56,四、指针的引用,例8.1:指针的赋值与输出void main()int a=10,b,c,*p;p=,输出结果:10,10,1010,1739919326,1739919326,printf(“%d,%dn,*,第三行输出结果:10,1739919326,指针赋值,指针运算,指针输出,8/56,方法1:目标变量值不变,改变指针变量的指向求解。void main()int a,b,*p1,*p2,*p;p1=,a=6,b=8max=8,min=6,8.2 指针和指针变量,【例8.2】输入a、b两个整数,使用指针变量按大小顺序输出这两个整数。,9/56,方法2:利用指针变量直接改变目标变量的值求解。void main()int a,b,t,*p1,*p2;p1=,a=8,b=6max=8,min=6,8.2 指针和指针变量,6,10/56,指针的加减运算,8.2 指针和指针变量,五、指针的基本运算,void main()int a=10,20,30,40,50,*p1,*p2;p1=p2=a;printf(p1=%u,*p1=%dn,p1,*p1);p2+=3;printf(p2=%u,*p2=%dn,p2,*p2);,P2=416,*p2=40,指针加减运算要点:只有当指针变量指向数组时指针的加减运算才有意义。指针变量可加减一个整型表达式。如:p1+、p2+3、p2-、p2-2。指针的加减运算是以基类型为单位(即sizeof(类型))的。两个指针变量不能作加法运算,只有当两个指针变量指向同一数组时,进行指针变量相减才有实际意义。如:p2-p1。,11/56,指针的关系运算,8.2 指针和指针变量,五、指针的基本运算,指向同一数组的两个指针可以进行关系运算,表明它们所指向元素的相互位置关系。如:p2 p1、p2=p1。指针与一个整型数据进行比较是没有意义的。不同类型指针变量之间比较是非法的。NULL可以与任何类型指针进行=、!=的关系运算,用于判断指针是否为空指针。,404408412416420,12/56,int i,*p p=,int*p;float*q;p=q;,int i;float*p;p=,int*p;p=100;,是真?是假?,判断,指针变量只存放地址!,一个指针变量不能指向与其类型不同的变量!,我是真的,你对了吗?,应在类型相同的指针变量之间赋值,13/56,数组名是该数组的指针 a是数组的首地址(即a0的地址),是一个指针常量。a=&a0,a+1=&a1,a+9=&a9 数组元素的下标表示法:a0,a1,ai,a9 数组元素的指针表示法:*(a+0),*(a+1),*(a+i),*(a+9),8.3 指针与数组,8.3.1 指向数组的指针,1.一维数组的指针,例如:int a10,*p;,14/56,当p指向a0时,用p表示数组元素 下标法:p0,p1,pi,p9 指针法:*(p+0),*(p+1),*(p+i),*(p+9),8.3 指针与数组,8.3.1 指向数组的指针,1.一维数组的指针,指向一维数组元素的指针变量 由于数组元素也是一个内存变量,所以此类指针变量的定义和使用与指向基本变量的指针变量相同。例如:int a10,*p;p=a;(或 p=),a,15/56,【例8.3.1】用指针输出数组元素。#include stdio.hvoid main()int a10,i,*p;for(i=0;i10;i+)scanf(%d,a+i);for(i=0;i10;i+)printf(%4d,*(a+i);printf(n);for(p=a,i=0;i10;i+)printf(%4d,*(p+i);printf(n);,8.3 指针与数组,8.3.1 指向数组的指针,1.一维数组的指针,12345678910,1 2 3 4 5 6 7 8 9 10,1 2 3 4 5 6 7 8 9 10,16/56,【例8.3.2】用指针法输入输出数组元素。main()int a10,i,*p;for(p=a;pa+10;p+)scanf(%d,p);for(p=a;pa+10;p+)printf(%d,*p);printf(n);,8.3 指针与数组,8.3.1 指向数组的指针,1.一维数组的指针,10,17/56,数组名是地址,指向数组的指针变量存放的也是地址。通过指针变量也可以引用数组元素。p=&a0 等效于 p=a。,数组名和指向数组的指针变量的区别:指针变量p是变量可以赋值,数组名a是地址常量不能赋值。,8.3 指针与数组,8.3.1 指向数组的指针,用指针变量引用数组元素,必须关注其当前值。例如:p=p+3*(p-1)、p-1等价于a2,18/56,【例8.4】输入五个整数,使用指针变量将这五个数 按从小到大排序后输出。,8.3 指针与数组,#include“stdio.h”void main()int a5,*pp,*p,*q,t;for(p=a;p*q)pp=q;if(pp!=p)t=*p;*p=*pp;*pp=t;for(p=a;pa+5;p+)printf(%d,*p);printf(n);,19/56,【例8.7】通过初始化使指针指向一个字符串。void main()char str1=Good morning!;char*str2=Good night!;printf(%sn,str1);printf(%sn,str2);,8.3 指针与数组,8.3.2 指向字符串的指针变量,1.指向字符串的指针变量的定义及初始化,字符串的两种表示方式:字符数组表示方式,字符串存放在一维数组中,引用时用数组名。字符指针变量表示方式,字符指针变量存放字符串的首地址,引用时用指针变量名。,Good morning!,Good night!,C语言对字符串常量是按字符数组处理的,在内存中开辟一个字符数组用来存放字符串常量,但是这个字符数组没有名字。,20/56,【例8.8】通过赋值运算使字符指针变量指向一个字符串。#include main()char c80,*str;strcpy(c,How are you?);str=Fine,thanks.;printf(%sn%sn,c,str);,8.3 指针与数组,8.3.2 指向字符串的指针变量,2.字符串的赋值运算,将一个字符串赋给一个字符数组只能使用strcpy函数 将字符串常量的首地址赋给指针变量,可使用赋值运算符“=”,How are you?,Fine,thanks.,21/56,【例8.9】利用指针变量输入输出字符串。#include void main()char c80,*str;str=c;gets(str);puts(str);,8.3 指针与数组,8.3.2 指向字符串的指针变量,3.字符串的输入输出,使用字符串输入输出函数gets()和puts();在scanf和printf函数中使用%s格式实现。输入字符串时,函数参数:数组名、存有数组名的指针变量;输出字符串时,函数参数:数组名、存有字符串首地址的指针变量。,I love China!,I love China!,22/56,【例8.11】已知字符串str,从中截取一子串。要求该子串是从str的第m个字符开始,由n个字符组成。思路:定义字符数组c 存放子串,字符指针变量p 用于复制子串,利用循环语句从字符串str截取n个字符。考虑到几种特殊情况:m位置后的字符数有可能不足n个,所以在循环读取字符时,若读到 0 停止截取,利用break语句跳出循环。输入的截取位置m大于字符串的长度,则子串为空。要求输入的截取位置和字符个数均大于0,否则子串为空。,8.3 指针与数组,8.3.2 指向字符串的指针变量,23/56,#includevoid main()char c80,*p,*str=This is a string.;int i,m,n;printf(m,n=);scanf(%d,%d,8.3 指针与数组,从m位置读取n个字符送到c数组,要求位置m和长度n大于0,24/56,指针数组定义的一般形式:数据类型标识符*数组名元素个数;在这个定义中由于“”比“*”的优先级高,所以数组名先与“元素个数”结合,形成数组的定义形式,“*”表示数组中每个元素是指针类型,“数据类型标识符”说明指针的目标变量的数据类型。例如:int*ip10;char*cp5;,8.3 指针与数组,8.3.3 指针数组,1.指针数组的定义,指针数组就是数组中的每个元素均为指针类型,25/56,例如:char c48=Fortran,COBOL,BASIC,Pascal;char*cp4=c0,c1,c2,c3;,8.3 指针与数组,8.3.3 指针数组,2.指针数组初始化,26/56,char*str5=int,long,char,float,double;,27/56,【例8.13】用06分别代表星期日至星期六,当输入其中任意一个数字时,输出相应英文单词。#include void main()char*weekname7=Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday;int week;printf(Enter week No.:);scanf(%d,8.3 指针与数组,8.3.3 指针数组,3.利用字符指针数组处理多个字符串,利用字符指针数组处理长度不等的字符串,可节省存储空间。,28/56,8.4 指针变量作函数参数,主调函数与被调函数之间数据传递的方法:,实参与形参之间的数据传递;,被调函数通过return语句把函数值返回到主调函数;,通过全局变量交换数据;,利用指针型参数在主调函数和被调函数之间传递数据。,29/56,8.4 指针变量作函数参数,1.变量的指针作函数参数,【例8.17】输入3个整数,按从小到大顺序输出。void swap(int*x1,int*x2)int t;t=*x1;*x1=*x2;*x2=t;return;void main()int a,b,c;scanf(%d%d%d,7 5 9,5,7,9,7,9,7,5,7,5,通过指针形参指向域扩展到主调函数,达到主调函数与被调函数间交换多个数据的目的:形参x1和x2得到main函数中a和b的地址,这样x1和x2的目标变量就是main函数的变量a和b。在swap函数中交换*x1和*x2的内容,就是交换a和b的内容,所以当函数调用结束后,尽管x1和x2已经释放,但操作结果仍保留在main函数的变量a和b中.,30/56,8.4 指针变量作函数参数,2.数组的指针作函数参数,一维数组的指针作函数参数 例如被调函数abc的定义形式有以下三种:void abc(int b10)void abc(int b)void abc(int*b)在主调函数有如下定义:int a10,*p=a;则调用abc函数时可用:abc(a)或 abc(p),当函数之间需要传递数组时,可以通过传递数组的首地址(即通过指针参数指向域的扩展),完成存取主调函数中数组元素的操作。,31/56,8.4 指针变量作函数参数,2.数组的指针作函数参数,【例8.20】字符串复制函数。void copystr(char*t,char*s)/*字符指针变量t和s作形参*/while(*t+=*s+)!=0);void main()char c80,*p=I am a student.;copystr(c,p);/*数组名c和字符指针变量p作实参*/printf(%sn,c);,32/56,作业,P291(要求用指针完成)1341718,

    注意事项

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

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




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开