C语言从入门到精通 .pptx

上传人:莉*** 文档编号:87182128 上传时间:2023-04-16 格式:PPTX 页数:73 大小:437.37KB
返回 下载 相关 举报
C语言从入门到精通 .pptx_第1页
第1页 / 共73页
C语言从入门到精通 .pptx_第2页
第2页 / 共73页
点击查看更多>>
资源描述

《C语言从入门到精通 .pptx》由会员分享,可在线阅读,更多相关《C语言从入门到精通 .pptx(73页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、8.1 8.1 指针与指针变量8.1.1 8.1.1 8.1.1 8.1.1 指针的概念指针的概念指针的概念指针的概念1.1.内存与变量地址内存地址:内存是计算机用于存储数据的存储器,以一个字节作为存储单元,为了便于访问,给每个字节单元一个唯一的编号,第一字节单元编号为0,以后各单元按顺序连续编号,这些单元编号称为内存单元的地址。变量地址:变量所分配存储空间的首字节单元地址(字节单元编号)。下一页下一页 第8章 指针上一页上一页第1页/共73页2.变量的三要素:变量的三要素:名字、类型与值名字、类型与值 每个变量都通过每个变量都通过变量名与相应的存储单元相连系变量名与相应的存储单元相连系,具体

2、分配哪些单元给变量,由编译系统完成变量具体分配哪些单元给变量,由编译系统完成变量名到对应内存单元地址的变换。名到对应内存单元地址的变换。变量分配存储空间的变量分配存储空间的大小大小由由类型类型决定。决定。变量的值变量的值则是指相应则是指相应存储单元的内容存储单元的内容。3.3.内存存取方式内存存取方式 直接存取直接存取:把直接按变量名或地址存取变量值的:把直接按变量名或地址存取变量值的方式称为方式称为“直接存取直接存取”方式。方式。间接存取间接存取:通过定义一种特殊的变量专门存放内:通过定义一种特殊的变量专门存放内存或变量的地址,然后根据该地址值再去访问相应存或变量的地址,然后根据该地址值再去

3、访问相应的存储单元的存储单元。下一页下一页 第8章 指针上一页上一页第2页/共73页 系统为特殊变量p p(用来存放地址的)分配的存储空间地址是48004800,p p中保存的是变量a a的地址,即40004000,当要读取a a变量的值1234512345时,不是直接通过a a变量,也不是直接通过保存1234512345的内存单元的地址40004000去取值,而是先通过变量p p得到p p的值40004000,即a a的地址,再根据地址40004000读取它所指向单元的值1234512345。这种间接的通过变量p得到变量a的地址,再存取变量a的值的方式即为“间接存取”。通常称变量通常称变量p

4、 p指向变量指向变量a a,变量,变量a a是变量是变量p p所指向的对象所指向的对象400012345400040024800pap(4800)p(4800)a(4000)4000123454000间接间接存取存取示意示意图右图右下一页下一页 第8章 指针上一页上一页第3页/共73页4.指针的概念在语言中,用指针来表示一个变量指向另一个变量这样的指向关系。所谓指针即地址。一个变量的指针即该变量的地址,如40004000就是指向变量a a的指针。指针变量:专门存放地址的变量,如p p即是一个指针变量,它存放的是a a的地址40004000。下一页下一页 第8章 指针上一页上一页8.1.2 指针

5、变量的定义与初始化1.1.指针变量的定义指针变量的定义 类型标识符 *指针变量名;第4页/共73页在指针变量定义中,*是一个说明符,它表明其后的变量是指针变量,如p是指针变量,而不要认为“*p”是指针变量。指针变量定义时指定的数据类型不是指针变量本身(变量存放的值)的数据类型,而是指针变量所指向的对象(或称目标)的数据类型指针变量存放的是所指向的某个变量的地址值,而普通变量保存的是该变量本身的值指针变量并不固定指向一个变量,可指向同类型的不同变量下一页下一页 第8章 指针上一页上一页例:float *p1;(定义p1为指向实型变量的指针变量)char *p2;(定义p2为指向字符型变量的指针变

6、量)第5页/共73页(1)指针运算符与地址运算符与指针引用有关的两个运算符:&与*。&:&:取地址运算符*:指针运算符,或称指向运算符、间接访问运算符。指针指向的对象的表示形式:*:*指针变量此处*是访问指针所指对象的运算符,与指针定义时的*不同。2.指针变量初始化 下一页下一页 第8章 指针上一页上一页第6页/共73页(2)指针变量初始化若有定义:inta,*p;语句仅仅定义了指针变量p,但指针变量并未指向确定的变量(或内存单元)。因为这些指针变量还没有赋给确定的地址值,只有将某一具体变量的地址赋给指针变量之后,指针变量才指向确定的变量(内存单元)。指针变量初始化:在定义指针时同时给指针一个

7、初始值如:inta,*p=&a;40003a(4000)p*p下一页下一页 第8章 指针上一页上一页第7页/共73页(3)指针变量的引用*指针变量名代表所指变量的值。指针变量名代表所指变量的地址。有定义:inta,*p=&a;用*p来表示p指向的对象a,*p与a是等价的。*p可以象普通变量一样使用。例如:a=12;*p=12;scanf(%d,&*p);scanf(%d,p);printf(“%d%d”,*p,a);注意:*与&具有相同的优先级,结合方向从右到左。这样,&*p即&(*p),是对变量*p取地址,它与&a等价;p与&(*p)等价,a与*(&a)等价。下一页下一页 第8章 指针上一页

8、上一页第8页/共73页8.1.3指针运算1.1.指针的赋值运算指针的赋值运算(1)将变量地址值赋给指针变量,使指针指向该变量。设有如下定义:inta,b,*pa,*pb;float*pf;第一行定义了整型变量a,b及指针变量pa,pb。pa、pb还没有被赋值,因此pa、pb没有指向任何变量,下面语句完成对pa,pb的赋值:pa=&a;pb=&b;下一页下一页 第8章 指针上一页上一页第9页/共73页例如:intj,k;int*pointer1,*pointer2;pointer1=&j;pointer2=&k;pointer1jpointer2k下一页下一页 第8章 指针上一页上一页第10页/

9、共73页(2)相同类型的指针变量间的赋值pa与pb都是整型指针变量,它们间可以相互赋值,如:pb=pa;即pa,pb都指向变量a,此时a、*pa、*pb是等价的。指针指向变化如下图:注注意意:只有相同类型的指针变量才能相互赋值,如pf=pa;是不允许的。因为pa是整型指针,pf是浮点型指针。&a&bpapba,*pab,*pb&a&apapba,*pa,*pbb下一页下一页 第8章 指针上一页上一页第11页/共73页()给指针变量赋空值空值 给指针变量赋给指针变量赋空值空值,说明该指针不指向任何变量。,说明该指针不指向任何变量。“空空”指指针针值值用用NULL表表示示,NULL是是在在头头文文

10、件件stdio.h中中预定义的常量,其值为,在使用时应加上预定义行预定义的常量,其值为,在使用时应加上预定义行,如:如:#include stdio.h int *pa=NULL;亦可以用下面的语句给指针赋亦可以用下面的语句给指针赋“空值空值”:pa=0;或或:pa=0;这这里里指指针针pa并并非非指指向向0地地址址单单元元,而而是是具具有有一一个个确确定定的的“空值空值”,表示,表示pa不指向任何变量。不指向任何变量。注注意意:指指针针虽虽然然可可以以赋赋值值0 0,但但却却不不能能把把其其它它的的常常量量地地址址赋赋给指针。例如:给指针。例如:pa=4000;pa=4000;是非法的是非法

11、的。下一页下一页 第8章 指针上一页上一页第12页/共73页例8.1指针定义与初始化main()inta,b;int*pointer_1,*pointer_2;a=100;b=10;pointer_1=&a;pointer_2=&b;printf(%d,%dn,a,b);printf(%d,%dn,*pointer_1,*pointer_2);下一页下一页 第8章 指针上一页上一页第13页/共73页程序运行结果:100,10100,10&a&bbPointer_1Pointer_2a*pointer_1*pointer_2下一页下一页 第8章 指针上一页上一页第14页/共73页例例8.2 8.

12、2 从键盘上输入两个整数到从键盘上输入两个整数到a a、b,b,按由大到小输按由大到小输出。出。#includemain()int a,b,*pa=&a,*pb=&b,*p;/*定义指针变量pa、pb,如下页图a*/scanf(%d%d,&a,&b);if(*pa*pb)p=pa;/*进行指针交换,如下页图b,c*/pa=pb;pb=p;printf(na=%d,b=%dn,a,b);printf(nmax=%d,min=%d,*pa,*pb);/*pa指向大数,pb指向小数*/下一页下一页 第8章 指针上一页上一页第15页/共73页若输入:1222输出结果:a=12,b=22max=22,m

13、in=12(a)(b)(c)指针变化示意图1222ppapbpapbab下一页下一页 第8章 指针上一页上一页1222ppapb第16页/共73页2.2.指针的算术运算指针的算术运算 (1)(1)加减运算加减运算:一个指针可以加、减一个整数n n,其结果与指针所指对象的数据类型有关。指针变量的值应增加或减少“nsizeof(nsizeof(指针类型)”。加加减减运运算算常常用用于于数数组组的的处处理理。对指向一般数据的指针,加减运算无实际意义。例如:int a10int a10,*p=ap=a,*x x;x=p+3x=p+3;/*/*实际上是p p加上3*23*2个字节赋给x x,x x指向数

14、组的第三个分量*/对于不同基类型的指针,指针变量“加上”或“减去”一个整数n n所移动的字节数是不同的。例如:float a10float a10,*p=ap=a,*x x;p=p+3p=p+3;/*/*实际上是p p加上3*43*4个字节赋给x x,x x依然指向数组的第三个分量*/下一页下一页 第8章 指针上一页上一页第17页/共73页 (2)(2)自增自减运算指针变量自增、自减运算具有上述运算的特点,但有前置后置、先用后用的考虑,务请小心。例如:int a10int a10,*p=ap=a,*x x;x=p+/*x=p+/*x x第一个元素分量,p p指向第二个元素*/x=+px=+p;

15、/*/*x x、p p均指向数组的第二个分量*/*p+p+相当于*(p+p+)。*(p+p+)与(*p p)+含义不同,前者表示地址自增,后者表示当前所指向的数据自增。下一页下一页 第8章 指针上一页上一页第18页/共73页1.若有定义 int a,*p;执行了“p=&a”,则:“&*p”的含意是什么?下一页下一页 第8章 指针上一页上一页思考(答:相当于&a)2.*&a的含意是什么?(答:a)(答:a+)3.(*p)+相当于什么?第19页/共73页 3.3.指针的关系运算指针的关系运算 与基本类型变量一样,指针可以进行关系运算。在关系表达式中允许对两个指针进行所有的关系运算。若 p,q是 两

16、 个 同 类 型 的 指 针 变 量,则:pq,p=q都是允许的。指针的关系运算在指向数组的指针中广泛的运用,假设p、q是指向同一数组的两个指针,执行pq的运算,其含义为,若表达式结果为真(非值),则说明p所指元素在q所指元素之后。或者说q所指元素离数组第一个元素更近些。注意:在指针进行关系运算之前,指针必须指向确定的变量或存储区域,即指针有初始值;另外,只有相同类型的指针才能进行比较。下一页下一页 第8章 指针上一页上一页第20页/共73页8.1.4 8.1.4 多级指针 把指向指针型数据的指针变量称为指向指针的指针,或称多级指针称多级指针。二级指针的定义形式如下:数据类型数据类型 *指针变

17、量指针变量例如:inta,*p,*pp;a=22;p=&a;pp=&p;假设变量a的地址为4000,指针p的地址为4100,二级指针pp的地址为4800。a、p、pp三者的关系如上图。&p=4100&a=400022pp(4800)p(4100)a(4000)第8章 指针上一页上一页返回第21页/共73页8.2 8.2 指针与函数指针与函数8.2.1 8.2.1 指针作为函数参数指针作为函数参数利利用用指指针针作作函函数数参参数数,可可以以实实现现函函数数之之间间多多个个数数据据的的传传递递,当当形形参参为为指指针针变变量量时时,其其对对应应实实参参可以是指针变量或存储单元地址。可以是指针变量

18、或存储单元地址。函数形参为指针变量,用指针变量或变量地址作实参例8.3编写一个交换两个变量的函数,在主程序中调用,实现两个变量值的交换。下一页下一页 第8章 指针上一页上一页#includemain()int a,b;int *pa,*pb;void swap(int*p1,int*p2);/*函数声明*/第22页/共73页scanf(%d%d,&a,&b);pa=&a;/*pa指向变量a*/pb=&b;/*pb指向变量b*/swap(pa,pb);printf(na=%d,b=%dn,a,b);voidswap(int*p1,int*p2)inttemp;temp=*p1;/*交换指针p1、

19、p2所指向的变量的值*/*p1=*p2;*p2=temp;或:swap(&a,&b);下一页下一页 第8章 指针上一页上一页程序运行结果如下:程序运行结果如下:输入:输入:12 22 输出:输出:a=22,b=12第23页/共73页(1)若在函数体中交换指针变量的值,实参a、b的值并不改变,指针参数亦是传值。例如:int*p;p=p1;p1=p2;p2=p;不要希望如此完成处理。(2)函数中交换值时不能使用无初值的指针变量作临时变量。例如:int*p;*p=*p1;*p1=*p2;*p2=*p;p无确定值,对p的使用可能带来不可预期的后果。下一页下一页 第8章 指针上一页上一页两点说明两点说明

20、第24页/共73页8.2.2指针函数指针函数指针函数:是指返回值为指针的函数是指返回值为指针的函数指针函数的定义形式:类型标示符类型标示符 *函数名(参数)函数名(参数)例如:int*fun(int a,int b)int*fun(int a,int b)函数体语句 在函数体中有返回指针或地址的语句,形如:return(&变量名);或return(指针变量);并且返回值的类型要与函数类型一致。下一页下一页 第8章 指针上一页上一页第25页/共73页例8.3 8.3 分析如下程序main()inta,b,*p;int*max(intx,inty);scanf(“%d,%d”,&a,&b);p=m

21、ax(a,b);printf(“max=%d”,*p);int *max(int x,int y)if xy)return (&x);else return (&y);下一页下一页 第8章 指针上一页上一页第26页/共73页8.2.3 8.2.3 指向函数的指针一个函数包括一组指令序列,存储在某一段内存中,这段内存空间的起始地址称为函数的入口地址函数的入口地址称函数入口地址为函数的指针。函数名函数的指针。函数名代表函数的入口地址可以定义一个指针变量,其值等于该函数的入口地址,指向这个函数,这样通过这个指针变量也能调用这个函数。这种指针变量称为指向函数的指针变量。指向函数的指针变量。定义指向函数

22、的指针变量的一般形式为定义指向函数的指针变量的一般形式为:类型标识符(类型标识符(*指针变量名指针变量名)()();例:int(*p)();/*指针变量p可以指向一个整型函数*/float(*q)();/*指针变量q可以指向一个浮点型函数*/下一页下一页 第8章 指针上一页上一页第27页/共73页刚定义的指向函数的指针变量,亦象其它指针变量一样要赋以地址值才能引用。当将某个函数的入口地址赋给指向函数的指针变量,就可用该指针变量来调用所指向的函数给函数指针赋初值:将函数名(函数的入口地址值)赋给指针变量例如intm,(*p)();intmax(inta,intb);则可以p=max;/*p指向函

23、数max()*/指针调用函数的指针调用函数的一般形式为一般形式为:(*指针变量指针变量)()(实参表实参表);如 上 例:m=(*p)(12,22);/*比 较 m=max(12,22);*/下一页下一页 第8章 指针上一页上一页第28页/共73页用函数指针调用函数是间接调用,没有参数类型说明,C编译系统也无法进行类型检查,因此,在使用这种形式调用函数时要特别小心。实参一定要和指针所指函数的形参类型一致。函数指针可以作为函数参数,此时,当函数指针每次指向不同的函数时,可执行不同的函数来完成不同的功能下一页下一页 第8章 指针上一页上一页注意第29页/共73页例例 8.48.4 函数函数max(

24、)max()用来求一维数组的元素的最大值,用来求一维数组的元素的最大值,在主调函数中用函数名调用该函数与用函数指针调在主调函数中用函数名调用该函数与用函数指针调用该函数来实现。用该函数来实现。下一页下一页 第8章 指针上一页上一页#include stdio.h#define M 8 main()float sumf,sump;float aM=11,2,-3,4.5,5,69,7,80;float(*p)();/*定义指向函数的指针p*/float max(float a,int n);/*函数声明*/p=max;/*函数名(函数入口地址)赋给指针p*/第30页/共73页sump=(*p)(

25、a,M);/*用指针方式调用函数*/sumf=max(a,M);/*用函数名调用max()函数*/printf(sump=%.2fn,sump);printf(sumf=%.2fn,sumf);floatmax(floata,intn)intk;floats;s=a0;for(k=0;kn;k+)if(sak)s=ak;returns;下一页下一页 第8章 指针上一页上一页程序运行结果:sump=80.00 sumf=80.00第31页/共73页(1)定义一个指向函数的指针变量,形如:float(*p)();(2)为函数指针赋值,格式如下:p=函数名;注意:赋值时只需给出函数名,不要带参数。(

26、3)通过函数指针调用函数,调用格式如下:s=(*p)(实参);第8章 指针上一页上一页指向函数的指针的使用步骤返回第32页/共73页8.3 8.3 指针与数组8.3.1指向一维数组的指针数组名是一个常量指针,它的值为该数组的首地址1.指向数组的指针的定义方法与指向基本类型变量的指针的定义方法相同,例如:inta10=1,3,5,7,9;int*p;p=&a2;(把数组元素a2的地址赋给指针变量p)p=a;(把数组的首地址赋给指针变量p)下一页下一页 第8章 指针上一页上一页第33页/共73页vC C语言规定语言规定:数组名代表数组首地址,是一个地址常量。因此,下面两个语句等价:p=&a0;p=

27、a;下一页下一页 第8章 指针上一页上一页v在定义指针变量的同时可赋初值:在定义指针变量的同时可赋初值:int a10,*p=&a0;(或 int*p=a;)等价于:int *p;p=&a0;两句第34页/共73页指向数组的指针变量指向数组的指针变量p p&a013151719pa0:a9p9a+0p+1 或或 a+1p+9 或或 a+9*(a+9)或或*(p+9)下一页下一页 第8章 指针上一页上一页第35页/共73页2.2.通过指针引用数组元素 *p=5;p=5;表示对p p当前所指的数组元素赋以一个值5 5。C C规定:p+1p+1指向数组的下一元素(而不是将p p值简单地加1)1)。p

