第十二章指针.ppt

上传人:本田雅阁 文档编号:2584563 上传时间:2019-04-12 格式:PPT 页数:59 大小:264.51KB
返回 下载 相关 举报
第十二章指针.ppt_第1页
第1页 / 共59页
第十二章指针.ppt_第2页
第2页 / 共59页
第十二章指针.ppt_第3页
第3页 / 共59页
亲,该文档总共59页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《第十二章指针.ppt》由会员分享,可在线阅读,更多相关《第十二章指针.ppt(59页珍藏版)》请在三一文库上搜索。

1、第十二章 指针,第十二章 指针,12.1 指针与指针变量,如:int a=1, b=2; float x=3.4, y = 4.5 ; double m=3.124; char ch1=a, ch2=b;,变量ch2,一个地址唯一指向一个内存变量,我们称这个地址为变量的指针。如果将变量的地址保存在内存的特定区域,用变量来存放这些地址,这样的变量就是指针变量,通过指针对所指向变量的访问,也就是一种对变量的“间接访问”。,第十二章 指针,设一组指针变量pa、pb、px、py、pm、pch1、pch2,分别指向上述的变量a、b、x、y、m、ch1、ch2,指针变量也同样被存放在内存,二者的关系如图:

2、,12.1 指针与指针变量,第十二章 指针,指针定义的格式: 类型说明符 *指针名; *表示这是一个指针变量, 变量名即为定义的指针变量名; 类型说明符表示本指针变量所指向的变量的数据类型,也就是说一个指针变量只能指向同一类型的变量。 如:int *p1; 表示p1是一个指针变量,它的值是某个整型变量的地址。或者说p1指向一个整型变量。至于p1究竟指向哪一个整型变量,应由向p1赋予的地址来决定。,12.2 指针变量的定义与引用 一、指针变量的定义,第十二章 指针,赋值形式: & 变量名; :取地址符 &a表示变量a的地址,&b表示变量b的地址。变量本身必须预先说明。 指针变量同普通变量一样,使

3、用之前不仅要定义说明,而且必须赋予具体的值。未经赋值的指针变量不能使用,否则将造成系统混乱,甚至死机。 指针变量的赋值只能赋予地址,决不能赋予任何其它数据,否则将引起错误。,12.2 指针变量的定义与引用 二、指针变量的赋值,第十二章 指针,设有指向整型变量的指针变量p,如要把整型变量a 的地址赋予p可以有以下两种方式: 1)指针变量初始化的方法 int a; int *p=&a; 2)赋值语句的方法 int a; int *p; p=&a; 不允许把一个数赋予指针变量,下面的赋值是错误的: int *p; p=1000; 被赋值的指针变量前不能再加“*”说明符,如写为*p=&a 也是错误的。

4、,12.2 指针变量的定义与引用 二、指针变量的赋值,第十二章 指针,指针变量只能进行赋值运算和部分算术运算及关系运算。 (1)取地址运算符&:是单目运算符,其结合性为自右至左,其功能是取变量的地址。 (2)取内容运算符*:是单目运算符,其结合性为自右至左,用来表示指针变量所指的变量。在“*”运算符之后跟的变量必须是指针变量。 注意:在指针变量说明中,“*”是类型说明符,表示其后的变量是指针类型。而表达式中出现的“*”则是一个运算符用以表示指针变量所指的变量。,12.2 指针变量的定义与引用 二、指针变量的运算,第十二章 指针,例12.1指针变量程序举例。 main( ) int *p1,*p

