《第十二章指针》由会员分享,可在线阅读,更多相关《第十二章指针(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;124.53.43.124ab2000200220042008201220202021变量变量a变量变量b变量变量x变量变量y变量变量m变量变量ch1变量变量ch2一个地址唯一指向一个内存变一个地址唯一指向一个内存变
2、量,我们称这个地址为变量的量,我们称这个地址为变量的指针。如果将变量的地址保存指针。如果将变量的地址保存在内存的特定区域,用变量来在内存的特定区域,用变量来存放这些地址,这样的变量就存放这些地址,这样的变量就是指针变量,通过指针对所指是指针变量,通过指针对所指向变量的访问,也就是一种对向变量的访问,也就是一种对变量的变量的“间接访问间接访问”。紧掳孵西戳迟逻厄宝令把福块睛油从枪疹幽滞疵倔饲祭玛纺婴错噬锨赔避第十二章指针第十二章指针第十二章第十二章 指针指针124.53.43.124ab2000200220042008201220202021变量变量a变量变量b变量变量x变量变量y变量变量m变量
3、变量ch1变量变量ch21012pa100420122000200220042008202020211000100210061008101010141016pbpxpypmpch1pch2设一组指针变量设一组指针变量pa、pb、px、py、pm、pch1、pch2,分别指向上述的变量分别指向上述的变量a、b、x、y、m、ch1、ch2,指针变,指针变量也同样被存放在内存,二者的关系如图:量也同样被存放在内存,二者的关系如图:12.1指针与指针变量指针与指针变量乖俺屠诌贷蛙读近粒签绘试东短怯掌煎莎楷拳幸瑚继世错盅殆鞠犹臂沸仓第十二章指针第十二章指针第十二章第十二章 指针指针n指针定义的格式:指针
4、定义的格式: 类型说明符类型说明符 *指针名;指针名; n*表示这是一个指针变量,表示这是一个指针变量,变量名即为定义的指针变量名;变量名即为定义的指针变量名;类型说明符表示本指针变量所指向的变量的数类型说明符表示本指针变量所指向的变量的数据类型,也就是说一个指针变量只能指向同一据类型,也就是说一个指针变量只能指向同一类型的变量。类型的变量。如:如:int *p1;表示表示p1是一个指针变量,它的值是某个整型是一个指针变量,它的值是某个整型变量的地址。或者说变量的地址。或者说p1指向一个整型变量。至指向一个整型变量。至于于p1究竟指向哪一个整型变量,应由向究竟指向哪一个整型变量,应由向p1赋予
5、赋予的地址来决定。的地址来决定。12.2指针变量的定义与引用指针变量的定义与引用一、指针变量的定义一、指针变量的定义翱既瞬瓶浪荤洛光令鹃侨荒刊葫除战骡札陡慎馆尺授隘咐睹导字兵庇攒干第十二章指针第十二章指针第十二章第十二章 指针指针n赋值形式:赋值形式: & 变量名;变量名; :取地址符:取地址符&a表示变量表示变量a的地址,的地址,&b表示变量表示变量b的地址。变的地址。变量本身必须预先说明。量本身必须预先说明。n指针变量同普通变量一样,使用之前不仅要定指针变量同普通变量一样,使用之前不仅要定义说明,而且必须赋予具体的值。未经赋值的义说明,而且必须赋予具体的值。未经赋值的指针变量不能使用,否则
6、将造成系统混乱,甚指针变量不能使用,否则将造成系统混乱,甚至死机。至死机。 n指针变量的赋值只能赋予地址,决不能赋予任指针变量的赋值只能赋予地址,决不能赋予任何其它数据,否则将引起错误。何其它数据,否则将引起错误。 12.2指针变量的定义与引用指针变量的定义与引用二、指针变量的赋值二、指针变量的赋值凝婚压糯肥砒价涕氮涕胸侗探盏釜鬃肋多焦晋宵枫桅蝗负李运撒勋灿祭专第十二章指针第十二章指针第十二章第十二章 指针指针设有指向整型变量的指针变量设有指向整型变量的指针变量p,如要把整型变量,如要把整型变量a 的地址的地址赋予赋予p可以有以下两种方式:可以有以下两种方式:1)指针变量初始化的方法)指针变量
7、初始化的方法 int a; int *p=&a;2)赋值语句的方法)赋值语句的方法 int a; int *p; p=&a;n不允许把一个数赋予指针变量,下面的赋值是错误的:不允许把一个数赋予指针变量,下面的赋值是错误的: int *p; p=1000; n被赋值的指针变量前不能再加被赋值的指针变量前不能再加“*”说明符,如写为说明符,如写为*p=&a 也是错误的。也是错误的。12.2指针变量的定义与引用指针变量的定义与引用二、指针变量的赋值二、指针变量的赋值瘤倪陇馏祥嘴浪垒耙傍吮帖备业冯伤知厚期直岩碑玛哪巳碾姬亢吩纱返她第十二章指针第十二章指针第十二章第十二章 指针指针n指针变量只能进行赋值
8、运算和部分算术运算及指针变量只能进行赋值运算和部分算术运算及关系运算。关系运算。(1)取地址运算符取地址运算符&:是单目运算符,其结合性为:是单目运算符,其结合性为自右至左,其功能是取变量的地址。自右至左,其功能是取变量的地址。(2)取内容运算符取内容运算符*:是单目运算符,其结合性为:是单目运算符,其结合性为自右至左,用来表示指针变量所指的变量。在自右至左,用来表示指针变量所指的变量。在“*”运算符之后跟的变量必须是指针变量。运算符之后跟的变量必须是指针变量。n注意:在指针变量说明中,注意:在指针变量说明中,“*”是类型说明符,是类型说明符,表示其后的变量是指针类型。而表达式中出现表示其后的
9、变量是指针类型。而表达式中出现的的“*”则是一个运算符用以表示指针变量所指则是一个运算符用以表示指针变量所指的变量。的变量。12.2指针变量的定义与引用指针变量的定义与引用二、指针变量的运算二、指针变量的运算涤医吩称骑窗抵霉屯拈火吊听省卒鬃薛傍猿樊将刮值弟裁落琐碳傈堑莹漓第十二章指针第十二章指针第十二章第十二章 指针指针例例12.1指针变量程序举例指针变量程序举例。main( ) int *p1,*p2,i1,i2; scanf(“%d, %d”,&i1,&i2); p1=&i1; p2=&i2; printf(“%d, %dn”,*p1,*p2); p2=p1; printf(“%d, %d
10、n”,*p1,*p2); 若输入:若输入: 3,5则输出:则输出: 3,5 3,312.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(%d,%dn,a
11、,b) ;12.2指针变量的定义与引用指针变量的定义与引用二、指针变量的运算二、指针变量的运算床虏疤乳炙饶邑蚂辩有桥吊豫孕蕉沦拽讣蚕沃泌脏翻妄征屑娜捂仓蝴篇厘第十二章指针第十二章指针第十二章第十二章 指针指针n使用指针类型做函数的参数,实际向函使用指针类型做函数的参数,实际向函数传递的是变量的地址。由于函数中获数传递的是变量的地址。由于函数中获得了所传递变量的地址,在该地址空间得了所传递变量的地址,在该地址空间的数据当函数调用结束后被物理地保留的数据当函数调用结束后被物理地保留下来。因此,如果希望函数间传递的是下来。因此,如果希望函数间传递的是地址,实参用变量的地址或指针变量,地址,实参用变量
12、的地址或指针变量,形参用指针变量。形参用指针变量。12.3指针变量做函数的参数指针变量做函数的参数住筷刊陀挚包滤剃槛粕腊持纪剐疙捌烦食嘻请泛汲狸嘿蚁受毗硷皂瞒远及第十二章指针第十二章指针第十二章第十二章 指针指针例例12.3 利用指针变量作为函数的参数,用函数的方法再利用指针变量作为函数的参数,用函数的方法再次实现上述功能。次实现上述功能。main ( ) void change(); int *p1,*p2,a,b,*t; scanf(%d,%d,&a,&b) ; p1=&a; p2=&b; change(p1,p2); / *函数调用函数调用* / printf(%d,%dn,*p1,*p
13、2);void change(int *pt1,int *pt2) int t; if(*pt1*pt2) t=*pt1;*pt1=*pt2;*pt2=t; return; 12.3指针变量做函数的参数指针变量做函数的参数稼虾涎傲介汞音兑篙慑赌页羽壶绵愈织屿剥辛陆艰童祝束毯秦傍呜岿供肄第十二章指针第十二章指针第十二章第十二章 指针指针n指向数组元素的指针变量的定义与指向变量的指向数组元素的指针变量的定义与指向变量的指针变量的定义相同指针变量的定义相同如:如:int a10;int *p;n对该指针元素赋值:对该指针元素赋值:p=&a0;把把a0元素的地址赋给指针变量元素的地址赋给指针变量p,即
14、,即p指向指向a数数组的第组的第0号元素,号元素,n数组名代表数组的首地址,也就是第一个元素数组名代表数组的首地址,也就是第一个元素的地址。因此,的地址。因此,p=&a0;与;与p=a;等价。;等价。 12.4指针与数组指针与数组一、指向数组元素的指针变量的定义与赋值一、指向数组元素的指针变量的定义与赋值蛹封奥糯薪厚博铃曳赫仲柯爹鼻若磁吝宜趾熬佬潞蒋肄颠猖屑思燥痞极萨第十二章指针第十二章指针第十二章第十二章 指针指针n在定义指针变量时可以赋给初值:在定义指针变量时可以赋给初值:int *p=&a0;它等效于:;它等效于:int *p;p=&a0;n定义时也可以写成:定义时也可以写成:int *
15、p=a;n它的作用是将它的作用是将a的首地址(即的首地址(即a0的地址)赋给的地址)赋给指针变量指针变量p(而不是(而不是*p)。)。12.4指针与数组指针与数组一、指向数组元素的指针变量的定义与赋值一、指向数组元素的指针变量的定义与赋值夫狼哈呜跟短氮剥撑葫蝎漂子努帖凹右程退廉游悟档奠兄昨燕川几赁赁夜第十二章指针第十二章指针第十二章第十二章 指针指针n设设p已定义为指针变量,并已给它赋了一个地址,使它已定义为指针变量,并已给它赋了一个地址,使它指向某一个数组元素。如果有以下赋值语句:指向某一个数组元素。如果有以下赋值语句: *p=1;n表示对表示对p当前所指向的数组元素赋以一个值(值为当前所指
16、向的数组元素赋以一个值(值为1)。)。nC规定规定p1指向数组的下一个元素指向数组的下一个元素(而不是将而不是将p值简单地值简单地加加1)。如,数组元素是实型,每个元素占如,数组元素是实型,每个元素占4个字节,则个字节,则p1意意味着使味着使p的原值(地址)加的原值(地址)加4个字节,以使它指向下一元个字节,以使它指向下一元素。素。p1所代表的地址值实际上是所代表的地址值实际上是p1 d,d是一个数是一个数组元素所占的字节数(对整型,组元素所占的字节数(对整型,d=2;对实型,;对实型,d4;对字符型,对字符型,d1)。)。12.4指针与数组指针与数组二、通过指针引用数组元素二、通过指针引用数
17、组元素振欺罢观脂崩姐扮梨集知恋馈断伴谭刃曰梢瞎悸斟呻唾灌广戒火缆涪挎浅第十二章指针第十二章指针第十二章第十二章 指针指针n如果如果p的初值为的初值为a0 ,则:,则: (1) pi和和ai就是就是ai的地址,或者说,它们指向的地址,或者说,它们指向a数组的数组的第第i个元素。个元素。(2) *(pi)或或*(ai)是是pi或或ai所指向的数组元素,即所指向的数组元素,即ai。 (3)指向数组的指针变量也可以带下标,如指向数组的指针变量也可以带下标,如pi与与*(pi)等等价。价。(4)当指针指向一串连续的存储单元时,可以对指针进行加当指针指向一串连续的存储单元时,可以对指针进行加上或减去一个整
18、数,这种操作称为指针的移动。上或减去一个整数,这种操作称为指针的移动。 (5)指针不允许进行乘、除运算,移动指针时,不允许加上指针不允许进行乘、除运算,移动指针时,不允许加上或减去一个非整数,对指向同一串连续存储单元的两个或减去一个非整数,对指向同一串连续存储单元的两个指针只能进行相减操作。指针只能进行相减操作。12.4指针与数组指针与数组二、通过指针引用数组元素二、通过指针引用数组元素漓田襄歹芝掩朵勤赫毫毗吁抚壹艰易午硷掺醒抢图余蒜钨宛霉嗜宇射翼浅第十二章指针第十二章指针第十二章第十二章 指针指针例例12.4从键盘输入从键盘输入10个整数,存放在数组中,并输出数个整数,存放在数组中,并输出数
19、组的全部元素。用指针变量指向数组元素。组的全部元素。用指针变量指向数组元素。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指针与数组指针与数组二、通过指针引用数组元素二、通过指针引用数组元素犯移犁拍玩未嘿坝景你阿承臭崭憨书驮窜呀唬裁寸盟都些锯霍繁读家屑摧第十二章指针第十二章指针第十二章第十二章 指针指针n注意:注意:(1)用用p使使p的值不断改变,这是合法的,如果的值不断改变,这是合法的,如果不用不用p而企图使而企图使a变化是不行的,如将上述程
20、序变化是不行的,如将上述程序的最后两行改为:的最后两行改为: 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;i10;i) scanf (%d,p); for(i=0;i10;i ,p
21、) printf (%d ,*p); printf (n);输入:输入:1 2 3 4 5 6 7 8 9 0运行结果运行结果:22153 234 0 0 30036 25202 11631 8259 8237 2848312.4指针与数组指针与数组二、通过指针引用数组元素二、通过指针引用数组元素解决这个问题的办法是在第二个解决这个问题的办法是在第二个for循环改为如下形式:循环改为如下形式:for(i=0,p=a;i10;i,p) printf(%d,*p);惑浪艘矢眩鲜掂蕊瘦盗眨越乓峙捶寞光哪错奠罢筋低嘴孜雍充陡知辕乒地第十二章指针第十二章指针第十二章第十二章 指针指针(3)注意指针变量的
22、运算。如果先使注意指针变量的运算。如果先使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(即(
23、即a0),输出),输出*(p+)时,得)时,得a0 的值,而输出的值,而输出*(+p),则得到),则得到a1的值。的值。12.4指针与数组指针与数组二、通过指针引用数组元素二、通过指针引用数组元素妮杆斗恬牧脚拴定奴口蕉惭墓愧渣规羚夹阂髓悉捂倦岂诊仁友杭漆挣锈钟第十二章指针第十二章指针第十二章第十二章 指针指针(*p)+表示表示p所指向元素值加所指向元素值加1,即,即(a0)+,如果如果a0=3,则执行,则执行(a0)+后,后,a0的值为的值为4。注意,是元素值加注意,是元素值加1,而不是指针值加,而不是指针值加1。如果当前如果当前p指向指向a数组中第数组中第i个元素,则:个元素,则: *(p-
24、)相当于相当于ai-,先取,先取p值作值作“*”运算,再使运算,再使p自减。自减。 *(+p)相当于相当于a+i,先使,先使p自加,再作自加,再作*运算。运算。 *(-p)相当于相当于a-i,先使,先使p自减,再作自减,再作*运算。运算。12.4指针与数组指针与数组二、通过指针引用数组元素二、通过指针引用数组元素迟著陷孝累屑吕靛苏钵眷姻芒兆庆摘车砷演辰柏案帖蟹懦腹若芳亭灵潭累第十二章指针第十二章指针第十二章第十二章 指针指针n数组名可以用作函数的实参传给形参。由于数数组名可以用作函数的实参传给形参。由于数组名是一个地址值,对应的形参就应该是数组组名是一个地址值,对应的形参就应该是数组名或一个指
25、针变量,但该指针必须与数组类型名或一个指针变量,但该指针必须与数组类型一致。一致。 12.4指针与数组指针与数组三、数组名做函数参数三、数组名做函数参数 main ( ) f(int *arr) int array10 f(array) 如:如:输父四应瞄辫馅赣封逼氢麓甭彪妇庆镀屈妥瓢化像亚沫氧脾罚饼骸咐将冶第十二章指针第十二章指针第十二章第十二章 指针指针n数组名作为实参时,对应的函数首部可以写成数组名作为实参时,对应的函数首部可以写成如下三种形式:如下三种形式:nf( int *arr ) n f( int arr10 ) n f( int arr )12.4指针与数组指针与数组三、数组名
26、做函数参数三、数组名做函数参数犯桥狈馅刁呈在聚氧纸妥犬举顽镜殉毁素鞋簇贷医兆曹勺檬嫡临伤吧膜棍第十二章指针第十二章指针第十二章第十二章 指针指针例例12.6有一个一维数组有一个一维数组score,内存放,内存放10个学生成绩,求个学生成绩,求平均成绩。平均成绩。float average(float * array) int i;float aver ,sum=0; for (i=0;i10;i) sum=sumarrayi; aver=sum/10; return (aver);main ( ) float score10,ave ; int i; printf (Input 10 scor
27、es:n); for (i=0;i10;i) scanf(%f,&scorei); printf (“n”); ave=average (score); printf (Average score is %5.1f,ave);运行情况如下:运行情况如下: Input 10 scores: 100 56 78 98.5 76 87 99 67.5 75 97运行结果:运行结果: Average score is 83.4012.4指针与数组指针与数组三、数组名做函数参数三、数组名做函数参数馋稻臻绣厦烽叹鸽农措团辨定帜脆敞铁海凌蓑舞砷具涌苟郧帐愤仪雕猩拳第十二章指针第十二章指针第十二章第十二章 指
28、针指针例例12.7有程序如下:有程序如下:float 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 (Baver
29、age:%6.2fn“,average (score_2,10);运行结果如下:运行结果如下: Aaverage :80.40 Baverage :78.2012.4指针与数组指针与数组三、数组名做函数参数三、数组名做函数参数猾茬渤鹃糠饼突拘份刁梧岛县叮蕊怖笛霉犬氦噎扳莱宰避拾荤沮株滞袄墩第十二章指针第十二章指针第十二章第十二章 指针指针例例12.8定义长度为定义长度为10的整型类型一维数组,并将数组中的整型类型一维数组,并将数组中的元素按逆序存放后输出其值的元素按逆序存放后输出其值(完成逆序存放操作时,完成逆序存放操作时,只允许开辟一个临时存储单元只允许开辟一个临时存储单元)。 main (
30、 ) 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(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指针与数组指针与数组三、数组名做函数参数三、数组名做函数参数丰逊汐婴开拜适易守作鄂迸扼活峨坝炙腻结哮蛙喜弯忠张猩讲炕商出楔邑第十二章指针第十二章指针第十二章第十二章 指针指针例例1
31、2.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) printf(%4d,ai); printf(n);del(int a10,int t ) int i,j; for(i=0;i10;i) i
32、f(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) i
33、nt i,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,
34、5,7,9,11,13,15,17,19; printf(“Input x:n”); scanf(%d,&x); for(i=0;i10;i)printf (%4d,ai); printf(“n”); insert(a,x); for(i=0;i11;i)printf (%4d,ai); printf(n);insert(int *a,int x) int i,j; i=0; while(i10 &ai=i;j) aj1=aj; ai=x;12.4指针与数组指针与数组三、数组名做函数参数三、数组名做函数参数柬秃俏踌痕拴概钩尺摧激拧释孩嘱长管陷使握翼螺往输耀层带蘸哄全抚崖第十二章指针第十二章指针
35、第十二章第十二章 指针指针例例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; retur
36、n max;12.4指针与数组指针与数组三、数组名做函数参数三、数组名做函数参数呸易茸念诱舷启讳性恶夷占诵岿赊届脂川敞椿嵌性妒棠卖贿札冒讨营缸贩第十二章指针第十二章指针第十二章第十二章 指针指针n设已定义二维数组设已定义二维数组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行行(地址为(地址为
37、2008)。)。(3)a0,a1,a2是二维数组中三个一维数组(即三行)是二维数组中三个一维数组(即三行)的名字,因此它们也是地址的名字,因此它们也是地址(分别是分别是0行,行,1行,行,2行的首行的首地址地址)。 (4)ai+j是是i行行j列元素的地址,列元素的地址,*(ai+j)是是i行行j列元素的列元素的值。值。 (5)ai与与*(ai)无条件等价,这两种写法可以互换。无条件等价,这两种写法可以互换。 12.4指针与数组指针与数组四、指向多维数组的指针和指针变量四、指向多维数组的指针和指针变量更氖铣涉留很婆蹈稀苗距育生拘贰场敝奖展枪涸耿舔强淋汲橙右骋酗循攀第十二章指针第十二章指针第十二章
38、第十二章 指针指针(6)aij,*(aij),*(*(ai)j)都是都是i行行j列元素的值。列元素的值。(7)区别行指针与列指针的概念。例如)区别行指针与列指针的概念。例如a1和和a1都代表地址都代表地址2008。但。但a1是行指针。它指向是行指针。它指向一个一维数组。一个一维数组。a1(即即*(a1)是列指针,它指是列指针,它指向一个元素,它是向一个元素,它是1行行0列元素的地址。列元素的地址。(8)可以定义指向一维数组的指针变量,)可以定义指向一维数组的指针变量, 如:如:int (*p)4;/*称称p为行指针为行指针*/ 定义定义p为指向一个含为指向一个含4个元素的一维数组的指针个元素的
39、一维数组的指针变量。变量。 12.4指针与数组指针与数组四、指向多维数组的指针和指针变量四、指向多维数组的指针和指针变量泄恰产加赖庙买鸿茎舱梭咱遂称羚连半柑蛔何奸象乍车害藐昌网禁脊银侈第十二章指针第十二章指针第十二章第十二章 指针指针main ( ) int a34; int * p1,(*p2)4; p1=&a34;/*p1是列指针是列指针*/ p2=a1;/*p2是行指针是行指针*/不能写成:不能写成:p1=a1;p2=&a34; /*类型不一致类型不一致*/12.4指针与数组指针与数组四、指向多维数组的指针和指针变量四、指向多维数组的指针和指针变量厦羞熟藐县棍长僳腆蹬恨并被淳骸饶谁痴呵铺
40、柒疤晚呀衡琵秀慨茧饶吮年第十二章指针第十二章指针第十二章第十二章 指针指针12.5 字符串的指针和指向字符串的指针变量字符串的指针和指向字符串的指针变量一、字符串的表示形式一、字符串的表示形式n可以用两种方法实现一个字符串:可以用两种方法实现一个字符串:1.用字符数组实现用字符数组实现例例12.13用字符数组实现的示例。用字符数组实现的示例。main ( ) char string = I love China! ; printf(%sn,string);string是数组名,它代表字符数组的首地址是数组名,它代表字符数组的首地址 烛国汁揪竭兄少欢令敝萝屈旺和媳掀范抿启江蕉十禹勉呐振爹祭缓浮吁
41、寞第十二章指针第十二章指针第十二章第十二章 指针指针2.用字符指针实现用字符指针实现可以不定义数组,而定义一个字符指针。用字符指针指向可以不定义数组,而定义一个字符指针。用字符指针指向字符串中的字符。字符串中的字符。例例12.14用字符指针实现的示例。用字符指针实现的示例。main ( ) char *string= I love China! ; printf(%sn,string);注意:注意:在内存中,字符串的最后被自动加了一个在内存中,字符串的最后被自动加了一个0 ,因此在输出时能确定字符串的终止位置。通过字符数组因此在输出时能确定字符串的终止位置。通过字符数组名或字符指针变量可以输出
42、一个字符串,而对一个数值名或字符指针变量可以输出一个字符串,而对一个数值型数组,是不能企图用数组输出它的全部元素的,只能型数组,是不能企图用数组输出它的全部元素的,只能逐个元素输出。逐个元素输出。12.5 字符串的指针和指向字符串的指针变量字符串的指针和指向字符串的指针变量一、字符串的表示形式一、字符串的表示形式胰咳辞试脉狗兹厨略制郭悍辕墙世股绦禾括谦推慷帅攫坊评宅曾懂您崖噎第十二章指针第十二章指针第十二章第十二章 指针指针例例12.15将字符串将字符串a复制到字符串复制到字符串b(用指针变量来处理)。(用指针变量来处理)。main ( ) char a = I am a boy. ,b20,
43、*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 字符串的指针和指向字符串的指针变量字符串的指针和指向字符串的指针变量一、字符串的表示形式一、字符串的表示形式薯磐钝哪逐暑皮棚襄磁霄秘抢蓟戚幻鸥企捧苏媳咯俩楷沁丢刮界晋语级薪第十二章指针第十二章指针第十二章第十二章 指针指针字符数组与字符指针变量的区别:字符数组与字符指针变量的区
44、别:(1)字符数组由若干个元素组成,每个元素存放一个字符,)字符数组由若干个元素组成,每个元素存放一个字符,而字符指针变量中存放的是地址(字符串的首地址),而字符指针变量中存放的是地址(字符串的首地址),决不是将字符串放到字符指针变量中。决不是将字符串放到字符指针变量中。(2)对字符数组只能对各个元素赋值,不能用以下办法对)对字符数组只能对各个元素赋值,不能用以下办法对字符数组赋值。字符数组赋值。 char str14; str=I love China!; 而对字符指针变量,可以采用下面方法赋值:而对字符指针变量,可以采用下面方法赋值: char *a; a=I love China! ;
45、但注意赋给但注意赋给a的不是字符串,而是字符串的首地址。的不是字符串,而是字符串的首地址。12.5 字符串的指针和指向字符串的指针变量字符串的指针和指向字符串的指针变量二、字符指针变量与字符数组二、字符指针变量与字符数组平季逻减闭融钠滴植缩帽单宇曝梆乖鲸女惜渗竟贬益给衅蝇碰信豆垒翠哟第十二章指针第十二章指针第十二章第十二章 指针指针(3)对字符指针变量赋初值时:)对字符指针变量赋初值时:char*a=I love China! ; 等价于:等价于:char*a; a=I love China! ;而对数组初始化时:而对数组初始化时:char str14= I love China! ;不等价于
46、:不等价于:char str14; str =I love China! ;即数组可以在变量定义时整体赋初值,但不能在即数组可以在变量定义时整体赋初值,但不能在赋值语句中整体赋值。赋值语句中整体赋值。 12.5 字符串的指针和指向字符串的指针变量字符串的指针和指向字符串的指针变量二、字符指针变量与字符数组二、字符指针变量与字符数组鸡故隐唆喷哦凳动芹乌脂疤涵仔省休攫卷藐差听请咀哄彻蚕栈钩碴峰鞍褂第十二章指针第十二章指针第十二章第十二章 指针指针(4)在定义一个数组时,在编译时即已分配内存)在定义一个数组时,在编译时即已分配内存单元,有固定的地址。而定义一个字符指针变单元,有固定的地址。而定义一个
47、字符指针变量时,给指针变量分配内存单元,在其中可以量时,给指针变量分配内存单元,在其中可以存放一个地址值,也就是说,该指针变量可以存放一个地址值,也就是说,该指针变量可以指向一个字符型数据,但如果未对它赋以一个指向一个字符型数据,但如果未对它赋以一个地址值,则它并未具体指向哪一个字符数据。地址值,则它并未具体指向哪一个字符数据。如:如:char str 10;scanf (%s,str); 是可以的,而下面的形式是错误的:是可以的,而下面的形式是错误的:char * a;scanf(“%s”,a);(5)指针变量的值是可以改变的。)指针变量的值是可以改变的。12.5 字符串的指针和指向字符串的
48、指针变量字符串的指针和指向字符串的指针变量二、字符指针变量与字符数组二、字符指针变量与字符数组挣一陈薯弃札糯翅痈疗湛拴劝武瓤杏庭姨厅慑欠政靖署讼诣甜勤逢琐蛆付第十二章指针第十二章指针第十二章第十二章 指针指针例例12.16程序示例。程序示例。main ( ) char a=“I love China! ”; /*a指向存放字符指向存放字符I的存储单元的存储单元*/ a=a7; /*a指向存放字符指向存放字符C的存储单元的存储单元*/ printf(%s,a); /*将输出将输出China! /*数组名代表一个固定的地址,它的值是不能改变的。数组名代表一个固定的地址,它的值是不能改变的。说明:说
49、明:定义一个指针变量并使它们指向一个字符串后,定义一个指针变量并使它们指向一个字符串后,也可以用下标形式引用指针所指的字符串中的字符也可以用下标形式引用指针所指的字符串中的字符(与与前面介绍的数组类似前面介绍的数组类似)。 12.5 字符串的指针和指向字符串的指针变量字符串的指针和指向字符串的指针变量二、字符指针变量与字符数组二、字符指针变量与字符数组得瓜杰嘱蠕秀库搪镊鲍楼氧赂葫绘缔便摇氨氓您二斌瓜部类冤惟帕豹兢闰第十二章指针第十二章指针第十二章第十二章 指针指针(6) 不要随意使用无确定指向的指针。有时为了防不要随意使用无确定指向的指针。有时为了防止无确定指向的指针破坏有用数据,给暂时不止无
50、确定指向的指针破坏有用数据,给暂时不用的指针赋用的指针赋NULL。如:如:int *p;p=NULL;其中其中NULL是在文件是在文件stdio.h中定义的符号常量,它中定义的符号常量,它的代码值为的代码值为0,这时称,这时称p为空指针。为空指针。以下三种写法等价:以下三种写法等价:p=NULL; p=0; p=0;使用使用NULL时,应在程序的开头加时,应在程序的开头加#include。当企图通过空指针访问一。当企图通过空指针访问一个存储单元时,将显示一个出错信息。个存储单元时,将显示一个出错信息。12.5 字符串的指针和指向字符串的指针变量字符串的指针和指向字符串的指针变量二、字符指针变量
51、与字符数组二、字符指针变量与字符数组钳酸雁娇笼且宇抑伴尹剿网臻锣蹬宋郊吏吩事专棍梅枫猛池遁怒犁挺惯筏第十二章指针第十二章指针第十二章第十二章 指针指针n将一个字符串从一个函数传递到另一个将一个字符串从一个函数传递到另一个函数,可以用地址传递的办法,即用字函数,可以用地址传递的办法,即用字符数组名或用指向字符串的指针变量作符数组名或用指向字符串的指针变量作参数。和数组一样,函数的首部有三种参数。和数组一样,函数的首部有三种说明形式,而且形参也是指针变量。在说明形式,而且形参也是指针变量。在被调用的函数中可以改变字符串的内容,被调用的函数中可以改变字符串的内容,在主调函数中可以得到改变了字符串。在
52、主调函数中可以得到改变了字符串。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( ;
53、pq ;p,q) t=*p;*p=*q;*q=t; 运行结果是:运行结果是:asdfgh 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表示共移动几个存储单元表示共移动几个存储单元*/运行结果是运行结果是asdfgh回车回车asdfgh 612.6 字符串指针做函数参数字符串指针做函数参数让
54、污拢牌皿累恰舅盐沉剿昆热扶淋泄衡岗蝴缮仪傣描疙搔拯棒鞍咒挨役嘴第十二章指针第十二章指针第十二章第十二章 指针指针例例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) whil
55、e(*s1!=0) s1; while(*s2!=0) *s1=*s2;s1 ;s2; *s1=0;运行情况:运行情况:Input string 1:country回车回车 Input string 2:side 回车回车 New string :countryside 12.6 字符串指针做函数参数字符串指针做函数参数帛决翔夫堰明较起嘎好祟鼓甩捎遮歉凉牙兰濒咬盗扩淹侗邢沮陡札镐崔缘第十二章指针第十二章指针第十二章第十二章 指针指针例例12.20编写一个程序,将字符数组编写一个程序,将字符数组from中的全部字符拷贝到字符数中的全部字符拷贝到字符数组组to中。不要用中。不要用strcpy函数。
56、拷贝时,函数。拷贝时,0也要拷贝过去。也要拷贝过去。0后后面的字符不拷贝。面的字符不拷贝。#includestdio.h#includestring.hmain ( ) char from 80 ,to80; printf(Input,string:); scanf(%s,from); strcopy(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回车回
57、车Copied string :student 12.6 字符串指针做函数参数字符串指针做函数参数扯莽识柳济蜜缩仲贡块些宇簇寥尘系跌罕辱绪汪洱从啤摆螟函俐睫支孝选第十二章指针第十二章指针第十二章第十二章 指针指针例例12.21编写一个程序,比较字符数组编写一个程序,比较字符数组s1和和s2。不要用。不要用strcmp函数。函数。#includestdio.hmain ( )int a; char s180,s280; gets (s1);gets(s2);puts(s1);puts(s2); a=strcomp(s1,s2); if(a0) printf(s1:%s)(s2:%s)n,s1,s
58、2); 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 字符串指针做函数参数字符串指针做函数参数呛络申姿舅摈增讨吧捞佯政暮漾湘翠卑筐岔径娶祈聪成张泵扰风酵孤榨僳第十二章指针第十二章指针第十二章第十二章 指针指针n可以用指针
59、变量指向整型变量、字符串、可以用指针变量指向整型变量、字符串、数组,也可以指向一个函数。一个函数数组,也可以指向一个函数。一个函数在编译时被分配一个入口地址。这个入在编译时被分配一个入口地址。这个入口地址就称为函数时的指针。可以用一口地址就称为函数时的指针。可以用一个指针变量指向函数,然后通过该指针个指针变量指向函数,然后通过该指针变量调用此函数。变量调用此函数。12.6 字符串指针做函数参数字符串指针做函数参数一、用函数指针变量调用函数一、用函数指针变量调用函数 骄隅尿拇脖秧涵英非扒绥崔宗呢恰恢晋秒壤渊羽忌琶虏嵌兑焙宰阜悟诀搔第十二章指针第十二章指针第十二章第十二章 指针指针main ( )
60、 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);main ( ) int max (int ,int ); int (*p) (int ,int ); int a,b,c; p=max; scanf (“%d,%d”,&a,&b); c=(*p)(a,b)
61、; printf(max=%dn ,c);int max (int x,int y)/*定义定义max函数函数*/ int z; if(xy) z = x; else z=y; return (z);12.6 字符串指针做函数参数字符串指针做函数参数一、用函数指针变量调用函数一、用函数指针变量调用函数 雍每狮狂明鸟拎蹿犊桌谚脓滨悄匹望父殴盈叛丫爆艇涤疮耍院脯腿昏茫凰第十二章指针第十二章指针第十二章第十二章 指针指针n说明:说明:(1)指向函数的指针变量的一般定义形式为:指向函数的指针变量的一般定义形式为: 数据类型标识符数据类型标识符 (*指针变量名指针变量名)(类型参数类型参数1,类型参数类
62、型参数2, .) “数据类型标识符数据类型标识符”是指函数返回值的类型,旧版本允许是指函数返回值的类型,旧版本允许省略后一括号中的内容。省略后一括号中的内容。(2) 函数的调用可以通过函数名调用。也可以通过函数指函数的调用可以通过函数名调用。也可以通过函数指针调用针调用(即用指向函数的指针变量调用即用指向函数的指针变量调用)。(3) (*p)(int,int )表示定义一个指向函数的指针变量,它表示定义一个指向函数的指针变量,它不是固定指向哪一个函数的,而只是表示定义了这样一不是固定指向哪一个函数的,而只是表示定义了这样一个类型的变量,它是专门用来存放函数的入口地址。在个类型的变量,它是专门用
63、来存放函数的入口地址。在程序中把哪一个函数的地址赋给它,它就指向哪一个函程序中把哪一个函数的地址赋给它,它就指向哪一个函数。数。12.6 字符串指针做函数参数字符串指针做函数参数一、用函数指针变量调用函数一、用函数指针变量调用函数 氛刹答廷衔难推贱违浩俱冰鄙奶议办白詹六阑拎股毋苛沉咨熙澄尼垛焦叮第十二章指针第十二章指针第十二章第十二章 指针指针(4) 在给函数指针变量赋值时,只需要给出函数名在给函数指针变量赋值时,只需要给出函数名而不必给出参数。如:而不必给出参数。如: p=max;因为是将函数入口地址赋给因为是将函数入口地址赋给p,而不牵涉到实参,而不牵涉到实参与形参的结合问题。不能写成与形
64、参的结合问题。不能写成“ p=max (a,b);”形式。形式。(5) 用函数指针变量调用函数时,只需将(用函数指针变量调用函数时,只需将(*p)代)代替函数名即可(替函数名即可(p为指针变量名),在(为指针变量名),在(*p)之)之后的括弧中根据需要写上实参,后的括弧中根据需要写上实参, (6)对指向函数的指针变量,象对指向函数的指针变量,象p+n、p+、p-等等运算无意义的。运算无意义的。(7)函数指针变量常用的用途之一是把指针作为参函数指针变量常用的用途之一是把指针作为参数传递到其它函数。数传递到其它函数。12.6 字符串指针做函数参数字符串指针做函数参数一、用函数指针变量调用函数一、用
65、函数指针变量调用函数 落茂颅念牲纵纶房北狙握爆盟绥箱职某证付欲驯须郧磅念莎愚忽嗣省灵宾第十二章指针第十二章指针第十二章第十二章 指针指针n函数的指针变量也可以作为参数,以便实现函函数的指针变量也可以作为参数,以便实现函数地址的传递,也就是将函数名传给形参。数地址的传递,也就是将函数名传给形参。n它的原理可以简述如下:有一个函数(假设函它的原理可以简述如下:有一个函数(假设函数名为数名为sub),它有两个形参(),它有两个形参(x1和和x2),定义),定义x1和和x2为指向函数的指针变量,在调用函数为指向函数的指针变量,在调用函数sub时,实参用两个函数名时,实参用两个函数名f1和和f2给形参传
66、递函数地给形参传递函数地址,这样在函数址,这样在函数sub中就可以调用中就可以调用f1和和f2函数了。函数了。12.6 字符串指针做函数参数字符串指针做函数参数二、把指向函数的指针变量作为函数参数二、把指向函数的指针变量作为函数参数 绊逗石搭黄素头抚陵果踌厚榨攫企摩调溪规沽填蚁诌妒敦七魔训啪劫虾呵第十二章指针第十二章指针第十二章第十二章 指针指针n一个函数不仅可以带回简单类型的数据,而且一个函数不仅可以带回简单类型的数据,而且可以带回指针型的数据,即地址。可以带回指针型的数据,即地址。如:如:#include stdio.hchar *fun (char *);/*指针类型也要原型说明指针类型
67、也要原型说明*/main ( ) char ch =a ,*p,*q; p=&ch; q=fun(p);/*调用结束后调用结束后q才有确定的指向,相当才有确定的指向,相当于于q=bag;*/ puts (q)char * fun (char *s) char *t=big; *( t1 )*s;/* *s相当于主函数中的相当于主函数中的*p即即ch*/ return t ;/*返字符串的首地址返字符串的首地址*/输出结果是:输出结果是:bag12.7 返回指针值的函数返回指针值的函数盂令陋砚捧焊臻踊喻他捡浓痴气垒剖铺攘嘎枝误篡凶魂隶万羌矗趁亡捧货第十二章指针第十二章指针第十二章第十二章 指针指
68、针n一个数组,其元素均为指针类型数据,称为指一个数组,其元素均为指针类型数据,称为指针数组,也就是说,指针数组中的每一个元素针数组,也就是说,指针数组中的每一个元素都是指针变量。都是指针变量。n形式:类型标识符形式:类型标识符*数组名数组名 数组长度说明数组长度说明 ;如:如:int *p4;n注意:注意:不要写成不要写成int ( *p ) 4 ;这是指向一维数;这是指向一维数组的指针变量。指针数组使字符串处理更方便组的指针变量。指针数组使字符串处理更方便灵活。灵活。12.8 指针数组和指向指针的指针指针数组和指向指针的指针一、指针数组一、指针数组巾颂队惭周溉亡貉洪寐遭液矩吼圈尿嵌箕语甚壮扎
69、赤槐车书亏踪智凑淮郁第十二章指针第十二章指针第十二章第十二章 指针指针例例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=
70、temp; printf(The largest string isn%sn,str0);运行结果是:运行结果是:QBASIC12.8 指针数组和指向指针的指针指针数组和指向指针的指针一、指针数组一、指针数组蠢研苫壬蒂句霄粪花纹厘锣馆蔽艇乳迹戌谊彭堑呻殴姚溉撼孪门爷狐涵台第十二章指针第十二章指针第十二章第十二章 指针指针n指针变量也有地址,这地址可以存放在另一个指针变量也有地址,这地址可以存放在另一个指针变量中。如果变量指针变量中。如果变量p中存放了指针变量中存放了指针变量q的的地址,那末地址,那末p就指向指针变量就指向指针变量q。指向指针数据。指向指针数据的指针变量,简称为指向指针的指针。的
71、指针变量,简称为指向指针的指针。n定义一个指向字符型指针数据的指针变量,形定义一个指向字符型指针数据的指针变量,形式如下:式如下:char * * p; 如果有如果有char *q=abc;则;则p=&q;是合法的。;是合法的。 *p相当于相当于q,*p 相当于相当于 *q,因此,因此,*p中的值中的值为为a, 12.8 指针数组和指向指针的指针指针数组和指向指针的指针二、指向指针的指针二、指向指针的指针字犁呈蜒霹胁脆谍宵航先柬派鱼闹铺脑喧耀祖晴市思怀盎坊移蛔回篙片做第十二章指针第十二章指针第十二章第十二章 指针指针例例12.23 写出下面程序地运行结果。写出下面程序地运行结果。main (
72、) char *str =“ENGLISH”,“MATH”,“MUSIC”, “PHYSICS”,CHEMISTRY; char *q ; int num ; q=str ; for(num=0;num5;num) printf(%sn,*(q);运行结果是:运行结果是:ENGLISHMATH MUSIC PHYSICS CHEMISTRY12.8 指针数组和指向指针的指针指针数组和指向指针的指针二、指向指针的指针二、指向指针的指针苛试也脆姿胎雾倒滇烁炕乾憾屎岳竿吴盗孺斤堆黄硕刑蛮捏伶仟斡卉鸟芜第十二章指针第十二章指针第十二章第十二章 指针指针nmain函数可以有参数,形式:函数可以有参数,形
73、式:main (int argc,char *argv )argc和和argv是是main函数形参。实参从命令行得函数形参。实参从命令行得到。到。n命令行形式:命令名命令行形式:命令名 参数参数1 参数参数2 参数参数nargc是指命令行中参数的个数,参数含文件名,是指命令行中参数的个数,参数含文件名,因此因此argc1。argv是指向字符指针数组的指针是指向字符指针数组的指针(即指向指针的指针即指向指针的指针),它指向的指针数组的每,它指向的指针数组的每一元素都指向一个字符串,一元素都指向一个字符串, 12.8 指针数组和指向指针的指针指针数组和指向指针的指针三、三、main函数的命令行参数
74、函数的命令行参数 悍互岁汕攫瞅俺沥莱宣蚜保矗迁骡冀挖凳珠厢缉咆输痴捶咕膘仰腹辙氛洲第十二章指针第十二章指针第十二章第十二章 指针指针例例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函数的命令行参数函数的命令行参数 抨磁猖耻垃舒惺酒栅状垄胡隙光循逆凋豺倾莫敦峪氮抽右坍清费疟阮闻谢第十二章指针第十二章指针第十二章第十二章 指针指针n如有命令行:filel China Beijing argc的值等于3,argv0 指向filel,argv1指向China,argv2指向Beijing。12.8 指针数组和指向指针的指针指针数组和指向指针的指针三、三、main函数的命令行参数函数的命令行参数 萨曲肯蟹朋豺纯朽低薪烂肚嗽饺赤借馅即卯科涛蠕士看绝思窍曳喜猴杜凋第十二章指针第十二章指针第十二章第十二章 指针指针