28、+1p+1意味着使p p的原值(地址)加d d个字节(d d为一个数组元素所占的字节数)。如果p的初值为&a0,则:(1)p+i和a+i就是ai的地址,或者说它们指向a数组的第i个元素(见下页图)。(2)*(p+i)或*(a+i)是p+i或a+i所指向的数组元素,即ai。(3)指向数组的指针变量也可以带下标,如pi与*(p+i)、ai等价。下一页下一页 第8章 指针上一页上一页第36页/共73页*(p+i)a数组数组a0a1a2aia9pp+1,a+1p+i,a+ip+9,a+9综上所述,引用一个数组元综上所述,引用一个数组元素有二法:素有二法:(1)下标法:如ai形式;(2)指针法:如*(a

29、+i)或*(p+i)。其中a是数组名,p是指向数组的指针变量,其初值p=a。下一页下一页 第8章 指针上一页上一页第37页/共73页例例8.5 8.5 用三种方法输出数组全部元素。用三种方法输出数组全部元素。下一页下一页 第8章 指针上一页上一页(1)(1)下标法main()int a10;int i;for(i=0;i10;i+)scanf(%d,&ai);printf(n);for(i=0;i10;i+)printf(%d,ai);第38页/共73页(2)通过数组名计算数组元素地址通过数组名计算数组元素地址,输出元素的值输出元素的值下一页下一页 第8章 指针上一页上一页main()int

