C语言中指针的用法.ppt

上传人:小飞机 文档编号:6503752 上传时间:2023-11-07 格式:PPT 页数:32 大小:298.49KB
返回 下载 相关 举报
C语言中指针的用法.ppt_第1页
第1页 / 共32页
C语言中指针的用法.ppt_第2页
第2页 / 共32页
C语言中指针的用法.ppt_第3页
第3页 / 共32页
C语言中指针的用法.ppt_第4页
第4页 / 共32页
C语言中指针的用法.ppt_第5页
第5页 / 共32页
点击查看更多>>
资源描述

《C语言中指针的用法.ppt》由会员分享,可在线阅读,更多相关《C语言中指针的用法.ppt(32页珍藏版)》请在三一办公上搜索。

1、,指 针,夏涛,5.3 指针的运算,(3)指针相减运算假设指针px和py是指向同一组数据类型相同的数据,则px-py的运算结果是两个指针间数据的个数。所以px和py之差并不是px和py两指针内所包含地址量之差,而是由如下公式计算决定:px-py=(px)-(py)/sizeof(指针的目标变量的数据类型),例:如果 px和py是指针变量 px=2048 py=1024px和py的目标变量的数据类型为double,则 px-py=(px)-(py)/sizeof(double)=(2048-1024)/8=128即px和py之间有128个double类型的数。,5.3 指针的运算,5.3.2 指

2、针的关系运算两个指向同一组相同类型数据的指针之间可以进行各种关系运算。两个指针之间的关系运算表示它们的目标变量的地址位置之间的关系。指针的关系运算应注意以下几点:两个不同数据类型的指针之间的关系运算是无意义的。指针与一般整数之间的关系运算也是无意义的。指针可以和0进行“=”或“!=”比较,用以判断其是否为空指针。,关系运算符有:小于 等于=大于等于=小于等于=不等于!=,5.3 指针的运算,例:int*px,*py;pxpypx=pypx=pypx=pypx!=py,若关系成立,表示px所指的目标变量存放的位置在py所指的目标变量存放的位置之前。,若关系成立,表示px所指的目标变量存放的位置在

3、py所指的目标变量存放的位置之后。,若关系成立,表示px所指的目标变量存放的位置在py所指的目标变量存放的位置相同。,若关系成立,表示px所指的目标变量存放的位置在py所指的目标变量存放的位置之后或相同。,若关系成立,表示px所指的目标变量存放的位置在py所指的目标变量存放的位置之前或相同。,若关系成立,表示px所指的目标变量存放的位置在py所指的目标变量存放的位置不同。,5.3 指针的运算,5.3.3 指针的赋值运算对指针可以进行赋值运算,所赋的值一定是地址量,一般不能是数据。赋值形式有以下几种:可以把一个变量的地址赋给与其具有相同数据类型的指针。例:int x,*px;px=,5.3 指针

4、的运算,其他常用的赋值运算设px和py是具有相同数据类型的两个指针,则以下赋值是合法的。px=py+n;px=py-n;px+=n;px-=n;n是地址量。对指针的目标变量的赋值对指针的目标变量所赋的值一定是数据。要注意数据类型的统一。例:int x,*p,y;p=最后y=5,返回主菜单,5.4.1 指向数组的指针5.4.2 指向数组的指针的应用,5.4 指针与数组,5.4 指针与数组,返回主菜单,5.4 指针与数组,5.4.1 指向数组的指针数组名就是数组元素的首地址,数组元素是连续存放在一片内存空间中,C语言可以用指针访问数组的元素。用指针访问数组的元素的作法是,根据前面所述的数组、指针的

5、概念,首先定义一个数组和指针并使指针指向该数组,例如:float x10,*px;px=x;px=下标法(用下标符):引用数组某元素的方法是:ai。例如:a0,a1a9。地址法:引用数组某元素的方法是:*(a+i)。例如:*(a+0),*(a+1),*(a+9)。指针法(用指针运算符):引用数组某元素的另一种方法是:*(pa+i)。例:*(pa+0),*(pa+1),.*(pa+9).用指针加下标的方法引用数组某元素:pai。例如:pa0,pa1,pa9。,5.4 指针与数组,说明:1、虽然上述的三种方法都能输出同样的结果,但它们的效率是不同的。用下标法访问数组时,是转换成地址法处理的,即先计