5、2,i1,i2; scanf(“%d, %d”,&i1,&i2); p1=&i1; p2=&i2; printf(“%d, %dn”,*p1,*p2); p2=p1; printf(“%d, %dn”,*p1,*p2); 若输入: 3,5 则输出: 3,5 3,3,12.2 指针变量的定义与引用 二、指针变量的运算,第十二章 指针,例12.2 从键盘输入两个整数,按由大到小的顺序输出。 main( ) int *p1,*p2,a,b,t; scanf(“%d ,%d “,&a,&b) ; p1=&a; p2=&b; if(*p1*p2) t=*p1;*p1=*p2;*p2=t; printf(

6、“%d,%dn“,a,b) ; ,12.2 指针变量的定义与引用 二、指针变量的运算,第十二章 指针,使用指针类型做函数的参数,实际向函数传递的是变量的地址。由于函数中获得了所传递变量的地址,在该地址空间的数据当函数调用结束后被物理地保留下来。因此,如果希望函数间传递的是地址,实参用变量的地址或指针变量,形参用指针变量。,12.3 指针变量做函数的参数,第十二章 指针,例12.3 利用指针变量作为函数的参数,用函数的方法再次实现上述功能。 main ( ) void change(); int *p1,*p2,a,b,*t; scanf(“%d,%d“,&a,&b) ; p1=&a; p2=&

7、b; change(p1,p2); / *函数调用* / printf(“%d,%dn“,*p1,*p2); void change(int *pt1,int *pt2) int t; if(*pt1*pt2) t=*pt1;*pt1=*pt2;*pt2=t; return; ,12.3 指针变量做函数的参数,第十二章 指针,指向数组元素的指针变量的定义与指向变量的指针变量的定义相同 如:int a10; int *p; 对该指针元素赋值: p=&a0; 把a0元素的地址赋给指针变量p,即p指向a数组的第0号元素, 数组名代表数组的首地址,也就是第一个元素的地址。因此,p=&a0;与p=a;等

8、价。,12.4 指针与数组 一、指向数组元素的指针变量的定义与赋值,第十二章 指针,在定义指针变量时可以赋给初值: int *p=&a0;它等效于: int *p; p=&a0; 定义时也可以写成: int *p=a; 它的作用是将a的首地址(即a0的地址)赋给指针变量p(而不是*p)。,12.4 指针与数组 一、指向数组元素的指针变量的定义与赋值,第十二章 指针,设p已定义为指针变量,并已给它赋了一个地址,使它指向某一个数组元素。如果有以下赋值语句: *p=1; 表示对p当前所指向的数组元素赋以一个值(值为1)。 C规定p1指向数组的下一个元素(而不是将p值简单地加1)。 如,数组元素是实型

9、,每个元素占4个字节,则p1意味着使p的原值(地址)加4个字节,以使它指向下一元素。p1所代表的地址值实际上是p1d,d是一个数组元素所占的字节数(对整型,d=2;对实型,d4;对字符型,d1)。,12.4 指针与数组 二、通过指针引用数组元素,第十二章 指针,如果p的初值为a0 ,则: (1) pi和ai就是ai的地址,或者说,它们指向a数组的第i个元素。 (2) *(pi)或*(ai)是pi或ai所指向的数组元素,即ai。 (3)指向数组的指针变量也可以带下标,如pi与*(pi)等价。 (4)当指针指向一串连续的存储单元时,可以对指针进行加上或减去一个整数,这种操作称为指针的移动。 (5)

10、指针不允许进行乘、除运算,移动指针时,不允许加上或减去一个非整数,对指向同一串连续存储单元的两个指针只能进行相减操作。,12.4 指针与数组 二、通过指针引用数组元素,第十二章 指针,例12.4从键盘输入10个整数,存放在数组中,并输出数组的全部元素。用指针变量指向数组元素。 main( ) int i,a10,*p; for (i=0;i10;i) scanf(“%d“,&ai); for(p=a;pa10;p) printf(“%4d“,*p); printf(“n“); ,12.4 指针与数组 二、通过指针引用数组元素,第十二章 指针,注意: (1)用p使p的值不断改变,这是合法的,如果