30、a10;int i;for(i=0;i10;i+)scanf(%d,&ai);printf(n);for(i=0;i10;i+)printf(%d,*(a+i);第39页/共73页三种方法的比较:三种方法的比较:用下标法比较直观,能直接知道是第几个元素;用下标法比较直观,能直接知道是第几个元素;而用指针法则执行效率更高。而用指针法则执行效率更高。下一页下一页 第8章 指针上一页上一页(3)用指针变量指向数组元素main()int a10;int*p,i;for(i=0;i10;i+)scanf(%d,&ai);printf(n);for(p=a;p(a+10);p+)printf(%d,*p)

31、;第40页/共73页使用指针变量时,应使用指针变量时,应注意注意:(1)指针变量可实现使本身的值改变。)指针变量可实现使本身的值改变。P+合法;但合法;但a+不合法(不合法(a是数组名,代表数组是数组名,代表数组首地址,在程序运行中是固定不变的。)首地址,在程序运行中是固定不变的。)(2)要注意指针变量的当前值。)要注意指针变量的当前值。main()int a10;int*p,i;p=a;for(;pa+10;p+)scanf(%d,p);printf(n);for(;p(a+10);p+)printf(%d,*p);不能&p增加:p=a;下一页下一页 第8章 指针上一页上一页第41页/共73

