C语言程序设计教程(第2版)课件第9章.ppt

上传人:asd****56 文档编号:87679360 上传时间:2023-04-16 格式:PPT 页数:81 大小:559KB
返回 下载 相关 举报
C语言程序设计教程(第2版)课件第9章.ppt_第1页
第1页 / 共81页
C语言程序设计教程(第2版)课件第9章.ppt_第2页
第2页 / 共81页
点击查看更多>>
资源描述

《C语言程序设计教程(第2版)课件第9章.ppt》由会员分享,可在线阅读,更多相关《C语言程序设计教程(第2版)课件第9章.ppt(81页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、第第9章章指指针针本章要点本章要点指针的定义、引用和运算方法指针的定义、引用和运算方法数组、函数和字符串与指针的关系数组、函数和字符串与指针的关系本章难点本章难点指针变量的引用指针变量的引用指针作为函数参数的运用指针作为函数参数的运用预备知识预备知识内存:内存:就是内部存储器,是由存储单元组成 的。它的特点是存储单元是线性连续 的。存储单元的最小单位是字节。1.内存的概念内存的概念地址:地址:为了访问内存中的某个存储单元,我们 要为它编号,这种编号称为内存地址。通过地址我们就能够访问该地址所标 识的存储单元。2.地址的概念地址的概念变量的地址:变量的地址:变量在内存中总占用几个连续的变量在内存

2、中总占用几个连续的字节,开始字节的地址,就是变量的地址。字节,开始字节的地址,就是变量的地址。20072007存储单元9.1 9.1 指针的含义指针的含义 指针:指针:一个变量的地址称为该变量的指针。一个变量的地址称为该变量的指针。指针的对象:指针的对象:当把变量的地址存入指针变量后,当把变量的地址存入指针变量后,我们就可以说我们就可以说这个指针指向了该变量这个指针指向了该变量。变量的存取方法:变量的存取方法:直接存取和间接存取。直接存取和间接存取。直接存取:直接存取:直接根据变量名存取数据。直接根据变量名存取数据。间接存取:间接存取:通过指针变量存取相应变量的数据通过指针变量存取相应变量的数

3、据。9.2.2 指针变量指针变量9.2.1指针变量的概念指针变量的概念 指针变量:指针变量:若一个变量专用于存放另一个变量若一个变量专用于存放另一个变量的地址(指针),则该变量称为指针变量。的地址(指针),则该变量称为指针变量。9.2.2指针变量的定义指针变量的定义 一般形式:一般形式:类型标识符类型标识符 *变量名变量名 ;例如:int*ptr1,*ptr2;指针变量的类型:指明了该指针指向的内存空指针变量的类型:指明了该指针指向的内存空间所存储的数据类型。间所存储的数据类型。在定义指针变量时要注意以下几个问题在定义指针变量时要注意以下几个问题:变量名变量名ptr2前面的前面的“*”不能省略

4、,如果写成不能省略,如果写成int*ptr1,ptr2;则则ptr2被定义为整型变量,而非整型指针变量。被定义为整型变量,而非整型指针变量。定义中的定义中的“*”表示所定义的变量是指针变量,但表示所定义的变量是指针变量,但指针变量名是指针变量名是ptr1、ptr2,而非而非*ptr1、*ptr2。指针变量只能指向定义时所规定类型的变量。指针变量只能指向定义时所规定类型的变量。这个规定的类型称为该指针变量的这个规定的类型称为该指针变量的“基类型基类型”。如:上例中ptr1、ptr2只能指向整型变量,不 能指向实型或字符型变量。其“基类型”相同,都是整型。定义指针变量后,并未确定该变量指向何处。定

5、义指针变量后,并未确定该变量指向何处。也就是说该变量的值是不确定的。在引用指针也就是说该变量的值是不确定的。在引用指针变量前必须首先让它指向一个变量,这一点非变量前必须首先让它指向一个变量,这一点非常重要。常重要。首先介绍指针运算符(,)首先介绍指针运算符(,)“&”(地址运算符地址运算符):取变量的存储地址。:取变量的存储地址。“*”(引用运算符引用运算符):是取指针所指向变量的内:是取指针所指向变量的内容容。例如:&a 是求变量a的地址。ptr指向了i变量,*ptr表示i的值,即3 说明:说明:在定义指针变量时,可以立即将一个地址值在定义指针变量时,可以立即将一个地址值赋给指针变量,这就是

6、指针变量的初始化。赋给指针变量,这就是指针变量的初始化。指针变量的初始化也是指针的赋值运算。指针变量的初始化也是指针的赋值运算。如:如:floatflt,*f_ptr=&flt;注意:这不是给注意:这不是给*f_ptr赋值赋值。指针变量间的赋值和引用应保证基类型相同。指针变量间的赋值和引用应保证基类型相同。若有定义:若有定义:int*p,i;float*q,x;则:则:q=&i;p=&x;我们还可以用这种方法实现对变量的改变:我们还可以用这种方法实现对变量的改变:*ptr=15;等价于等价于i=15;由由此此可可见见:通过指针运算符“*”可以引用一个变量。如:当ptr已经指向变量i后,*ptr

7、就等同于i。进一步理解进一步理解“&”和和“*”:“&”运算和运算和“*”运算是一对互逆运运算是一对互逆运算。算。&*ptr&i ptr *&i*ptr i等价于9.2.3指针变量赋值与初始化指针变量赋值与初始化 指针变量赋值后,指针变量就指向一个确定的内存存储单元指针变量赋值后,指针变量就指向一个确定的内存存储单元。使用指针的赋值运算()对指针变量赋值使用指针的赋值运算()对指针变量赋值使用取地址运算符,把地址值赋值给指针变量。使用取地址运算符,把地址值赋值给指针变量。如:int i,*pi;pi=&i;把指针变量的值赋给另一个指针变量。把指针变量的值赋给另一个指针变量。如:int i,*p

8、a,*pb;pa=&i;pb=pa;给指针变量赋值为符号常量给指针变量赋值为符号常量NULL。说说明明:NULL是是一一个个空空指指针针,表表示示该该指指针针变变量量的的值值没没有有意意义义。作作用用是是为为了了避避免免对对没没有有被被初初始始化化的的指指针针变变量的非法引用。量的非法引用。NULL的定义在的定义在“stdio.h”中。中。如:int*pi;pi=NULL;指针的加减运算(指针的加减运算(+、)、)指针的自加自减运算(指针的自加自减运算(+,-,+=,-=)1 1指针的指针的+、运算、运算 指针整数指针指针+、说明说明:指针与整型值加减的结果是指针指针与整型值加减的结果是指针,

9、表示使该指针,表示使该指针指向该指针下移或上移存储单元个数指向该指针下移或上移存储单元个数(整型值整型值)之后之后的内存地址。存储单元的大小就是该指针的数据类的内存地址。存储单元的大小就是该指针的数据类型所需的内存大小。型所需的内存大小。例如:ptr+n(指针ptr,n为整数)这个指针值代表的内存单元的地址是:ptr+n*d(其中d是指针所指向变量的数据类型所占内存字节数),即指针移动了n个元素。9.2.4指针的算术运算符指针的算术运算符 指针与指针的加运算毫无意义,所以指针与指针的加运算毫无意义,所以指针与指针指针与指针没有加运算没有加运算。指针与指针的减运算要求相减的两个指针属于同指针与指

10、针的减运算要求相减的两个指针属于同一类型,其结果是整数,表示两个指针之间的数一类型,其结果是整数,表示两个指针之间的数据的个数。其结果值的计算公式是:据的个数。其结果值的计算公式是:ptr1-ptr2=(ptr1的值-ptr2的值)/指针的数据类型所占的字节数 例如:int*ptr1,*ptr2,*ptr3,x;int ary5=2,4,8,16,32;ptr1=&ary0;ptr2=&ary3;ptr3=ary;x=ptr2-ptr1;x 的值是32 2指针的指针的+、-、+=+=、-=-=运算运算 +、+=+=:是移动指针到下一个或下几个存储单元。是移动指针到下一个或下几个存储单元。-、-

11、=-=:是移动指针到上一个或上几个存储单元。是移动指针到上一个或上几个存储单元。例如:例如:int*ptr,ary5=2,4,6,8,10;ptr=ary;ptr+=3;ptr-;想一想:想一想:*ptr+和(和(*ptr)+有什么有什么 的区别的区别?基类型相同的两个指针进行比较运算,其意义是两个指针的位置比较,结果是逻辑值。指针运算的程序举例:指针运算的程序举例:把把a,b按大小顺序输出。按大小顺序输出。main()int*p1,*p2,*p,a,b;a=45;b=76;p1=&a;p2=&b;if(*p1*p2)p=p1;p1=p2;p2=p;printf(a=%d,b=%d,max=%

12、d,min=%d,a,b,*p1,*p2);输出结果:a=45,b=76,max=76,min=45指针的关系运算指针的关系运算 9.3.3 指针与数组指针与数组9.3.1一维数组的指针一维数组的指针数组的指针数组的指针:是数组的起始地址。:是数组的起始地址。数组元素的指针数组元素的指针:是数组元素的地址。:是数组元素的地址。当指针变量指向数组或数组元素时,它就是当指针变量指向数组或数组元素时,它就是指指向数组的指针变量向数组的指针变量。C规定规定:数组名代表数组的首地址(起始地址),数组名代表数组的首地址(起始地址),也就是第一个元素的地址。也就是第一个元素的地址。当指针变量当指针变量p指向

13、数组时,指向数组时,p+1指向数组指向数组的下一个元素。假设一个整型元素占两的下一个元素。假设一个整型元素占两个字节,个字节,p+1是使是使p的地址加的地址加2个字节。个字节。如:如:inta10,*p;则:则:p=a;与与p=&a0;等价等价称指针变量称指针变量p指向数组元素指向数组元素a0 p+i、a+i、&ai都是都是ai的地址。的地址。一维数组元素的引用一维数组元素的引用1.用下标法引用数组元素用下标法引用数组元素如:如:a3=45;2.用指针法引用数组元素用指针法引用数组元素假如:假如:inta10,*p,i;p=a;则:则:*(p+i)、*(a+i)则代表元素则代表元素ai*(p+

14、i)也可以写成也可以写成pi*(p+i)、*(a+i)、ai、pi等价,等价,都代表数组都代表数组a的第的第i+1个元素。个元素。程序举例:输出程序举例:输出10个元素数组中的全部元素。个元素数组中的全部元素。方法二:通过数组名计算数组元素地址,找出元素的方法二:通过数组名计算数组元素地址,找出元素的值。值。main()int a10=54,65,8,2,3,56,8,21,57,98,i;for(printf(n),i=0;i10;i+)printf(%4d,*(a+i);方法一:下标法。方法一:下标法。main()int a10=54,65,8,2,3,56,8,21,57,98,i;fo

15、r(printf(n),i=0;i10;i+)printf(%4d,ai);方法三:用指针变量指向数组元素方法三:用指针变量指向数组元素 main()int a10=54,65,8,2,3,56,8,21,57,98,*p,i;p=a;for(printf(n),i=0;i10;i+)printf(%4d,*p+);以上三种方法,利用指针变量效率最高。以上三种方法,利用指针变量效率最高。说明:说明:指针变量与数组名的区别:指针变量与数组名的区别:指针变量是地址变量,指针变量是地址变量,数组名是地址常量数组名是地址常量。即。即指针变量的内容可以在程序运行过程中被改变;而指针变量的内容可以在程序运

16、行过程中被改变;而数组名一旦被定义,它的值就不能被改变了。数组名一旦被定义,它的值就不能被改变了。例如:int i,*p,a6;则:p=&i;a=&i;a+;a+=i;不能给常量赋值利用指针变量编程时特别要注意指针变量利用指针变量编程时特别要注意指针变量的当前值。的当前值。例如:通过指针变量输入输出a数组元素。main()int*p,i,a10;p=a;for(i=0;i10;i+)scanf(%d,p+);for(printf(“n”),i=0;i10;i+)printf(“%6d”,*p+);应插入语句 p=a;注意:注意:*p+、*(p+)、(*p)+、*(+p)的含义的含义 9.3.2

17、二维数组的指针二维数组的指针1二维数组的指针概念二维数组的指针概念在在C语言中,一个二维数组可以看成是一语言中,一个二维数组可以看成是一个一维数组,其中每个元素又是一个包含若干个一维数组,其中每个元素又是一个包含若干元素的一维数组。元素的一维数组。假如有定义:假如有定义:inta23;则则C语语言言编编译译程程序序认认为为a数数组组是是由由a0,a1两两个个元元素素组组成成的的一一维维数数组组,a0和和a1分分别别是是包包含含三三个个元元素素的的一一维维数数组组名名,分分别别代代表表a数数组组元元素素的的起起始始地地址址(即即a0是是第第0行行元元素素的的首首地地址址,a1是是第第1行行元元素

18、素的的首首地地址址)。因因此此,a和和a0是是两两个个基基类型不同的指针常量类型不同的指针常量。2通过指针引用二维数组元素通过指针引用二维数组元素假如有定义:假如有定义:inta35,i,j;(其中其中0i3,0j5)则:则:ai和和*(a+i)(无条件等价无条件等价)都是第)都是第i行第行第0列列元素的地址,那么元素的地址,那么ai+j、*(a+i)+j、&a00+5*i+j都是第都是第i行第行第j列元素的地址。列元素的地址。数组数组a中任意元素中任意元素aij的引用可以表示成如的引用可以表示成如下几种形式:下几种形式:aij、*(ai+j)、*(*(a+i)+j)、(*(a+i)j、*(&

19、a00+5*i+j)总结总结,对二维数组的引用有三种方式:,对二维数组的引用有三种方式:下标法。如下标法。如aij或或pij。指针法,如指针法,如*(*(p+i)+j)或或*(*(a+i)+j)。下标指针混合法,如下标指针混合法,如(ai+j),(pi+j),(*(a+i)j,(*(p+i)j,*(a0+i*n+j)等。等。注意:注意:3通过一个行指针变量引用二维数组的元素通过一个行指针变量引用二维数组的元素定义一个由定义一个由m个元素组成的一维数组的指个元素组成的一维数组的指针变量的一般形式:针变量的一般形式:类型标识符类型标识符 (*(*指针变量名指针变量名)m;)m;例如:假若有语句例如

20、:假若有语句inta23,(*p)3;p=a;注意:注意:*p两侧的圆括号不可缺少。两侧的圆括号不可缺少。则:则:p是一个指向由是一个指向由3个整型元素组成的一个整型元素组成的一维数维数组的指针变量。组的指针变量。p指向指向a数组,数组,p+1指向数组指向数组a的下一行首地的下一行首地址,址,a和和p的基类型相同,则的基类型相同,则a数组中任意元数组中任意元素素aij还可以如下表示:还可以如下表示:*(pi+j)、*(*(p+i)+j)、(*(p+i)j、pij例:使用行指针变量访问数组元素。例:使用行指针变量访问数组元素。main()floatfa510,(*pf)10=fa;inti,j;

21、for(i=0;i5;i+)for(j=0;j10;j+)*(*(pf+i)+j)=i*j;for(i=0;i5;i+)for(puts(),j=0;jy)z=x;elsez=y;returnz;9.4.3一维数组的指针作为函数参数一维数组的指针作为函数参数 1.数组名作实参数组名作实参 例如:f(int arr,int n)main()int array10;f(array,10);现在解释:实际上,能够接受并存放地址值的只能是指针变量。因此,C编译系统都是将形参数组名作为指针变量来处理的。上例中f(intarr,intn)等价于等价于f(int*arr,intn)。使用形参数组的概念只是为

22、了与实参数组对应,直观,便于理解而已。例:从例:从10个数中找出其中最大值和最小值。个数中找出其中最大值和最小值。voidmax_min(inta,intn,int*max,int*min);main()inti,a=2,4,1,6,7,32,45,75,45,90,max,min;for(printf(Theoriginalarray=),i=0;i10;i+)printf(%5d,ai);max_min(a,10,&max,&min);printf(max=%dmin=%d,max,min);voidmax_min(inta,intn,int*max,int*min)inti;*max=*

23、min=a0;for(i=0;in;i+)if(*maxai)*min=ai;上例中如果形参数组用指针变量,则程序如下:上例中如果形参数组用指针变量,则程序如下:voidmax_min(int*x,intn,int*max,int*min);main()inti,a10=2,4,1,6,7,32,45,75,45,90,max,min;for(printf(Theoriginalarray=),i=0;i10;i+)printf(%5d,ai);max_min(a,10,&max,&min);printf(=%dmin=%d,max,min);voidmax_min(int*x,intn,in

24、t*max,int*min)inti;*max=*min=*x;for(i=1;in;i+,x+)if(*max*x)*min=*x;数组名做函数参数小结数组名做函数参数小结:如果有一个实参数组,想在函数中改变此数组如果有一个实参数组,想在函数中改变此数组的元素的值,实参与形参都可用数组名或指针变量的元素的值,实参与形参都可用数组名或指针变量其对应关系有以下其对应关系有以下4种情况:种情况:实参与形参都用数组名;实参与形参都用数组名;实参用数组名,形参用指针变量;实参用数组名,形参用指针变量;实参、形参都用指针变量;实参、形参都用指针变量;实参为指针变量,形参用数组名。实参为指针变量,形参用数

25、组名。注意:注意:用指针变量作实参时一定要有确定的值。用指针变量作实参时一定要有确定的值。例:实参、形参都用指针变量的形式例:实参、形参都用指针变量的形式main()inta10,*p;p=a;f(p,10);f(int*x,intn)例:实参为指针变量,形参用数组名。例:实参为指针变量,形参用数组名。main()inta10,*p;p=a;f(p,10);f(intx,intn)数组元素地址作实参数组元素地址作实参当用数组元素的地址作为实参时,因为是地址值,所以对应当用数组元素的地址作为实参时,因为是地址值,所以对应的形也应当是基类相同的指针变量。的形也应当是基类相同的指针变量。例编写程序,

26、对具有例编写程序,对具有10个元素的个元素的char类型数组,从下标为类型数组,从下标为4的元素开始,全部设置为的元素开始,全部设置为“*”,保持前,保持前4个元素不变。个元素不变。voidsetstr(char*,int);main()charc10=A,B,C,D,E,F,G,H,I,J;setstr(&c4,6);voidsetstr(char*a,intn)for(inti=0;in;i+)*(a+i)=*;3函数的指针形参和函数体中数组的区别函数的指针形参和函数体中数组的区别当用数组元素的地址作为实参时,因为是地址值,所以对应当用数组元素的地址作为实参时,因为是地址值,所以对应的形也

27、应当是基类相同的指针变量。的形也应当是基类相同的指针变量。#defineN10int*fun(intaN,intn)intbN;returnb;main()intwN,*p;p=fun(w,N);说明:说明:程程序序中中定定义义fun函函数数,形形参参a指指向向w数数组组,函函数数体体内内定定义义了了一一个个数数组组b,函函数数把把b数数组组的的起起始始地地址址作作为为函函数数的的返返回回值值,企企图图使使指指针针p指指向向函函数数体内体内b数组的开头。数组的开头。9.4.4二维数组的指针作为函数参数二维数组的指针作为函数参数二维数组名作为实参二维数组名作为实参当二维数组名作为函数实参时,对应

28、的形参必须是一个行当二维数组名作为函数实参时,对应的形参必须是一个行指针变量指针变量。main()doublea34;fun(a);fun(double(*a)n)说说明明:和和一一维维数数组组一一样样,数数组组名名传传送送给给变变量量的的是是一一个个地地址址值值,因因此此,对对应应的的形形参参也也必必须须是是一一个个类类型型相相同同的的指指针针变变量量,在在函函数数中中引引用用的的将将是是主主函函数数中中的的数数组组元元素素,系系统统只只为为形形参参开开辟辟一一个个存存放放地地址址的的存存储储单单元元,而而不不可可能能在在调调用用函函数数时时为为形形参参开开辟辟一一系系列列存存放放数数组组的

29、存储单元。的存储单元。9.5.5 指针与字符串指针与字符串字符串指针:字符串指针:字符串的首地址。字符串的首地址。字符指针变量:字符指针变量:指向字符串的指针变量。指向字符串的指针变量。例如:例如:char*strp=“Hello!”;定定义义了了一一个个指指向向字字符符串串的的指指针针变变量量,并并将将字字符符串串的的首首地地址址赋赋值值给给strp指指针针变变量量,即即:使使指指针针变变量量strp指向字符串首地址。指向字符串首地址。字符指针变量定义的一般形式字符指针变量定义的一般形式:char*char*指针变量名指针变量名;字符指针变量定义时可以赋初值。字符指针变量定义时可以赋初值。9

30、.5.1单字符串单字符串1用字符数组存放一个字符串用字符数组存放一个字符串例如:例如:chars=Iamastudent.;字符串输出语句可写成:字符串输出语句可写成:printf(“%sn”,s);for(i=0;si;i+)printf(“%c”,si);for(i=0;si;i+)printf(“%c”,*(s+i);也可用也可用si!=02用字符指针指向一个字符串用字符指针指向一个字符串例如:例如:char*ps=Iamastudent.;字符串输出语句可写成:字符串输出语句可写成:printf(“%sn”,s);for(;*ps;ps+)printf(“%c”,*ps);说明:说明:

31、字符数组由若干个元素组成,每个元素中放一个字符数组由若干个元素组成,每个元素中放一个字符。而字符指针变量中存放的是地址(字符串的字符。而字符指针变量中存放的是地址(字符串的首地址),决不是将字符串放到字符指针变量中;首地址),决不是将字符串放到字符指针变量中;字符数组和字符指针变量都可以在定义时赋初值,字符数组和字符指针变量都可以在定义时赋初值,但以下方法对字符数组非法,对字符指针变量合法:但以下方法对字符数组非法,对字符指针变量合法:chars10;s=“hello!”;char*ps;ps=“hello!”;字符指针变量必须先赋值后使用,否则对系统构字符指针变量必须先赋值后使用,否则对系统

32、构成危险。因此,不可以如下编程:成危险。因此,不可以如下编程:char*ps;scanf(“%s”,ps);而应写成:而应写成:char*ps,s10;ps=s;scanf(“%s”,ps);字符数组名是指针常量,只能表示一个确定的字字符数组名是指针常量,只能表示一个确定的字符串,不能改变。而字符指针变量的值是可以改变符串,不能改变。而字符指针变量的值是可以改变的,它可以代表不同的字符串。的,它可以代表不同的字符串。若定义了一个指针变量,并使它指向一个字符串,若定义了一个指针变量,并使它指向一个字符串,就可以用下标形式引用指针变量所指字符串中的字就可以用下标形式引用指针变量所指字符串中的字符。

33、符。如:如:char*a=“IloveChina!”;printf(“%c”,a5);若把字符指针所指对象当作数组使用,应注意对若把字符指针所指对象当作数组使用,应注意对象的长度。象的长度。如:如:charstr110,*ps=str1;ps10=0;用指针变量指向一个格式字符串,可以用它代替用指针变量指向一个格式字符串,可以用它代替printf函数的格式字符串。函数的格式字符串。如:如:inta;char*format;format=“a=%dn”;则:则:printf(format,a);相当于相当于printf(“a=%dn”,a);程序举例:将字符串程序举例:将字符串a复制为字符串复制

34、为字符串b。main()chara=“Itisadog.,b20;inti=0;do*(b+i)=*(a+i);i+;while(*(a+i)!=0);/*也可写成也可写成while(*(a+i);*/puts(b);上例程序还可写成:上例程序还可写成:main()chara=Itisadog.,b20,*p1=a,*p2=b;inti=0;do*p2=*p1;p2+;p1+;while(*p1!=0);/*也可写成也可写成while(*p1);*/puts(b);一、指针数组的有关概念一、指针数组的有关概念指针数组:指针数组:就是数组中每个元素是基类型相同就是数组中每个元素是基类型相同指针变

35、量。指针变量。定义指针数组的一般形式定义指针数组的一般形式:类型标识符类型标识符*指针变量名指针变量名 常量表达式常量表达式;例如:例如:int*p2;含意:含意:p是一个一维指针数组,每个元素都是是一个一维指针数组,每个元素都是一个指向整型变量的指针变量。可以将一个指向整型变量的指针变量。可以将整型变量的地址赋值给元素整型变量的地址赋值给元素p0或或p1。注意:注意:区别区别int*p2、int(*p)2的含意。的含意。9.5.2多字符串多字符串二、定义多字符串的方法二、定义多字符串的方法1用二维数组定义多字符串用二维数组定义多字符串例如:例如:charstate9=“china”,”ame

36、rican”,”japan”,”canada”;2用字符指针数组定义多个字符串用字符指针数组定义多个字符串例如:例如:char*state=“china”,”american”,”japan”,”canada”;三、指针数组的应用三、指针数组的应用利用指针数组处理多个串利用指针数组处理多个串方法方法:先用指针数组指向字符数组:先用指针数组指向字符数组,再处理。再处理。main()charname80=aaa,bbb,ccc,ddd,eee;char*pname10,i;for(i=0;i5;i+)pnamei=namei;for(i=0;i5;i+)puts(pnamei);main()/*与

37、用行指针解决上述问题比较与用行指针解决上述问题比较*/charname80=aaa,bbb,ccc,ddd,eee;char(*pname)80=name,i;for(i=0;i5;i+)puts(pnamei);方法方法:用指针数组指向字符串常量。:用指针数组指向字符串常量。main()char*pname10=aaa,bbb,ccc,ddd,eee;inti;for(i=0;i5;i+)puts(pnamei);9.字符数组与字符指针的区别字符数组与字符指针的区别 区别如下:区别如下:()字符数组由若干个元素组成,每一个元素是一个字符,字()字符数组由若干个元素组成,每一个元素是一个字符,

38、字符指针变量中存放的是字符串的首地址,而不是把字符放到字符符指针变量中存放的是字符串的首地址,而不是把字符放到字符指针变量中。指针变量中。()赋初值的方式不同,使用字符数组的时候,必须使用()赋初值的方式不同,使用字符数组的时候,必须使用static存储类别字符指针变量则不必。存储类别字符指针变量则不必。()赋值方式不同,对于字符数组,只能对各个元素赋值,而()赋值方式不同,对于字符数组,只能对各个元素赋值,而不能象字符指针变量那样使用字符串对整体赋值。不能象字符指针变量那样使用字符串对整体赋值。()新定义的数组在编译时分配内存单元,有确定的地址,而()新定义的数组在编译时分配内存单元,有确定

39、的地址,而新定义的指针变量,无具体的值解决办法是,把一个已定义的新定义的指针变量,无具体的值解决办法是,把一个已定义的字符数组的地址赋给这个指针变量。字符数组的地址赋给这个指针变量。()字符指针变量的值是可以改变的,虽然字符数组名也表示()字符指针变量的值是可以改变的,虽然字符数组名也表示数组的首地址,但是却不能通过赋值的方法改变。数组的首地址,但是却不能通过赋值的方法改变。()字符指针变量也可以使用下标运算符引用字符串中的字符,()字符指针变量也可以使用下标运算符引用字符串中的字符,另外它还可以指向一个格式字符串,用以代替另外它还可以指向一个格式字符串,用以代替printf中的格式字符中的格

40、式字符串,实现灵活可变的输出形式。串,实现灵活可变的输出形式。9.7.1定义形式定义形式指指向向指指针针的的指指针针变变量量(也也称称多多级级指指针针)只只能能存存放放指指针针变变量量的的地地址址。定义一般形式:定义一般形式:类型标识符类型标识符 *指针变量名指针变量名;例如:例如:int*q,*p,i=5;p=&i;q=&p;5i20002000p4000q4000注意:注意:要使用一个多级指针要使用一个多级指针指向目标值,必须连续使用指向目标值,必须连续使用指针运算符指针运算符“*”。例如:上例中例如:上例中*q就是就是i的值。的值。含意:使指针变量含意:使指针变量p指向指向i,指针变量指

41、针变量q指向指向p。9.7指向指针的指针指向指针的指针1指向行指针的指针变量指向行指针的指针变量定义形式定义形式:数据类型数据类型 *(*变量名)变量名)指向的数组长度指向的数组长度;例如:例如:int*(*p)4;2指向指针的指针数组指向指针的指针数组其定义形式为其定义形式为:数据类型数据类型 *数组名数组名 数组长度数组长度;例如:例如:int *b6;3.指向行指针的指针数组指向行指针的指针数组定义的一般形式为定义的一般形式为:数据类型数据类型 *(*变量名变量名 数组长度数组长度)指向的数组长度指向的数组长度;例如:例如:int*(*b3)4;其他多级指针的定义形式其他多级指针的定义形

42、式:9.7.2传给传给main函数的参数函数的参数main函数是由系统调用的,可以有参数。函数是由系统调用的,可以有参数。可执行文件名可执行文件名 参数参数1 1 参数参数2 2 参数参数n n实参是和命令一起给出的,也就是在实参是和命令一起给出的,也就是在DOS提提示符下,输入本程序的可执行文件名和需要传给示符下,输入本程序的可执行文件名和需要传给main函数的参数,命令行的一般形式为:函数的参数,命令行的一般形式为:main函数实参函数实参:带参数的带参数的main函数的原型是:函数的原型是:main(intargc,char*argv);命令行参数命令行参数(包包括可执行文件名)括可执行

43、文件名)的数目的数目n+1指针数组,各元素分别指向命令指针数组,各元素分别指向命令行中的各参数(包括可执行文件行中的各参数(包括可执行文件名),即字符串的首址名),即字符串的首址例:若以下面程序编译后生成可执行程序例:若以下面程序编译后生成可执行程序file.exe,在在DOS提示符下按下述形式执行程序:提示符下按下述形式执行程序:fileChinaBejingShenyang写出程序运行结果。写出程序运行结果。#includemain(intargc,char*argv)while(argc0)printf(“%sn”,argvargc);运行结果:运行结果:ShenyangBejingCh

44、inavoid指针类型介绍:指针类型介绍:新标准增加了新标准增加了void指针类型,它用于定义一个指指针类型,它用于定义一个指针变量,但不指定它是指向哪种类型数据。在将它针变量,但不指定它是指向哪种类型数据。在将它的值赋给另一个指针变量时要进行强制类型转换使的值赋给另一个指针变量时要进行强制类型转换使之适合于被赋值的变量的类型。之适合于被赋值的变量的类型。9.7.3void指针类型指针类型例如:例如:char*p1;inta=2;void*p2;p2=&a;p1=(char*)p2;强制类型转换强制类型转换void指针变量定义指针变量定义同样,可用同样,可用p2=(void*)p1;将将p1的

45、值转换成的值转换成void指针类型。指针类型。可以将一个函数定义为可以将一个函数定义为void指针类型。表示指针类型。表示该函数返回的是一个地址,它指向空类型,如需该函数返回的是一个地址,它指向空类型,如需要引用此地址,也需要根据情况进行类型转换。要引用此地址,也需要根据情况进行类型转换。如如,库函数:库函数:void*malloc(unsignedsize);功能:分配功能:分配size字节的存储区。字节的存储区。函数调用例函数调用例:char*p;p=(char*)malloc(60);分配分配60字节的存储区,并返回该字节的存储区,并返回该内存区的地址,并赋值给内存区的地址,并赋值给p。

46、voidsort(char*ps,intn);#defineN5main()char*ps100,i;for(i=0;iN;i+)psi=(char*)malloc(60);for(i=0;iN;i+)gets(psi);sort(ps,N);for(i=0;iN;i+)puts(psi);voidsort(char*ps,intn)inti,k;char*p,s100;for(i=0;in-1;i+)for(k=i+1;kn;k+)if(strcmp(psi,psk)*p2)swap(p1,p2);if(*p1*p3)swap(p1,p3);if(*p2*p3)swap(p2,p3);pri

47、ntf(n%6d%6d%6d,*p1,*p2,*p3);voidswap(int*p,int*q)intx;x=*p;*p=*q;*q=x;习题习题9.2:输入:输入3个字符串,按由小到大的顺序输出。个字符串,按由小到大的顺序输出。voidswap(char*ps1,char*ps2);main()chars1=abc,s2=rst,s3=xyz;if(strcmp(s1,s2)0)swap(s1,s2);if(strcmp(s1,s3)0)swap(s1,s3);if(strcmp(s2,s3)0)swap(s2,s3);printf(n%10s%10s%10s,s1,s2,s3);void

48、swap(char*ps1,char*ps2)charps100;strcpy(ps,ps1);strcpy(ps1,ps2);strcpy(ps2,ps);习题习题9.3:写一函数,将一个:写一函数,将一个33的矩阵转置。的矩阵转置。main()inta33=1,2,3,4,5,6,7,8,9,i,j;for(i=0;i3;i+)for(puts(),j=0;j3;j+)printf(%6d,aij);move(a);for(i=0;i3;i+)for(puts(),j=0;j3;j+)printf(%6d,aij);move(int(*p)3)inti,j,t;for(i=0;i3;i+)

49、for(j=0;j=A&*p=a&*p=0&*p=9)num+;elseif(*p=)space+;p+;printf(nupc=%dlowc=%dnum=%dspace=%d,upc,lowc,num,space);习题习题9.8:对:对10个等长的字符串排序并输出。个等长的字符串排序并输出。voidsort(char(*p)60);main()chars1060,i;for(i=0;i10;i+)gets(s+i);sort(s);for(i=0;i10;i+)puts(s+i);voidsort(char(*p)60)inti,j;chars60;for(i=0;i9;i+)for(j=

50、i+1;j10;j+)if(strcmp(pi,pj)0)strcpy(s,pi);strcpy(pi,pj);strcpy(pj,s);9.9:用指针数组处理上一个题目,字符串不:用指针数组处理上一个题目,字符串不等长。等长。voidsort(char*p,intn);main()char*s10=AAA,DDD,878787,*ps10,i;for(i=0;i10;i+)psi=si;sort(ps,4);for(i=0;i4;i+)puts(psi);voidsort(char*ps,intn)inti,j;char*s;for(i=0;in-1;i+)for(j=i+1;jn;j+)i

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 其他杂项

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com