6、算出数组元素的地址,然后再找到它指向的存储单元,读出或写入它的值。而用指针变量指向数组元素时则不必每次计算数组元素地址。2、使用指针访问数组元素时,完全根据地址来访问,而不作“下标是否越界”的检查。3、使用指向数组元素的指针变量时,应当注意指针变量的当前值。例如:int a5;p=a;for(i=0;i5;i+)scanf(“%d”,p+);,5.4 指针与数组,int a10,*p;p=a;,2000200220042006200820102012201420162018,&a0&a1&a2&a3&a4&a5&a6&a7&a8&a9,a+0a+1a+2a+3a+4a+5a+6a+7a+8a+

7、9,p+0p+1p+2p+3p+4p+5p+6p+7p+8p+9,a0a1a2a3a4a5a6a7a8a9,p0p1p2p3p4p5p6p7p8p9,*(a+0)*(a+1)*(a+2)*(a+3)*(a+4)*(a+5)*(a+6)*(a+7)*(a+8)*(a+9),*(p+0)*(p+1)*(p+2)*(p+3)*(p+4)*(p+5)*(p+6)*(p+7)*(p+8)*(p+9),p+i a+I&ai 地址 内存 ai pi*(a+i)*(p+i),a,5.4 指针与数组,指针和数组在使用时应注意以下几点:用指针名和数组名在访问地址中的数据时,它们的表达形式是等价的,因为指针名和数组

8、名都是地址量。例如:int x10,*px=x,i;引用数组x10中的某个元素,可以这样作:xi、pxi、*(x+i)、*(px+i)它们的作用是等效的。指针名和数组名在本质上是不同的。指针是地址变量,其值可以发生变化,可以对其进行赋值和其它的运算。指针的以下运算是合法的:int x10,*px,n;px=x;px+;px-;px+=n;,5.4 指针与数组,数组名是地址常量,不能对其进行赋值和其它运算。下面的操作是非法的:int x10,b=2;x+;x-;x=b;指针在使用前必须赋初值,而数组名不需要赋初值。,5.4.2 二维数组的指针表示方法一个二维数组可以认为由若干个一维数组所组成,其

9、中每一个一维数组包含若干个元素。例:int a33;a 是二维数组,共有9个元素(3 3=9),它们是:a00,a01,a02,a10,a11,a12。a20,a21,a22。其全部元素数值均为 int 型。,5.4 指针与数组,分析二维数组名a和a0、a1、a2的关系数组名a就是数组的起始地址。a+1是在a的基础上加上一行的字节数。一个二维数组可以认为由若干个一维数组组成。对数组名a而言,它的每一个“元素”是一行而不是一个基本元素,因此a0、a1、a2只是一个地址。它们代表的是每一行起始元素的地址,也就是每行的第一列元素的地址。,5.4 指针与数组,a+0,二维数组的地址有行地址和列地址的区

10、别,那么如果设指针变量,也应该确定是指向行还是指向列,二者不能混淆。,#include“stdio.h”main()static int a35=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15;printf(%d,%d,%dn,a,a+1,a+2);printf(%d,%d,%d,%dn,*a,*a+1,*a+2,*a+3);printf(%d,%d,%d,%dn,*(a+1),*(a+1)+1,*(a+1)+2,*(a+1)+3);printf(%d,%d,%d,%dn,*(a+2),*(a+2)+1,*(a+2)+2,*(a+2)+3);printf(%d,%d,%

11、dn,运行程序,404,414,424(第0,1,2行的行地址)404,406,408,410(第0行的4个元素的地址)414,416,418,420(第1行的4个元素的地址)424,426,428,430(第2行的4个元素的地址)404,414,424(第0,1,2行的行地址)404,406,408,410(第0行的4个元素的地址)404,406,408,410(第0行的4个元素的地址)404,414,424(第0,1,2行的行地址)8,8,8(第1行第2列元素的值),12-3,例:5-7(此例中没有应用指针变量)把数组x 的数据复制给数组y。,main()int x5=1,2,3,4,5;