32、页下一页下一页 第8章 指针上一页上一页 (3)*P+相当于相当于*(P+),因为),因为*与与+优先级相同,优先级相同,且结合方向从右向左,其作用是先获得且结合方向从右向左,其作用是先获得p指向变量指向变量的值,然后执行的值,然后执行p=p+1;(4)*(p+)与与*(+p)意义不同,后者是先意义不同,后者是先p=p+1,再获得,再获得p指向的变量值。指向的变量值。若若p=a,则则输输出出*(p+)是是先先输输出出a0,再再让让p指指向向a;输输出出*(+p)是是先先使使p指指向向a,再再输出输出p所指的所指的a。(5)()(*p)+表示的是将表示的是将p指向的变量值指向的变量值+第42页/

33、共73页8.3.2 8.3.2 二维数组与多维数组的指针表示法 1.二维数组的地址设有一个二维数组a,它有三行四列:inta34;数组名a:代表整个二维数组的首地址,也就是第0行的首地址。a+i:代表第i行的首地址。(见下页图)下一页下一页 第8章 指针上一页上一页第43页/共73页数组名a代表整个二维数组的首地址:a0a1a2a=19173111971523上图上图 a a数组包含三个元素数组包含三个元素:a0,a1,a2.a0,a1,a2.而每而每个元素又是一个一维数组个元素又是一个一维数组,它包含它包含4 4个元素个元素(即即4 4个列元个列元素素),),如如:a0a0又包含又包含:a0