11、不用p而企图使a变化是不行的,如将上述程序的最后两行改为: for(p=a;ap10;a) printf(“%d“,*a); (2) 要注意指针变量的当前值,请看下面的程序。,12.4 指针与数组 二、通过指针引用数组元素,第十二章 指针,例12.5输出a数组的10个元素。 main ( ) int *p,i,a10; p=a; for(i=0;i 运行结果: 22153 234 0 0 30036 25202 11631 8259 8237 28483,12.4 指针与数组 二、通过指针引用数组元素,解决这个问题的办法是在第二个for循环改为如下形式: for(i=0,p=a;i10;i,p

12、) printf(“%d“,*p);,第十二章 指针,(3)注意指针变量的运算。如果先使p指向数组a(即p=a),则: p+(或p+=1),p指向下一元素a1,若再执行*p,取了元素a1的值。 *p+,由于+和*同优先级,是自右而左的结合方向,因此它等价于*(p+)。作用是先得到p指向的变量的值(即*p),然后再使p+1。 *(p+)和*+p作用不同。前者是先取*p值。然后使p移动,后者是先使p移动,再取*p。若p的初值为a(即a0),输出*(p+)时,得a0 的值,而输出*(+p),则得到a1的值。,12.4 指针与数组 二、通过指针引用数组元素,第十二章 指针,(*p)+表示p所指向元素值

13、加1,即(a0)+,如果a0=3,则执行(a0)+后,a0的值为4。注意,是元素值加1,而不是指针值加1。 如果当前p指向a数组中第i个元素,则: *(p-)相当于ai-,先取p值作“*”运算,再使p自减。 *(+p)相当于a+i,先使p自加,再作*运算。 *(-p)相当于a-i,先使p自减,再作*运算。,12.4 指针与数组 二、通过指针引用数组元素,第十二章 指针,数组名可以用作函数的实参传给形参。由于数组名是一个地址值,对应的形参就应该是数组名或一个指针变量,但该指针必须与数组类型一致。,12.4 指针与数组 三、数组名做函数参数,main ( ) f(int *arr) int arr

14、ay10 f(array) ,如:,第十二章 指针,数组名作为实参时,对应的函数首部可以写成如下三种形式: f( int *arr ) f( int arr10 ) f( int arr ),12.4 指针与数组 三、数组名做函数参数,第十二章 指针,例12.6有一个一维数组score,内存放10个学生成绩,求平均成绩。 float average(float * array) int i; float aver ,sum=0; for (i=0;i 运行结果: Average score is 83.40,12.4 指针与数组 三、数组名做函数参数,第十二章 指针,例12.7有程序如下: f

15、loat average (float *array,int n) int i; float aver,sum=0; for(i=0;in;i) sum=sumarrayi; aver=sum/n; return (aver); main ( ) float score_15=98.5,97,91.5,60,55; float score _210=67.5,89.5,99,69.5,77,89.5,76.5,54,60,99.5; printf (“Aaverage:%6.2fn“,average (score_1,5); printf (“Baverage:%6.2fn“,average

16、(score_2,10); 运行结果如下: Aaverage :80.40 Baverage :78.20,12.4 指针与数组 三、数组名做函数参数,第十二章 指针,例12.8定义长度为10的整型类型一维数组,并将数组中的元素按逆序存放后输出其值(完成逆序存放操作时,只允许开辟一个临时存储单元)。 main ( ) int i,a10; for(i=0;i10;i) scanf(“%d“,&ai); for(i=0;i10;i) printf(“%4d“,ai); printf(“n”); fun(a,10); for(i=0;i10;i)printf(“%4d“,ai); printf(“

17、n“); fun(int *a,int n) int i,j,t; for(i=0,j=n1;ij;i,j) t=ai;ai=aj;a=j=t; ,12.4 指针与数组 三、数组名做函数参数,第十二章 指针,例12.9已知一维数组中存放互不相同的10个整数,从键盘输入一个数,从数组中删除与该值相同的元素中的值。 main ( ) int i,t,a 10=2,4,1,6,5,9,7,0,8,3; for(i=0;i10;i) printf(“%4d“,ai); printf(“nlnput t:n”); scanf(“%d“,&t); del(a,t); for(i=0;i9;i) print

18、f(“%4d“,ai); printf(“n“); del(int a10,int t ) int i,j; for(i=0;i10;i) if(t= ai) break; for(j=i;j9;j) aj=aj1; ,12.4 指针与数组 三、数组名做函数参数,第十二章 指针,例12.10用选择法对10个整数按由小到大顺序排列。 main( ) int i,a10; for(i=0;i10;i) scanf(“%d”,&ai); sort(a,10); for(i=0;i10;i) printf(“%d”,ai); printf(“n“); sort (int p ,int n) int i

19、,j,k,temp; for(i=0;in1;i) k=i ; for(j=k1;jn;j) if(pjpk) k=j; temp=pi;pi=pk;pk=temp; ,12.4 指针与数组 三、数组名做函数参数,第十二章 指针,例12.11假定a数组中已存放由小到大顺序排序的10个数,在a数组中插入一个数,插入后数组中的数仍有序。 main ( ) int I,x,a 11=1,3,5,7,9,11,13,15,17,19; printf(“Input x:n”); scanf(“%d“,&x); for(i=0;i=i;j) aj1=aj; ai=x; ,12.4 指针与数组 三、数组名做

20、函数参数,第十二章 指针,例12.12求一维数组中值最大的那个元素的值,以及其所在的位置。 main ( ) int i,k,max; int a10=3,4,9,1,7,6,10,10,5,2; for(i=0;i10;i) printf(“%d“,ai); printf(“n”); max=find(a,&k); printf(“max=%d,k=%dn“,max,k); find(int a10,int *k) int i,max; max=a0; *k=0; for(i=0;i10;i) if(maxai) max=ai;*k=i; return max; ,12.4 指针与数组 三、

21、数组名做函数参数,第十二章 指针,设已定义二维数组a: int a34=1,3,5,7,9,11,13,15,15,17,19,21,23; (1)a是二维数组名,是二维数组的起始地址(设地址为2000)。即,a指向a数组第0行,a也是0行首地址。 (2)a1是a数组第1行首地址,或者说a1指向第1行(地址为2008)。 (3)a0,a1,a2是二维数组中三个一维数组(即三行)的名字,因此它们也是地址(分别是0行,1行,2行的首地址)。 (4)ai+j是i行j列元素的地址,*(ai+j)是i行j列元素的值。 (5)ai与*(ai)无条件等价,这两种写法可以互换。,12.4 指针与数组 四、指向

22、多维数组的指针和指针变量,第十二章 指针,(6)aij,*(aij),*(*(ai)j)都是i行j列元素的值。 (7)区别行指针与列指针的概念。例如a1和a1都代表地址2008。但a1是行指针。它指向一个一维数组。a1(即*(a1)是列指针,它指向一个元素,它是1行0列元素的地址。 (8)可以定义指向一维数组的指针变量, 如: int (*p)4; /*称p为行指针*/ 定义p为指向一个含4个元素的一维数组的指针变量。,12.4 指针与数组 四、指向多维数组的指针和指针变量,第十二章 指针,main ( ) int a34; int * p1,(*p2)4; p1=&a34; /*p1是列指针

23、*/ p2=a1; /*p2是行指针*/ 不能写成: p1=a1;p2=&a34; /*类型不一致*/,12.4 指针与数组 四、指向多维数组的指针和指针变量,第十二章 指针,12.5 字符串的指针和指向字符串的指针变量 一、字符串的表示形式,可以用两种方法实现一个字符串: 1.用字符数组实现 例12.13用字符数组实现的示例。 main ( ) char string = “ I love China! “; printf(“%sn“,string); string是数组名,它代表字符数组的首地址,第十二章 指针,2.用字符指针实现 可以不定义数组,而定义一个字符指针。用字符指针指向字符串中

24、的字符。 例12.14用字符指针实现的示例。 main ( ) char *string= “ I love China! “; printf(“%sn“,string); 注意:在内存中,字符串的最后被自动加了一个0 ,因此在输出时能确定字符串的终止位置。通过字符数组名或字符指针变量可以输出一个字符串,而对一个数值型数组,是不能企图用数组输出它的全部元素的,只能逐个元素输出。,12.5 字符串的指针和指向字符串的指针变量 一、字符串的表示形式,第十二章 指针,例12.15将字符串a复制到字符串b(用指针变量来处理)。 main ( ) char a = “I am a boy. “,b20,

25、*p1,*p2; int i; for(p1=a,p2=b;*p1!= 0;p1,p2) *p2=*p1;/*只复制有效字符*/ *p2=0; /*赋字符串结果标志*/ printf (“String a is :%sn“,a); printf (“String b is :%sn“,b); ,12.5 字符串的指针和指向字符串的指针变量 一、字符串的表示形式,第十二章 指针,字符数组与字符指针变量的区别: (1)字符数组由若干个元素组成,每个元素存放一个字符,而字符指针变量中存放的是地址(字符串的首地址),决不是将字符串放到字符指针变量中。 (2)对字符数组只能对各个元素赋值,不能用以下办法

26、对字符数组赋值。 char str14; str=“I love China!“; 而对字符指针变量,可以采用下面方法赋值: char *a; a=“I love China! “; 但注意赋给a的不是字符串,而是字符串的首地址。,12.5 字符串的指针和指向字符串的指针变量 二、字符指针变量与字符数组,第十二章 指针,(3)对字符指针变量赋初值时: char *a=“I love China! “; 等价于: char *a; a=“I love China! “; 而对数组初始化时: char str14= “ I love China! “; 不等价于: char str14; str

27、=“I love China! “; 即数组可以在变量定义时整体赋初值,但不能在赋值语句中整体赋值。,12.5 字符串的指针和指向字符串的指针变量 二、字符指针变量与字符数组,第十二章 指针,(4)在定义一个数组时,在编译时即已分配内存单元,有固定的地址。而定义一个字符指针变量时,给指针变量分配内存单元,在其中可以存放一个地址值,也就是说,该指针变量可以指向一个字符型数据,但如果未对它赋以一个地址值,则它并未具体指向哪一个字符数据。如: char str 10; scanf (“%s“,str); 是可以的,而下面的形式是错误的: char * a; scanf(“%s”,a); (5)指针变

28、量的值是可以改变的。,12.5 字符串的指针和指向字符串的指针变量 二、字符指针变量与字符数组,第十二章 指针,例12.16程序示例。 main ( ) char a=“I love China! ”; /*a指向存放字符I的存储单元*/ a=a7; /*a指向存放字符C的存储单元*/ printf(“%s“,a); /*将输出China! /* 数组名代表一个固定的地址,它的值是不能改变的。 说明:定义一个指针变量并使它们指向一个字符串后,也可以用下标形式引用指针所指的字符串中的字符(与前面介绍的数组类似)。,12.5 字符串的指针和指向字符串的指针变量 二、字符指针变量与字符数组,第十二章

29、 指针,(6) 不要随意使用无确定指向的指针。有时为了防止无确定指向的指针破坏有用数据,给暂时不用的指针赋NULL。 如: int *p;p=NULL; 其中NULL是在文件stdio.h中定义的符号常量,它的代码值为0,这时称p为空指针。 以下三种写法等价: p=NULL; p=0; p=0; 使用NULL时,应在程序的开头加#include。当企图通过空指针访问一个存储单元时,将显示一个出错信息。,12.5 字符串的指针和指向字符串的指针变量 二、字符指针变量与字符数组,第十二章 指针,将一个字符串从一个函数传递到另一个函数,可以用地址传递的办法,即用字符数组名或用指向字符串的指针变量作参

30、数。和数组一样,函数的首部有三种说明形式,而且形参也是指针变量。在被调用的函数中可以改变字符串的内容,在主调函数中可以得到改变了字符串。,12.6 字符串指针做函数参数,第十二章 指针,例12.17将字符数组中的字符串按逆序存放后输出。 #include #include main( ) int i,j; char ch 80; gets(ch);puts (ch); j=strlen (ch)1; fun(ch,j); puts (ch); fun (char *p,int j) int i; char t ,*q; q=pj; for( ;pq ;p,q) t=*p;*p=*q;*q=t;

31、 运行结果是: asdfgh回车 asdfgh hgfdsa,12.6 字符串指针做函数参数,第十二章 指针,例12.18从键盘输入一个字符串,计算该字符串的长度。不要用strlen函数。 #includestdio.h main ( ) int len; char a 80; gets (a); puts (a); len=lenth(a); printf(“%dn“,len); lenth(char *p) char *q=p; /* p和q都指向数组a*/ while (*q!= 0) q; /*只移动q,p不变*/ return qp; /*qp表示共移动几个存储单元*/ 运行结果是

32、asdfgh回车 asdfgh 6,12.6 字符串指针做函数参数,第十二章 指针,例12.19编一程序,将两个字符串连接起来。不要用strcat函数。 #includestdio.h main ( ) char sl 80 ,s240; printf(“n Input string1: “); gets(s1); printf(“n Input string2:); gets(s2); scat(s1,s2); printf(“n New string:%s“,s1); scat(char *s1, char *s2) while(*s1!=0) s1; while(*s2!=0) *s1=

33、*s2;s1 ;s2; *s1=0; 运行情况:Input string 1:country回车 Input string 2:side 回车 New string :countryside,12.6 字符串指针做函数参数,第十二章 指针,例12.20编写一个程序,将字符数组from中的全部字符拷贝到字符数组to中。不要用strcpy函数。拷贝时,0也要拷贝过去。0后面的字符不拷贝。 #includestdio.h #includestring.h main ( ) char from 80 ,to80; printf(“Input,string:“); scanf(“%s,from); st

34、rcopy(from,to); printf(“Copied string:%s/n“,to); strcopy(char *from,char *to) int i; for(i=0;i=strlen (from);i) toi=fromi; 运行结果: Input string:student回车 Copied string :student,12.6 字符串指针做函数参数,第十二章 指针,例12.21编写一个程序,比较字符数组s1和s2。不要用strcmp函数。 #includestdio.h main ( ) int a; char s180,s280; gets (s1);gets(

35、s2);puts(s1);puts(s2); a=strcomp(s1,s2); if(a0) printf(“(s1:%s)(s2:%s)n“,s1,s2); if(a= = 0) printf(“(s1:%s)=(s2:%s)n“,s1,s2); if(a0) printf(“(s1:%s)(s2:%s)n“,s1,s2); strcomp(char *s1,char *s2) while(*s1= = *s2&. *s1!= 0) s1;s2; return *s1*s2; 运行结果是:boy回车 girl回车 boy girl (s1:boy)(s2:girl),12.6 字符串指针做

36、函数参数,第十二章 指针,可以用指针变量指向整型变量、字符串、数组,也可以指向一个函数。一个函数在编译时被分配一个入口地址。这个入口地址就称为函数时的指针。可以用一个指针变量指向函数,然后通过该指针变量调用此函数。,12.6 字符串指针做函数参数 一、用函数指针变量调用函数,第十二章 指针,main ( ) int max (int ,int ); int (*p) (int ,int ); int a,b,c; p=max; scanf (“%d,%d “,&a,&b); c=(*p)(a,b); printf(“max=%dn “,c); int max (int x,int y) /*定

37、义max函数*/ int z; if(xy) z = x; else z=y; return (z); main ( ) int max (int ,int ); int (*p) (int ,int ); int a,b,c; p=max; scanf (“%d,%d”,&a,&b); c=(*p)(a,b); printf(“max=%dn “,c); int max (int x,int y) /*定义max函数*/ int z; if(xy) z = x; else z=y; return (z); ,12.6 字符串指针做函数参数 一、用函数指针变量调用函数,第十二章 指针,说明:

38、(1)指向函数的指针变量的一般定义形式为: 数据类型标识符 (*指针变量名)(类型 参数1,类型 参数2, .) “数据类型标识符”是指函数返回值的类型,旧版本允许省略后一括号中的内容。 (2) 函数的调用可以通过函数名调用。也可以通过函数指针调用(即用指向函数的指针变量调用)。 (3) (*p)(int,int )表示定义一个指向函数的指针变量,它不是固定指向哪一个函数的,而只是表示定义了这样一个类型的变量,它是专门用来存放函数的入口地址。在程序中把哪一个函数的地址赋给它,它就指向哪一个函数。,12.6 字符串指针做函数参数 一、用函数指针变量调用函数,第十二章 指针,(4) 在给函数指针变

39、量赋值时,只需要给出函数名而不必给出参数。如: p=max; 因为是将函数入口地址赋给p,而不牵涉到实参与形参的结合问题。不能写成“ p=max (a,b);”形式。 (5) 用函数指针变量调用函数时,只需将(*p)代替函数名即可(p为指针变量名),在(*p)之后的括弧中根据需要写上实参, (6)对指向函数的指针变量,象p+n、p+、p-等运算无意义的。 (7)函数指针变量常用的用途之一是把指针作为参数传递到其它函数。,12.6 字符串指针做函数参数 一、用函数指针变量调用函数,第十二章 指针,函数的指针变量也可以作为参数,以便实现函数地址的传递,也就是将函数名传给形参。 它的原理可以简述如下

40、:有一个函数(假设函数名为sub),它有两个形参(x1和x2),定义x1和x2为指向函数的指针变量,在调用函数sub时,实参用两个函数名f1和f2给形参传递函数地址,这样在函数sub中就可以调用f1和f2函数了。,12.6 字符串指针做函数参数 二、把指向函数的指针变量作为函数参数,第十二章 指针,一个函数不仅可以带回简单类型的数据,而且可以带回指针型的数据,即地址。 如: #include stdio.h char *fun (char *); /*指针类型也要原型说明*/ main ( ) char ch =a ,*p,*q; p=&ch; q=fun(p); /*调用结束后q才有确定的指

41、向,相当于q=“bag“;*/ puts (q) char * fun (char *s) char *t=“big“; *( t1 )*s; /* *s相当于主函数中的*p即ch */ return t ; /*返字符串的首地址*/ 输出结果是: bag,12.7 返回指针值的函数,第十二章 指针,一个数组,其元素均为指针类型数据,称为指针数组,也就是说,指针数组中的每一个元素都是指针变量。 形式:类型标识符 *数组名 数组长度说明 ; 如:int *p4; 注意:不要写成int ( *p ) 4 ;这是指向一维数组的指针变量。指针数组使字符串处理更方便灵活。,12.8 指针数组和指向指针的

42、指针 一、指针数组,第十二章 指针,例12.22在五个字符串中,找出最大者,并使下标为0的指针数组元素指向它。 #include stdio.h #include string.h main ( ) int i,k; char *temp,*str = “Follow”,“QBASIC”,“Great”,“FORTRAN”,“Computer“; k=0; for ( i =1;i5;i ) if(strcmp(strk,stri)0) k=i; if (k!=0) temp=str0;str0=strk;strk=temp; printf(“The largest string isn%sn

43、“,str0); 运行结果是:QBASIC,12.8 指针数组和指向指针的指针 一、指针数组,第十二章 指针,指针变量也有地址,这地址可以存放在另一个指针变量中。如果变量p中存放了指针变量q的地址,那末p就指向指针变量q。指向指针数据的指针变量,简称为指向指针的指针。 定义一个指向字符型指针数据的指针变量,形式如下:char * * p; 如果有char *q=“abc“;则p=&q;是合法的。 *p相当于q,*p 相当于 *q,因此,*p中的值为a,,12.8 指针数组和指向指针的指针 二、指向指针的指针,第十二章 指针,例12.23 写出下面程序地运行结果。 main ( ) char *

44、str =“ENGLISH”,“MATH”,“MUSIC”, “PHYSICS”,“CHEMISTRY“; char *q ; int num ; q=str ; for(num=0;num5;num) printf(“%sn“,*(q); 运行结果是: ENGLISH MATH MUSIC PHYSICS CHEMISTRY,12.8 指针数组和指向指针的指针 二、指向指针的指针,第十二章 指针,main函数可以有参数,形式: main (int argc,char *argv ) argc和argv是main函数形参。实参从命令行得到。 命令行形式:命令名 参数1 参数2 参数n argc

45、是指命令行中参数的个数,参数含文件名,因此argc1。argv是指向字符指针数组的指针(即指向指针的指针),它指向的指针数组的每一元素都指向一个字符串,,12.8 指针数组和指向指针的指针 三、main函数的命令行参数,第十二章 指针,例12.24 下面程序的文件名为file.c,写出程序的运行结果。 main ( int argc,char * argv ) argc-;argv+; while(argc0) printf(“%s“,*argv); argc-;argv+; 如果命令输入: c:file Computer and C Language回车 则输出: Computer and C Language,12.8 指针数组和指向指针的指针 三、main函数的命令行参数,第十二章 指针,如有命令行:filel China Beijing argc的值等于3,argv0 指向filel,argv1指向China,argv2指向Beijing。,12.8 指针数组和指向指针的指针 三、main函数的命令行参数,

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

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1