12、int y5,i;printf(nx5=);for(i=0;i5;i+)printf(%3d,*(x+i);for(i=0;i5;i+)yi=xi;printf(ny5=);for(i=0;i5;i+)printf(%3d,*(y+i);,运行程序,x5=1 2 3 4 5y5=1 2 3 4 5,main()int y5,x5=1,2,3,4,5;int*px=x,*py=y,i;printf(nx5=);for(i=0;i5;i+)printf(%3d,*(px+i);for(i=0;i5;i+)=;printf(ny5=);for(i=0;i5;i+)printf(%3d,*(py+i)

13、;,例:5-8(此例中应用了指针变量),*(py+i)=*(px+i),12-7,字符串指针 字符串指针的应用,5.5 字符指针和字符串,5.5 字符指针和字符串,返回主菜单,5.5 字符指针和字符串,5.5 字符指针和字符串 类型为char的指针称为字符指针。字符指针是C语言中常用的指针类型,几乎所有字符串操作都是通过字符指针来实现的。一般情况下,字符指针都是指向字符串,所以字符指针也称为字符串指针。字符串指针(1)字符串指针。字符串指针是指指向字符串的指针。例如:char str20,*ps;ps=str;(2)在指针定义的同时进行初始化 例如:char str20=“program”;c

14、har*ps=str;char*p=“string”;用一个字符串常量给字符串指针初始化。char*pp=p;用一个已初始化的指针来初始化另一个指针。字符指针的初始化就是将字符串的首地址赋给指针,这类似于数组的指针的初始化,不是将字符串本身复制到指针中。字符串指针初始化就是使指针指向该字符串。,5.5 字符指针和字符串,(3)用赋值语句给字符串指针赋值 例如:char*s;s=“string”;把字符串string的首地址赋给指针变量s。在实际编程中,常用字符指针来处理字符串。因此,要熟练掌握字符串指针。(4)字符串的输出 字符串的输出有两种方法:用字符数组名直接输出字符串 例如:main()

15、static char string=“I love China!”;printf(“%sn”,string);对于数值型数组,不能企图用数组名、数组指针直接输出其全部元素。用字符指针变量直接输出字符串 例如:main()char*string=“I love China!”;printf(“%sn”,string);,例:5-11 将字符串a中的数据复制到字符串b中。,main()char a=University,b50;int i;for(i=0;ai)!=0;i+)bi=ai;bi=0;printf(”string a is%sn,a);printf(”string b is%sn,b

16、);printf(“string b is”);for(i=0;bi!=0;i+)printf(%cn,bi);printf(“n”);,运行程序,string a is Universitystring b is Universitystring b is University,main()char a=University,b50;int i;for(i=0;!=0;i+)=;=0;printf(”string a is%sn,a);printf(”string b is%sn,b);printf(“string b is”);for(i=0;bi!=0;i+)printf(%cn,bi)

17、;printf(“n”);,:*(a+i):*(b+i):*(a+i):*(b+i),字符串指针的应用,main()char a=University,b30;char*pa=a,*pb=b;int i;for(i=0;!=0;i+)=;=0;printf(String a is%s.n,a);printf(String b is%s.n,b);printf(String a is%s.n,pa);printf(String b is%s.n,pb);printf(String b is);for(i=0;*(pb+i)!=0;i+)printf(%c,*(pb+i);printf(.n);,

18、运行程序,String a is University.String b is University.String a is University.String b is University.String b is University.,例:5-10,:*(pa+i):*(pb+i):*(pa+i):*(pb+i),例:5-12 求字符串长度并输出该字符串。,main()int len=0;char*st=”the expense of string;while(*st+)!=0)len+;st-=len+1;printf(nlength=%d.string:%s,len,st);,运行程

19、序,length=21.string:the expense of string,例:5-13 读程序,写出输出结果。,main()char*a=I love China!;printf(n%s,a+7);,运行程序,China!,main()char*a=I love China!;a+=7;printf(n%s,a);,注意:a=7 不能用常量给指针赋值。,例:5-14 字符串复制。,运行程序,main()int i=0;char s20,buf20;char*ps=s,*pb=buf;printf(nEnter string:);scanf(%s,pb);while(*ps+=*pb+)

20、!=0)i+;printf(n%s copy%s,s,ps-i-1);,等效为:while(*(ps+i)=*(pb+i)!=0)i+;,Enter string:abcdefg abcdefg copy abcdefg,返回主菜单,指针数组的概念 指针数组的应用,5.6 指针数组,5.6 指针数组,返回主菜单,5.6 指针数组,5.6 指针数组5.6.1 指针数组的概念指针数组是一个数组,该数组是指针变量的集合,即它的每一个元素都是一个指针变量,这些指针变量具有相同的数据类型.指针数组的定义形式:数据存储类型 数据类型*数组名数组长度说明;指针数组同其他数组一样,按数组下标的次序被存放在一片

21、连续的存储空间,数组名是其所占区域的首地址.指针数组在使用前必须先定义.例如:int*p3;数组p包含三个指针元素它们是:p0,p1,p2.它们都是int类型的指针.例如:char*pc5;数组pc包含五个指针元素即:pc0,pc1,pc2,pc3,pc4.它们都是char类型的指针.指针数组的一个应用方面就是一次定义一组指针(一般这些指针都有着一定的相互关联,特别是指针之间编排次序上相互关联),5.6 指针数组,指针数组主要用于字符串的操作。用二维字符数组定义若干个字符串时,如果有一个字符串比较长,则要求列数按此长度定义,这样就会浪费许多内存单元。用二维字符数组和用指针数组初始化时,在内存中

22、的情况是不同的。用二维数组时每行的长度是相同的;而用指针数组时,并未定义行的长度,只是分别在内存中存储了长度不同的字符串,然后用指针中的元素(是指针型数据)分别指向它们。在内存中没有浪费存储单元。用指针数组处理字符串可以节省内存,而且提高运算效率。例如:想对5个姓名排序,若将字符串交换位置速度慢,而交换指针则速度快得多。,char name512,char*name5,*(a0+0)*(a0+1)*(a0+2)*(a0+3)*(a0+4)*(a1+0)*(a1+1)*(a1+2)*(a1+3)*(a1+4),*(pa0+0)*(pa0+1)*(pa0+2)*(pa0+3)*(pa0+4)*(p

23、a1+0)*(pa1+1)*(pa1+2)*(pa1+3)*(pa1+4),a0+0a0+1a0+2a0+3a0+4a1+0a1+1a1+2a1+3a1+4,pa0+0pa0+0pa0+0 pa0+0pa0+0pa0+0pa0+0pa0+0pa0+0pa0+0,a00 a01a02a03a04a10a11a12a13a14,pa00pa01pa02pa03pa04pa10pa11 pa12pa13pa14,pai+j ai+j 内存 aij paij*(ai+j)*(pai+j),int*pa2,int a25,例:5-15 输入星期的数码,输出对应的星期英文名。,main()static c

24、har*weekname=,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday;int week;while(1)printf(n Enter week No:);scanf(%d,定义了8个指针,weekname0指向空字符weekname1指向字符串Mondayweekname2指向字符串Tuesday.weekname7指向字符串Sunday,12-8,12-9,a,例:多个字符串按递增方式排序。,运行程序,#include stdio.h main()static char*monthname=illegal month,J

25、anuary,February,March,April,May,June,July,August,September,October,november,December;int gap,i,j;char*temp;int n=13;for(gap=n/2;gap0;gap/=2)for(i=gap;i=0;j-=gap)if(strcmp(monthnamej,monthnamej+gap=0)break;temp=monthnamej;monthnamej=monthnamej+gap;monthnamej+gap=temp;for(i=0;i13;i+)printf(%s n,monthn

26、amei);,返回主菜单,5.7 小 结,5.7 小结指针是C语言的一个重要概念,它是一种特殊的变量,其内容(含义)是指对象的存储地址.指针所指区域是指针目标,如果存放目标的空间也是某变量的空间,则该变量也叫指针的目标变量。如果px是指针,则*px表示该指针的目标。指针所指的对象可以是简单变量,也以是数组、结构、联合或函数等。指针在使用前应先定义,定义格式是:数据存储存储类型 数据类型*指针名,*指针名;指针在定义的同时可以初始化,初始化的形式为:数据存储存储类型 数据类型*指针名=初始值;初始化是对指针变量的初始化,不是目标变量.初始值一定是地址量,不是数据.指针可以进行算术运算、关系运算和赋值运算。其中算术运算包括指针变量与整数的加减运算,两指针变量相减运算等。,5.7 小 结,指针可以访问数组如果px是指向数组x 的指针,则xi与*(px+i)或*(x+i)是等价的表达形式。但px和x有本质的区别,px是指针变量(地址变量),x是地址常量。字符指针可以用字符串初始化,其含义是将字符串的首地址赋给指针指针数组,指针变量的集合。通过对指针数组的定义,可以定义一组指针。指针数组常用来处理多个字符串。,返回主菜单,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号