34、0,a01,a02,a03.a00,a01,a02,a03.下一页下一页 第8章 指针上一页上一页第44页/共73页一维数组名ai:代表第i行的首地址,即第i行中第0列元素的地址(既&ai0)。ai+j:代表第i行中的第j个元素的地址,即为&aij。注意地址变化的单位数值在不同的场合的实际字节数是不同的:“a+1”中的“1”实际代表数组中一行元素所占的总字节数;“ai+1”中的“1”代表数组中一个元素所占的字节数。下一页下一页 第8章 指针上一页上一页第45页/共73页a+2 a数组a0a1a2aa+1(2000)(2008)(2016)a代表代表第第0行行的首地址的首地址,a+1代表第代表第

35、1行行的首地址的首地址,a+2代表第代表第2行的首地址行的首地址.每行存放每行存放4个整型数据个整型数据(即即1个元个元素占素占2个字节个字节),因此因此,这里这里+1的含义是的含义是:+4*2=+8个字节个字节.下一页下一页 第8章 指针上一页上一页第46页/共73页2000120023200452006720089201011201213201415201617201819202021202223aa+1a+2a0+1a0+2a0+3行地址行地址,元素地址的表示法元素地址的表示法下一页下一页 第8章 指针上一页上一页第47页/共73页例8.6 8.6 用指针表示法输出二维数组的各元素。#i

