C语言程序ppt课件ch9指针.ppt
《C语言程序ppt课件ch9指针.ppt》由会员分享,可在线阅读,更多相关《C语言程序ppt课件ch9指针.ppt(90页珍藏版)》请在三一办公上搜索。
1、共 84 页 第 1 页,第九章 指 针,共 84 页 第 2 页,本 章 要 点,1.理解指针与地址的概念;2.掌握指针的定义和运算;3.掌握指向基本类型、数组、字符串的指针的使用;4.充分理解指针和数组的等价性;5.掌握指针函数和函数指针的使用;6.了解指向指针的指针的概念及其使用。,共 84 页 第 3 页,预 备 知 识,内存:就是内部存储器,是由存储单元组成 的。它的特点是存储单元是线性连续 的。存储单元的最小单位是字节。,1.内存的概念,共 84 页 第 4 页,地址:为了访问内存中的某个存储单元,我们 要为它编号,这种编号称为内存地址。通过地址我们就能够访问该地址所标 识的存储单
2、元。,2.地址的概念,共 84 页 第 5 页,变量的地址:变量的地址是变量在内存中占用连续字节的首地址。,2007,存储单元,共 84 页 第 6 页,以往对变量的访问:定义变量:int k;编译系统根据类型为k分配内存。输入变量的值:scanf(“%d”,通过指针间接访问:C提供了另一种方式,将变量 k的地址存放在另一个变量处(假定为pk),通过访问 pk,就可以间接地访问变量 k,这种方式称为间接访问。,变量的存取方法:直接存取和间接存取。,共 84 页 第 7 页,引入指针程序设计的优点,有效表示复杂的数据结构。方便使用字符串、数组。可以得到多个返回值。可以进行动态分配内存。程序简洁、
3、紧凑,执行效率高。,共 84 页 第 8 页,9.1.1 指针的基本概念,指针:一个变量的地址称为该变量的指针。指针变量:若一个变量专用于存放另一个变量的地址(指针),则称此变量为指针变量。若指针变量p的值等于变量x的地址,则说指针变量p指向变量x。,1000,35,1000,p,x,x的值,p的值,X的内存地址,9.1 指针的基本概念及指针变量的定义,共 84 页 第 9 页,指针的对象:当把变量的地址存入指针变量后,就可以说这个指针指向了该变量。,共 84 页 第 10 页,9.1.2 指针变量的定义,指针变量定义的一般形式:类型标识符*标识符,例:float*p1;int*p2;作用:定
4、义变量为指针类型,使之专门用于存放地址。,指针所指的变量的类型,指针变量名,共 84 页 第 11 页,说明:,(1)*用于定义指针变量,但指针变量名不带*。如 int*p1;float*p2;定义的指针变量为p1,p2(2)一个指针变量只能指向同一类型的变量。如 p1 只能用于指向整型变量 p2 只能用于指向实型变量(3)无论指针变量指向何种类型,指针变量本身都是整型的,指针变量本身也有自己的地址,占两个字节的存储空间。,共 84 页 第 12 页,1.取地址运算&,格式:让p指向b,使q指向a,p指向b,9.2 指针变量的引用和运算,C语言提供两种与指针有关的运算符:&*,共 84 页 第
5、 13 页,2.取内容运算*,格式:*指针表达式设p是一个指针表达式,则:(1)若*p出现在赋值号左边,表示给p所指变量赋值(2)若*p不出现在赋值号左边,表示p所指变量的值 若有变量说明:int a,*p;p=给变量a输入值*p+25 等价于a+25,共 84 页 第 14 页,3.为指针变量赋初值,指针变量使用前必须有值,指针变量的初值必须是地址值(不能是整数),方法:,在说明指针变量时同时初始化 int a,*p=,可以为指针赋空值(NULL),此时指针不指向任何 变量,如 p=NULL或 p=0;p=0;(p为空指针),共 84 页 第 15 页,对*及&的说明:(同级运算,由右向左)
6、,若pa=&a(将 a 的地址送指针变量pa),则&*pa&(*pa)&(a)&a*&a*(&a)*pa a(*pa)+a+*pa+*(pa+)(先取*pa值,然后使pa加1)*+pa*(+pa)(先使pa加1,再取*pa值),注意:此时pa不再指向a,共 84 页 第 16 页,例 9-1 输出变量的值。main()int a,b;int*pa,*pb;a=100;b=10;pa=,定义指针变量pa,pb,将a的地址送pa,将b的地址送pb,输出所指向的变量,运行结果为100,10100,10,共 84 页 第 17 页,例9-2将两个整型数a,b按由大到小次序输出。,main()int*p
7、1,*p2,*p,a,b;scanf(“%d,%d”,注意:a和b并未交换,但p1和p2的值交换了,运行情况:5,9a=5,b=9larger=9,little=5,共 84 页 第 18 页,在C语言中,凡是可以通过数组下标方式完成的访问(操作)均可以通过指针方式实现。称为指针方式。,9.3指针与数组,数组中的每个元素都可以通过下标唯一确定,即通过下标可以访问(操作)数组中的元素,称为下标方式。如ai,访问数组的两种方式:下标方式,指针方式.,C语言规定:数组名就是数组的首地址常量.,于是:,a=&a0,语言系统内部处理机制,指针方式效率高,共 84 页 第 19 页,int a10,*p;
8、p=a;(等价于 p=2.通过指针引用数组引用数组元素可以用下标法,也可以用指针法,即通过指向数组元素的指针变量找到所需元素。,P=&a0,1.数组元素的指针,9.3.1 指针变量与一维数组之间的联系,共 84 页 第 20 页,9.3.2 指针的运算,1.指针表达式与整数的加减运算形式:p+n 或 p-n其中:p是任意一个指针表达式,n 是任何一种整型表达式计算规则:表达式p+n的值=p的值+p所指类型长度*n 表达式p-n的值=p的值-p所指类型长度*n说明:只有当p和p+n或p-n都指向连续存放的同类型数据区域(数组)时,指针加、减才有实际意义。C语言规定:表达式p+n和p-n的类型与p
9、相同。,共 84 页 第 21 页,p,a,p+1,a+1,p+9,a+9,p+i,a+i,a0,a1,a2,ai,a9,a数组,例如:int a10,*p;p=a;,*(p+i),共 84 页 第 22 页,例如:设有变量定义:int a10,*p,*q;则p=a p指向a0q=a+6 q指向a6p=q-4 p指向a2,3,4,12,11,5,6,7,8,9,10,p=a,a0,a6,a9,q=a+6,q-4,1000,共 84 页 第 23 页,2.指针自增自减运算,语法:p+;p-;+p;-p;进行+p或p+运算后都使p指向下一个数据 p+与+p的区别:表达式p+的值等于p的原来值;表达
10、式+p的值等于p的新值;取内容运算符“*”、取地址运算符“&”和自增自减运算符都是单目运算符,运算的优先级相同,结合方向都是自右至左。,例如:int a=1,2,3,4,5,*p,*q;p=q=a?变成100,a3,a4,共 84 页 第 24 页,把值为0的指针变量称作空指针变量。空指针变量表示不指向任何地方,表示指针变量的一种状态。p=0;p=0;p=NULL;三个语句等价。其中p为指针变量;0的ASCII码值为0;NULL是在“stdio.h”文件中定义的符号常数,其值为0,代表地址0和空指针的概念。如果给空指针变量所指内存区域赋值,将会得到一个出错信息。,3.空指针,共 84 页 第
11、25 页,p-2,p-1,p,p+1,p+2,.,.,p-3,当两个指针指向同一个数组中的元素时,才能进行、=、=、!=、=的关系运算。,任何指针p与NULL进行“P=NULL”或“P!=NULL”运算均有意义:判断指针 p 是否指向空。,4.指针的关系运算,指针的关系运算只有同类指针进行比较才有意义,共 84 页 第 26 页,p=q 两指针指向同一元素时为 1,反之为0。,p!=q 两指针不指向同一元素时为 1,反之为0。,假定指针p 和q指向同一个数组,则:,pq p指针所指元素位于q所指元素之后时为1,反之为0。,p=q p指针所指元素位于q所指元素之后(或两指针指向同一元素)时为1,
12、反之为0。,=和!=运算符,比较的是两个指针表达式是否指向同一个内存单元;、=,比较的是两个指针所指内存区域的先后次序语法格式:指针表达式 关系运算符 指针表达式,例:int a10;int*p=a,*q=a+3;判断以下表达式的值p=&a0 p=&a1 p=q p+4=q+2 pa+2 pq,共 84 页 第 27 页,5.同类指针相减,同类指针相减时,两个指针应该指向连续存放的同类数据区域。语法:p-q 说明:p-q 的值,等于(p的值-q的值)/所指类型长度,即p,q两个指针之间数据元素的个数。例如:若有 int a10,*p,*q;p=a;q=则p-q=5 表示p,q之间数据元素的个数
13、是5。,共 84 页 第 28 页,格式:(类型名*)指针表达式功能:将指针表达式的值转换成指定类型的指针。例如:int*p;double d,*q=,6.强制类型转换运算,共 84 页 第 29 页,9.3.3 通过指针引用数组元素,引用数组中的元素可以用以下方法:下标法:如 a3,ai 指针法:即通过指向数组元素的指针找到所需的元素.这种方法占内存少,运行速度快,程序代码质量高。假设p已定义为指针变量,并已赋了一个地址,它指向某一个数组元素.且有赋值语句p=则:p+1 表示数组中的下一个元素,a+i和p+i都是ai 的地址,或者说它们指向ai.*(a+i)或*(p+i)是a+i或p+i所指
14、向的数组元素。指向数组的指针变量也可带有下标,如pi与*(p+i)等价。,对下标为i的元素访问:ai,*(a+i),*(p+i),pi对ai的地址表示:&ai,a+i,p+i,&pi,共 84 页 第 30 页,例:用三种方法输出数组全部元素。,下标法:main()int a10,i;for(i=0;i10;i+)scanf(“%d”,地址法(通过数组名计算数组元素地址)for(i=0;i10;i+)printf(“%5d”,*(a+i);指针法for(p=a;p(a+10);p+)printf(“%5d”,*p);,共 84 页 第 31 页,例9-3 用指针访问数组元素。,main()in
15、t a10,*pa,i;for(i=0;i10;i+)ai=i+1;pa=a;for(i=0;i10;i+,pa+)printf(“%d”,*pa);printf(“n”);,不要忘记赋初值,如何修改程序可以完成功能?,共 84 页 第 32 页,例9-4 给定10个整数,求最大值。,main()int a10=5,7,3,6,2,1,8,9,4,0;int i,*p,max;p=a;max=*p+;for(i=1;imax)max=*p;printf(“max=%dn”,max);,问题:如果修改语句for(i=1;imax)max=*p+;能实现程序功能吗?,问题:如果修改语句for(;p
16、max)max=*p;能实现程序功能吗?,共 84 页 第 33 页,9.3.4 字符串指针与字符串,1.字符串的表示形式 用字符数组表示,如:main()char string=“I love China!”;printf(“%sn”,string);,数组名,用字符指针实现,如:mian()char*string=“I love China!”;printf(“%sn”,string);,把“I love China!”的首地址赋给指针变量string,特点:字符串的长度不受限制;字符指针指向别处,字符串将失踪.,共 84 页 第 34 页,2.字符指针变量与字符数组的比较,字符数组由若干
17、个元素组成,每个元素中放一个字符,而字符指针变量中存放的是字符串的首地址。赋值方式:char str=“I am a boy!”或:char str20;scanf(“%s”,str);字符指针变量指向字符串首地址。赋值方法三种:(1)char*pa=“I am a boy!”(2)char*pa;pa=“I am a boy!”(3)char*pa,str20;pa=str;scanf(“%s”,pa);,共 84 页 第 35 页,例9-5 已知下面程序的输出结果:ABCDCD,请完善程序:main()char*chp=“ABCD”;for(;_A_;chp=chp+2)printf(“%
18、s”,_B_);printf(“n”);,A.*chp!=0,B.chp,共 84 页 第 36 页,作用:函数的参数不仅可以是整型、实型、字符型,还可以是指针型,它的作用是将一个变量的地址传送到另外一个函数中。,9.4 指针与函数,9.4.1 指针变量作函数参数,共 84 页 第 37 页,例:交换两个变量的值。注意函数调用形实结合方式.,swap(x,y)int x,y;int t;t=x;x=y;y=t;,main()int a,b;scanf(“%d,%d”,单向值传递!,调用函数时a的值传送给x,b值传送给y,可是执行完函数后,x和y的值是互换了,但a,b的值并未互换。,共 84 页
19、 第 38 页,swap(int*p1,int*p2)int p;p=*p1;*p1=*p2;*p2=p;,main()int a,b;int*pa,*pb;scanf(“%d,%d”,运行情况:5,99,5,交换指针所指向的变量的值,分析观察使用指针做形参和实参的结果,例:将两个数按从大到小顺序输出(交换两个变量的值)。,结论:被调用函数不能改变实参指针变量的值,但可以改变实参指针变量所指向的变量的值。,共 84 页 第 39 页,函数调用过程如下图所示:,调用swap函数之前:,共 84 页 第 40 页,执行函数语句,p1、p2所指向的变量的值相互交换,*p1,*p2,共 84 页 第
20、41 页,函数调用结束后,p1、p2所占用的内存单元被释放,,共 84 页 第 42 页,swap(int*p1,int*p2)int*p;p=p1;p1=p2;p2=p;,main()int a,b;int*pa,*pb;scanf(“%d,%d”,C语言中,实参和形参间的数据是单向值传递方式。指针做函数参数也遵循该原则.,改变指针形参的值,也不能改变指针实参的值.,结果为:?,交换了两个指针中的内容。,共 84 页 第 43 页,9.4.2 数组名作函数参数,当用数组名作为参数时,如果形参数组中元素的值发生变化,实参数组元素的值也随之变化,为什么?若有一个实参数组,想在函数中改变此数组的元
21、素的值,实参与形参的对应关系有以下4种情况:形参与实参都用数组名 实参用数组名,形参用指针变量 实参形参均用指针变量 实参为指针变量,形参为数组名,都是地址传递,只是形式不同!,共 84 页 第 44 页,指针作函数参数应注意的问题,指针变量在作实参时,必须有确定的值,即指向一个已定义的单元。如:main()int*p;f(p,10);int f(int x,int n),如何修改?,共 84 页 第 45 页,例9-6:用选择法对10个整数由小到大排序。方法1:形参和实参都用数组名(在函数中介绍的),main()int i,a10;void sort();for(i=0;i10;i+)sca
22、nf(%d”,void sort(int x,int n)int i,j,t;for(i=0;ixj)t=xi;xi=xj;xj=t;,形参是数组名,实参也是数组名,共 84 页 第 46 页,方法2:形参是数组名,实参是指针变量。,main()int*p,i,a10;void sort();p=a;for(i=0;i10;i+)scanf(%d,p+);sort(p,10);for(p=a,i=0;i10;i+)printf(%d,*p+);,void sort(int x,int n)int i,j,t;for(i=0;ixj)t=xi;xi=xj;xj=t;,p=a;,形参是数组名,实参
23、是指针,当用数组名作函数参数时,由于数组名代表的是数组首元素地址,因此传递的是地址,所以要求实参为指针变量。,共 84 页 第 47 页,方法3:实参是数组名,形参是指针变量。,void sort(int*x,int n)int i,j,t;for(i=0;i*(x+j)t=*(x+i);*(x+i)=*(x+j);*(x+j)=t;,实参是指针,main()int i,a10;void sort();for(i=0;i10;i+)scanf(%d”,形参是指针,实参是数组名,共 84 页 第 48 页,方法4:实参和形参都是指针变量。,void sort(int*x,int n)int i,
24、j,t;for(i=0;i*(x+j)t=*(x+i);*(x+i)=*(x+j);*(x+j)=t;,实参是指针,main()int*p,i,a10;void sort();p=a;for(i=0;i10;i+)scanf(%d,p+);p=a;sort(p,10);for(p=a,i=0;i10;i+)printf(%d,*p+);,实参也是指针,形参是指针,共 84 页 第 49 页,例9-7 编写函数,删除字符串中的给定字符。delete(char d,char f)int j=0,k=0;while(dj!=0)if(dj!=f)dk+=dj;j+;dk=0;,共 84 页 第 50
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 程序 ppt 课件 ch9 指针
链接地址:https://www.31ppt.com/p-6503963.html