36、ncludemain()staticinta23=0,1,2,3,4,5;intk,j,*p;for(j=0;j2;j+)/*方式1*/for(k=0;k3;k+)printf(%5d,*(aj+k);/*aj是j行首地址,aj+k是j行k列元素的地址*/putchar(n);putchar(n);下一页下一页 第8章 指针上一页上一页第48页/共73页for(j=0;j2;j+)/*方式2*/for(k=0;k3;k+)printf(%5d,*(*(a+j)+k);/*(a+j)是j行首地址,*(a+j)+k是j行k列元素的地址*/putchar(n);p=a;/*p指向数组的第一个元素*/

37、for(j=0;j2;j+)/*方式3*/for(k=0;k=n)p+=n-1;/*指针指到要复制的第一个字符*/下一页下一页 第8章 指针上一页上一页第58页/共73页for(;*p!=0;p+,q+)*q=*p;*q=0;/*字符串以0结尾*/printf(Stringa:%sn,a);printf(Stringb:%sn,b);输入输入:3 输出输出:computer mputer考虑一下,若输出语句改为如下语句会如何?考虑一下,若输出语句改为如下语句会如何?printf(“string a is:%sn”,p);printf(“string b is%sn”,q);下一页下一页 第8章

38、 指针上一页上一页第59页/共73页8.4.2字符串数组字符串数组字字符符串串数数组组:是指数组中的每个元素都是一个存放字符串的数组。字符串数组可以用一个二维字符数组来存储。例如:charlanguge310;数组的第一个下标决定字符串的个数,第二个下标是字符串的最大长度(实际最多9个字符,0占一位置)。可以对字符串数组赋初值。例如:Char languge3 10;=“Basic”,“c+”,“pascal”第8章 指针上一页上一页返回第60页/共73页8.5.1 8.5.1 指针数组指针数组指针数组:是指针变量的集合。即它的每一个元素都是指针变量,且都具有相同的存储类别和指向相同的数据类型

39、。指针数组的定义形式为:类型标识符类型标识符 *数组名数组名 数组长度说明数组长度说明;例如:int*p10;由于比*的优先级高,因此p先与10结合成p10,而p10正是数组的定义形式,共有10个元素。最后p10与*结合,表示它的各元素可以指向一个整型变量。下一页下一页 第8章 指针上一页上一页8.5 8.5 指针数组与命令行参数第61页/共73页指针数组广泛应用于对字符串的处理指针数组广泛应用于对字符串的处理例如有定义:char*p3;定义了一个具有三个元素p0,p1,p2的指针数组。每个元素都可以指向一个字符数组,或字符串。若利用数组初始化,则:char*p3=“Basic”,“c+”,“

40、pascal”;P0指向字符串“Basic”;P0指向字符串“c+”;P0指向字符串“pascal”;下一页下一页 第8章 指针上一页上一页第62页/共73页例例8.9 8.9 字符指针数组的赋值字符指针数组的赋值#define NULL 0 main()static char a=“Fortran”;static char b=“COBOL”;static char c=“Pascal”;int i;char*p4;p0=a;p1=b;p2=c;p3=NULL;for(i=0;pi!=NULL;i+)printf(“Language%d is%sn”,i+1,pi);下一页下一页 第8章 指

41、针上一页上一页第63页/共73页例8.10 8.10 有若干本书,将书名按字典顺序排序#include#includemain()char*bname=ProgramminginANSIC,BASIC,VisualC+6.0Programming,TRUBOC2.0;inti,m;voidsort(char*name,int);m=sizeof(bname)/sizeof(char*);/*字符串个数*/sort(bname,m);/*排序,改变指针的连接关系*/printf(n);for(i=0;im;i+)/*输出排序结果*/printf(%8s,bnamei);下一页下一页 第8章 指针

42、上一页上一页第64页/共73页voidsort(char*name,intn)/*选择排序*/char*t;inti,j,k;/*k记录每趟最小值下标*/for(i=0;in-1;i+)k=i;for(j=i+1;j0)k=j;/*第j个元素更小*/if(k!=i)/*最小元素是该趟的第一个元素则不需交换*/t=namei;namei=namek;namek=t;输出结果为:BASIC Programming in ANSI C TRUBOC2.0VisualC+6.0Programming下一页下一页 第8章 指针上一页上一页第65页/共73页(1)字符数组中每个元素可存放一个字符,而字符指

43、针变量存放字符串首地址,而不是存放在字符指针变量中。(2)对字符数组,与普通数组一样,不能对其进行整体赋值,只能给各个元素赋值,而字符指针变量可以直接用字符串常量赋值。例如,若有如下定义:chara10;char*p;则语句a=”computer”;是非法的,因为数组名a是一个常量指针,不能对其赋值。只能对各个元素分别赋值:a0=c;a1=o;a2=m;a3=p;a7=r;但语句:p=”computer”;是合法的。下一页下一页 第8章 指针上一页上一页注意第66页/共73页8.5.2 8.5.2 指针数组与命令行参数在操作系统命令状态下,可以输入程序或命令使其运行,称命令行状态。输入的命令(

44、或运行程序)及该命令(或程序)所需的参数称为命令行参数。如:copy fd fs copy fd fs copycopy是文件拷贝命令,fdfd、fsfs是命令行参数。mainmain函数是可以有参数的,但与普通函数不同。带形参的main()main()函数的一般形式是:main(int argc,char*argv)main(int argc,char*argv)形参argcargc记录命令行中字符串的个数,argvargv是一个字符型指针数组,每一个元素顺序指向命令行中的一个字符串。下一页下一页 第8章 指针上一页上一页第67页/共73页1.main()1.main()函数的形参与实参函数

45、的形参与实参mainmain()函数由系统自动调用,而不是被程序内部的其它函数调用,main()main()函数所需的实参不可能由程序内部得到,而是由系统传送。mainmain()函数所需的实参与形参的传递方式也与一般函数的参数传递不同,实参是在命令行与程序名一同输入,程序名和各实际参数之间都用空格分隔。格式为:执行程序名 参数1 1 参数2 2 参数n n形参argcargc为命令行中参数的个数(包括执行程序名),其值大于或等于1 1,而不是象普通C C语言函数一样接受第一个实参。形参argvargv是一个指针数组,其元素依次指向命令行中以空格分开的各字符串。即:第一个指针argv0argv

46、0指向程序名字符串,argv1,argv1指向参数1 1,argv2argv2指向参数2 2,.,argvn argvn 指向参数n n。下一页下一页 第8章 指针上一页上一页第68页/共73页2.2.命令行参数的传递示例命令行参数的传递示例例8.11 8.11 分析下列程序,指出其执行结果,该程序命名为exam.c,exam.c,经编译连接后生成的可执行程序为exam.exeexam.exe#include#include main(int argc,char *argv )int i=0;printf(“argc=%dn”,argc);while (argc=1)printf(“n参数%d

47、:%s”,i,*argv);i+;argc-;argv+;下一页下一页 第8章 指针上一页上一页第69页/共73页输出结果:argc=4argc=4参数0 0:examexam参数1 1:Turbo_cTurbo_c参数2 2:C+C+参数3 3:VcVc程程序序开开始始运运行行后后,系系统统将将命命令令行行中中字字符符串串个个数数送送argc,argc,将将四四个个字字符符串串实实参参:examexam、Turbo_cTurbo_c、C+C+、VcVc的的首首地地址址分分别别传传给给字字符符指指针针数数组组元元素素argv0argv0、argv1argv1、argv2argv2、argv3a

48、rgv3。若运行该程序时的命令行输入的是:exam Turbo_c C+Vcexam Turbo_c C+Vc 第8章 指针上一页上一页返回第70页/共73页8.6 8.6 程序举例程序举例分析:(1)(1)将十进制数n n转换成r r进制数的方法是:n n除以r r取余数作为转换后的数的最低位。若商不为0,0,则商继续除以r,r,取余数作为次低位,以此类推,直到商为0 0为止。(2)(2)对 于 十 六 进 制 数 中 大 于 9 9的 六 个 数 字 是 用A,B,C,D,E,FA,B,C,D,E,F来表示。(3)(3)所得余数序列转换成字符保存在字符数组a a中。下一页下一页 第8章 指

49、针上一页上一页例8.12 8.12 输入一个十进制正整数,将其转换成二进制、八进制、十六进制数输出 第71页/共73页(4 4)字符0 0的asciiascii码是48,48,故余数0909只要加上4848就变成字符0 09 9了;余数中大于9 9的数10151015要转换成字母,加上5555就转换成A A、B B、C C、D D、E E、F F了。(5 5)由于求得的余数序列是低位到高位,而屏幕显示先显示高位,所以输出数组a a时要反向进行。第8章 指针上一页上一页点击点击查看程序请查看程序请输入:输入:Input radix(2,8,16):16 Input a positive integer:435678输出:输出:6A5DE运行返回第72页/共73页谢谢您的观看!第73页/共73页

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

当前位置:首页 > 应用文书 > PPT文档

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

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