




已阅读5页,还剩20页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
139第4章 指针与数组第4章 指针与数组u 本章重点1. 指针变量对一维数组元素的引用方法。2. 指针在一维数组中的应用。3. 指针变量对字符串的引用。4. 数组指针在二维数组中的应用。5. 指针数组的概念。6. 多级指针概念与应用。u 本章难点1. 如何用指针变量来表示数组元素及元素的地址。2. 指针变量在一维数组中的移动。3. 字符指针变量的赋值方法及运用。4. 数组指针的理解与应用。5. 数组指针与指针数组的区别。6. 对多级指针概念的理解。4.1 一维数组与指针在第1章已经学习了指针的概念以及指针的基本运算。指针是一个变量的地址,是一个常量。而一个指针变量却可以被赋予不同的指针值,是变量。定义指针的目的是为了通过指针去访问内存单元。在实际使用中,指针变量通常应用于数组,因为数组在内存中是连续存放的,指针应用于数组将会使程序的概念十分清楚、精练、高效。 下面通过例子来说明一维数组与指针的关系。首先定义一个一维数组及同数据类型的指针变量,然后指针变量指向数组某元素的地址,如:int a10; /*定义a为包含10个整型数据的数组*/int *p; /*定义p为指向整型变量的指针*/应当注意,因为数组为int型,所以指针变量也应为指向int型的指针变量。下面是对指针变量赋值:p=a;把a0元素的地址赋给指针变量p。也就是说,p指向数组a的首地址。在第一章已经学习了一维数组的元素表示与地址表示的方法。表4.1 一维数组的元素表示法数组表示指针表示aipi 或*p*(a+i)*(p+i) 或*p表4.2 一维数组元素的地址表示法数组表示指针表示&ajp+j 或 pa+j注意如有定义:int a=10,*p;p = &a ; p、&a 都为地址,而*p ,a 为内容。对a来说,&a是成立的,而&*a是无意义的,而对指针p来说,&*p、*&p都是有意义的。例4.1 如有定义:int x=2,*p=&x;以下哪些表达式的含义是不正确的。(A)*&p (B) *&x (C)&*p (D)&*x解析:指针p再取地址,变量x取地址都是有意义的,指针p取内容即为变量x的值,而变量x不能再取内容,因而(D)错。例4.2 如有定义int a5;(其中:0i5),不能表示数组元素的是( )。(A)*(a+i) (B)a5 (C)a0 (D)ai解析:可以用ai或*(a+i)表示一维数组元素,其中i的取值为0至4,而a5超界,所以答案为B。例4.3 若有以下定义和语句,int a10,i;且0=i10,则对数组元素地址的正确表示是( )。(A)a+ (B)(a+1) (C)*(a+1) 解析:对于选项A,由于a代表数组a的首地址,它的值在程序运行期间是不能被改变的,即它应该是常量,因此a+将无法实现。选项B中的(a+1)表示数组a的第一个元素的地址(从第0个元素开始)。选项C表示数组a的第一个元素的值,所以正确答案为B。例4.4 编写一程序定义具有10个元素的一维数组,通过数组元素的方法从键盘输入数据,找出比相邻元素大的元素个数(头、尾元素不计在内)。解析:如数组定义为:int a10;数组的元素可表示为:*(a+i)、ai,其元素的地址可表示为:a+i、&ai。统计比相邻元素大的元素个数(头、尾元素不计在内)时可用语句:for(k=0,i=1;iai+1&aiai-1) k+; 完整的程序代码为:#includevoid main( ) int a10,i,k; for(i=0;i10;i+) scanf(“%d”,a+i); for(k=0,i=1;iai+1&aiai-1) k+; printf(k=%dn,k);例4.5 阅读程序,找出程序中的错误。#includevoid main( ) int *p,i,a10; p=a;for(i=0;i10;i+) *p+=i; for(i=0;i10;i+) printf(a%d=%dn,i,*p+);分析:指针p指向数组a的首地址,把循环变i的值赋给p所指的地址上,然后p指向数组的下一个元素,当到第二个循环开始时指针已移出数组,此时输出的内容已是一些随机数据而出错。把上述程序改写为:#includevoid main( ) int *p,i,a10; p=a;for(i=0;i10;i+)*p+=i; p=a; for(i=0;i10;i+) printf(a%d=%dn,i,*p+);例4.6 将数组a中的n个整数按相反顺序存放。解析:将a0与an-1对换,再a1与an-2对换,直到将a(n-1/2)与an-int(n-1)/2)对换。现用循环处理此问题,设两个位置指示变量i和j,i的初值为0,j的初值为n-1。将ai与aj交换,然后使i的值加1,j的值减1,再将ai与aj交换,直到i=(n-1)/2为止,如图4.1所示。i m j (a) (b)37911067542 24576011973图4.1(a)交换前,(b)交换后用数组元素的方法程序设计如下:#includevoid inv(int x ,int n) /*形参x是数组名*/ int temp,i,j,m=(n-1)/2; for(i=0;i=m;i+)j=n-1-i; temp=xi;xi=xj;xj=temp;void main()int i,a10=3,7,9,11,0,6,7,5,4,2; printf(The original array:n); for(i=0;i10;i+) printf(%d,ai); printf(n); inv(a,10); printf(The array has benn inverted:n); for(i=0;i10;i+) printf(%d,ai); printf(n);用指针的方法程序设计如下:#includevoid inv(int *p,int n)int temp,*p1,*p2;p1=p;p2=p+n-1;for( ;p1p2;p1+,p2-)temp=*p1;*p1=*p2;*p2=temp;void main()int i,a10=3,7,9,11,0,6,7,5,4,2,*p=a;printf(原数组为:n);for(i=0;i10;i+,p+)printf(%d,*p);printf(n);p=a;inv(p,10);printf(反序后的数组为:n);for(i=0;i10;i+,p+)printf(%d,*p);printf(n);例4.7 用选择法对10个整数排序。#includevoid sort(int x ,int n)int i,j,k,t;for(i=0;in-1;i+)k=i;for(j=i+1;jxk) k=j;if(k!=i)t=xi;xi=xk;xk=t; void main()int *p,i,a10=3,7,9,11,0,6,7,5,4,2;printf(The original array:n);for(i=0;i10;i+)printf(%d,ai);printf(n);p=a;sort(p,10);for(p=a,i=0;i10;i+,p+)printf(%d ,*p);printf(n);思考:用选择法对10个整数从小到大排序。4.2 字符串与字符指针变量C语言本身并没有设置一种类型来定义字符串变量,字符串的存储完全依赖于字符数组,但字符数组又不等于字符串变量。本节将对字符串的实现、字符串与字符数组、指针之间的关系,以及字符串的简单应用进行讨论。4.2.1 字符数组与字符串 虽然C语言中没有字符串数据类型,但却允许使用字符串常量。在C语言中,字符串是借助于字符型一维数组来存放的,以字符0作为字符串结束标志,它的ASCII代码值为0,0占用存储空间、不输出,但不计入串的实际长度。可以用字符数组存放字符串,如char s10=H,e,l,l,o,!,0;或:char s10=Hello!;但是以下给数组的赋值是不合法的:char s10;s=Hello!;因为表示字符串“Hello!”的是存储空间的首地址,而数组定义后数组首地址也是常量,两个常量之间不能相互赋值。如有以下定义:char str110=computer ,str220 ;赋值方式str2=str1;也是错误的。当然数组元素间赋值可逐个进行,最后人为加入字符串结束标志0。例如:for(j=0;str1j!=0;j+)str2j = str1j;str2j = 0; /* 人为加入字符串结束标志0 */可以在字符数组内存放字符串。如果一个字符数组用来作为字符串使用,那么在定义该字符数组时,数组的大小就应该比它将要实际存放的最长字符串多一个元素,从而在末尾存放0留有空间。当用赋初值方式来定义字符数组大小时,这时定义应写成:char str1=s,t,r,i,n,g,!,0;在此定义了有7个字符的字符串,数组str1包含了8个元素的字符数组。可以直接用字符串常量给一维字符数组赋初值。例如:char strl10=string!; 在这里由于“string!”是字符串常量,系统己自动在最后加入0,所以不必人为加入。或写成:char str=string;若是定义成:char str7=string!;是错误的,因7个字节的空间不够用,0将占用下一个不属于str的存储单元。例4.8 字符串的输出。#includevoid main()char string =I love China!;printf(%sn,string);4.2.2 指针变量与字符串每一个字符串常量都分别占用内存中一串连续的存储空间,以存储空间的首地址表示字符串,因而可以用字符指针变量指向字符串的首地址,例: char *sp ; sp=Hello!; 或写成:char *sp=Hello!;此赋值语句并不是把字符串的内容放入sp中,而只是把字符串在内存中所占的首地址赋予了char类型的指针变量sp,使指针变量sp指向以上字符串的首地址。注意:当定义:char *sp;用语句:scanf(“%s”,sp);或gets(sp);是错误的,因为指针sp还没有指向一个确定的地址,正确的用法应写成以下的程序段:char *sp ,str80;sp=str; /*首先使指针sp指向一个确定的地址*/gets(sp); /*然后读入*/下面举例说明用字符串与指针之间赋值的有关问题。例如有两个字符串指针:char a10,*to,*from;to=a;from=string;现在把t所指的内容赋值到s所指的空间上,可用下列函数来实现: void strcpy(char *to,char *from)while(*to+=*from+);此函数中while中先赋0后,再判定循环条件。也可以写成下列式子:while (*from!=0)*to=*from ; to+ ; from+;或:for(i=0;*(from+i)!=0;i+)*(to+i)=*(from+i);*(to+i)=0; 例4.9 输出字符串中n个字符后的所有字符。#includevoid main() char *ps=this is a book; int n=10; ps=ps+n; printf(%sn,ps);运行结果为:book在程序中对ps初始化时,即把字符串首地址赋予ps,当ps=ps10之后,ps指向字符“b”,因此输出为“book”。 4.3 二维数组与指针 4.3.1 二维数组的定义及引用在C语言中,可以把二维数组看作是一种特殊的一维数组,二维数组中元素的排列顺序是:先按行存放,再按列存放,即在内存中先顺序存放第一行的元素,再存放第二行的元素。1二维数组的定义 类型说明符 数组名常量表达式常量表达式;常量表达式表示二维数组的行数,常量表达式表示二维数组的列数。例,float a34;它表示定义了数组名为a的3行4列的实型数组。 2二维数组的表示方法当定义了一个二维数组后,在程序中就可以引用二维数组的元素及地址。在引用二维数组时,必须是单个元素,不能是整个数组名。下标可以是一个表达式。如果下标是一个表达式,注意表达式的值不能超出数组定义的上、下限。二维数组的元素、元素的地址、行首地址的引用方法如表4.3所示。表4.3 二维数组的元素及地址的表示方法维数组的元素表示二维数组元素的地址表示二维数组行首地址表示数组ij&数组ij数组i*(*(数组名+i)+j)*(数组名+i)+j)数组i*(数组名i+j)数组名i+j*(数组+i)例4.10 若有定义:int a34;则以下选项中对数组元素 aij的错误的引用是( )。(A)*(&a00+4*i+j) (B)*(a+i)j (C)*(*(a+i)+j) (D)*(ai+j) 解析:此题中用到了几种数组元素引用的方法:(1)二维数组a中的任一个元素 aij可以由表达式&a00+10*i+j求出。(2)*(a+i)+j与ai+j等价,都表示 a数组中第i行、第j列元素(即aij)的地址)。(3)由于方括号 的优先级别高于*,因此*(a+i)j相当于*(*(a+i+j),而*(a+i+j)并不表示aij的地址。由上面的分析可以看出选项(A),(C)和(D)都是对数组元素aij的合法引用,而选项(B)的引用方式是错误的。答案是(B)。 3二维数组的初始化与赋值二维数组的赋值也可以分为种情况:(1)二维数组的初始化;(2)在程序中赋值;(3)从键盘读入,本小节主要讨论二维数组初始化中的有关问题。在程序中对二维数组的初始化应说明为静态的或外部的。可对二维数组初始化的情况有:(1)分行给二维数组赋初值。static a34=1,2,3,4,5,6,7,8,9,10,11,12; 以上赋值把第一个花括号内的数据赋给第一行元素,第二个花括号内的数据赋给第二行元素,即按行赋值。或者:static int a33=1,2,3,4,5,6,7,8,9;(2)可以将所有的数据写在一个花括号内,按数组排列的顺序对各元素赋值。 例:static int a33=1,2,3,4,5,6,7,8,9;(3)可以对数组的部分元素赋初值。如:static int a34=l,5,9;以上赋值的结果是:数组第一列的元素分别赋了初值1,5,9,其余元素的值都是0。例如,有定义:int a33=1,4,7;实质上与:int a33= 1,0,0,4,0,0,7,0,0;等效。int a33=1,2,3; 实质上与:int a33= 1,2,3,0,0,0,0,0,0;等效。(4)如果对二维数组的全部元素都赋初值,则定义数组时对第一维的长度可以不指定,但第二维的长度不能省略。例如:int a33=1,2,3,4,5,6,7,8,9;与 a 3=1,2,3,4,5,6,7,8,9;等价。又如:static int a 3=0,0,3,0,0,10;可表示为:static int a 3 =0,0,3,0,0,0,0,10,0; 有关在程序设计中给二维数组元素赋值及从键盘读入的方法与一维数组基本相同。4.3.1 二维数组的地址设有整型二维数组a34如下:0 1 2 34 5 6 78 9 10 11它的定义为:int a34=0,1,2,3,4,5,6,7,8,9,10,11设数组a的首地址为1000,在Visual C+中各元素的首地址及其值如图4.4所示。10000100411008210123101641020510246102871032810369104010104411图4.4 各下标变量的首地址及其值在C语言中允许把一个二维数组分解为多个一维数组来处理,因此数组a可分解为三个一维数组,三个一维数组的首地址分别为a0,a1,a2。每一个一维数组又含有四个元素。如图4.5所示。10000100411008210123101641020510246102871032810369104010104411 a0a1a2图4.5 数组a可分解为三个一维数组例如:a0数组,含有a00,a01,a02,a03四个元素。a1数组,含有a10,a11,a12,a13四个元素注意:(1) *(a+i)表示第i行首地址,而 *(a+i)+j 表示元素aij的地址。(2) *(*(a+i)+j) , *(ai+j), aij 等价,都表示数组的元素。(3) *(a+i)+j 与*(a+i+j)不等价。 例4.11 请分析下列程序的执行情况。#includevoid main() int a34=0,1,2,3,4,5,6,7,8,9,10,11; printf(%d,a); printf(%d,*a); printf(%d,a0); printf(%d,&a0); printf(%dn,&a00); printf(%d,a+1); printf(%d,*(a+1); printf(%d,a1); printf(%d,&a1); printf(%dn,&a10); printf(%d,a+2); printf(%d,*(a+2); printf(%d,a2); printf(%d,&a2); printf(%dn,&a20); printf(%d,a1+1); printf(%dn,*(a+1)+1); printf(%d,%dn,*(a1+1),*(*(a+1)+1);解析:a是二维数组的首地址,*a即a0为第0行的首地址,&a0即为a,&a00与a0等价,因而a、*a、a0、&a0、&a00值相同,但它们的含义是有差异的。同样道理在二维数组中a+i、*(a+i)、ai、&ai、&ai0值也相同。4.3.2 数组指针1数组指针的基本概念数组指针用于指向二维数组,声明数组指针变量的一般形式为:类型说明符 (*指针变量名)下标;如有定义int a23,(*p)3;当p=a;后,可用*(pi+j)、*(*(p+i)+j)表示数组元素aij,同理*(p+i)为i行首地址*(p+i)+j表示i行j列元素地址。例4.12 数组指针的例子。#includevoid main( ) static int a35=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15;int i,j,(*p)5;p=a;for (i=0;i3;i+)for(j=0;j5;j+)printf(%d,*(*(p+i)+j);printf(n);注意:(1) 指针p指向二维数组时指针的赋值应该用p=a0,而数组指针p指向二维数组时指针的赋值应该用p=a。(2) 数组指针p+表示指向二维数组下一行的首地址。例4.13 数组指针的应用举例。#include void main( ) static int a34=1,3,5,7,9,11,13,15,17,19,21,23; int (*p)4,i,j; /*表示*p有4个列元素的指针*/ p=a; scanf(%d,%d,&i,&j); printf(a%d%d=%dn,i,j,*(*(p+i)+j);如输入: 1,2输出为: a12=13例4.14 数组指针的应用举例。#includevoid ave(int *p,int n)int *p_end;int sum=0,aver;for(p_end=p+n-1;p=p_end;p+)sum=sum+ *p;aver=sum/n;printf(average=%dn,aver);void search(int (*p)4,int n)int i;printf(The scores of No.%d are:n,n);for(i=0;i4;i+)printf(%4d , *(*(p+n)+i);void main()static int score34=70,80,67,77,82,88,69,86,93,87,99,81;ave(*score,12);search(score,1);程序的运行结果为:average=81The scores of No.1 are: 82 88 69 86阅读时应注意在函数ave(*score,12)中,实参*score相当于score0,它表示用指针来引用二维数组score34,即把二维数组score34作为一维数组来引用,因而它所对应的形参为int *p,而12表示元素的个数。在函数search(score,1)中,实参score为二维数组的数组名,对它的引用应为指针数组,因而此函数的形参说明为指针数组int (*p)4,参数的传递为p=score,n=1,此函数中*(*(p+n)+i)相当于p1i,或score1i,在循环中输出score10、score11、score12。4.4 指针数组4.4.1 指针数组的性质指针数组是指由指针组成的数组,即指针变量的集合,实质上是一个数组,其元素为指针。指针数组中的若干指针比较适合于指向若干个字符串,使字符串的处理更为方便灵活。指针数组定义形式为:类型 *数组名指针数组元素的个数;例: char *w7; int *pk5;4.4.2 指针数组的初始化由于指针数组是一个数组,它的初始化或赋值与数组的性质基本一致,格式为: static 数据类型 *数组名下标=地址1,地址2,地址n;例如:static char *w7=Sun,Mon,Tue,Wed,Thu,Fri,sat;它表示数组元素w0指向字符串“sun”,w1指向字符串“Mon”,w6指向字符串“sat”,当要输出这些字符串时,可用下列语句:for(j=0;j7;j+) printf(%s,wj);(1)指针数组的赋值方法之一 int a23,*p2; for (i=0;i2;i+)pi=ai;(2)指针数组的赋值方法之二static char *name=Liu , Fang , Zhang;这表示指针name0指向字符串“Liu”的首地址;指针name1指向字符串“Fang”的首地址;指针name2指向字符串“Zhang”的首地址。例4.14 阅读以下程序,分析输出结果。#includevoid main( ) static char *name=Liu , Fang , Zhang; int i;for(i=0;i3;i+) if(namei0=F)printf(%sn,namei);输出结果: Fang 解析:指针name0、name1、name2分别指向字符串Liu 、Fang、Zhang的首地址,name00 、name10、name20分别表示字符L、F、Z,当namei0=F为真时i为1,因而语句printf(%sn,namei);输出为:Fang例4.15 有四个字符串分别为:“DOG”、“CAT”、“PIG”和“AII ANIMAL”,用指针数组的方法编写一个程序并输出它们的内容。 程序设计为:#includevoid main( ) char *s4; int i; s0=DOG;s1=CAT; s2=PIG; s3=ALL ANIMAL; for (i=0;i4;i+) printf(%sn,*(s+i);运行结果为:DOGCATPIGALL ANIMAL注意(1) int (*p)5表示数组指针,p为一个指针,这个指针指向具有10个元素的一维数组的首地址,此时的p+表示跨过10个元素,即指向二维数组下一行的首地址。(2) int *p10表示为指针数组,数组元素为指向整型数的指针,由10个指针组成的一个数组,这10个指针可表示为pi,0=i10,p为数组名。例4.16 以下程序完成的功能是:对一批程序设计语言名从小到大进行排序并输出。#include#includevoid sort(char *book ,int num) int i,j; char *temp; for(j=1;j=num-1;j+) for(i=0;i0) temp= booki; booki=booki+1; booki+1= temp; void main( )int i;static char *book=VISUAL BASIC, VISUAL C+, VISUAL FOXPRO,C,PASCAL,VISUAL J+;sort(book,6);for(i=0;i6;i+)printf(%sn,booki);程序的执行结果为:CPASCALVISUAL BASICVISUAL C+VISUAL FOXPROVISUAL J+分析:在函数sort(char *book,int num)中,它的形参是指针数组名,在函数strcmp(booki,booki+1)中,比较的是第i个和第i1个字符串,如booki所指的字符串大于booki1 所指的字符串,此函数值为正;若相等,则函数值为0;若小于,则函数值为负;若满足if( )中的条件,booki和booki+1对换,则小的排在前,当执行完sort( )函数后,字符串完成从小到大排序。4.5 多级指针如一个指针变量所指向的地址中存放的变量仍为一个指针变量,而被指向的指针变量指向一个具体的非指针变量,这个指针称二级指针,或者说指向指针的指针。依次类推,还可以定义三级、四级指针。二级指针定义: *;例如:int *p;int a,*q;q=&a;p=&q;;p所指仍为变量地址再次指向后才为变量的值pq&aa它们的含义如图4.6所示:图4.6 二级指针定义例4.17 执行下面的语句组后,*a,*p,*p,*pp,*pp的值分别为多少?int a =0,1,2,3,4;int *p =a,a+1,a+2,a+3,a+4;int *pp=p;a0a1a2a3a4p0p1p2p3P4分析:如图4.7所示:图4.7 二级指针pp与数组p、a间的关系a为数组名,代表数组的首地址,*a为数组a的第一个元素,值为0。p为指针数组名,代表指针数组p的首地址,因此*p为指针数组p的第一个元素,即a,值为数组a的首地址;而*p=*a的值为数组a的元素,即0,pp是指向指针的指针变量,其初值为指针数组p的首地址,*pp即*p,值为数组a的首地址;*pp即*(*p)=*(a),值为0。 例4.18 阅读以下程序,分析输出结果。#includevoid main( )int *ppx;int *px;int x;x=10;px=&x;ppx=&px;printf(x=%dn,x); printf(*px=%dn,*px);printf(*ppx=%dn,*ppx);结果为:x=10 *px=10 *ppx=10分析:程序中指针所指的情况如图4.8所示,当输出*px、*ppx都是指变量x的值。xpxppx ppx px x图4.8 二级指针ppx、一级指针px、变量x的关系示意图例4.19 多级指针的例子。#includevoid main( )static char *alpha5=a,bc,def,1,23,*p;int i;p=alpha;for(i=0;i3;i+,p+) printf(%s,*p);printf(t);p=p-3;for(i=0;i3;i+,p+) printf(%ct,*p);printf(n);解析:本程序定义了指向五个字符串的指针数组alpha,其元素指向的字符串分别为a、bc、def、1、23。另外还定义了一个指向指针的指针变量p,其初值为指针数组alpha的首地址。第一个for循环打印出三个字符串a和bc及def,循环结束后指针p指向第四个字符串。printf(t)使下次打印从下一个输出区开始打印,即从第9个字符位置开始打印。p=p-3使指针p指向第一个字符串。第二个for循环共循环三次,在执行第一次循环时,*p为第一个字符串中的第一个字符,因此输出a。在执行第二次循环时,p指向第二个字符串的开始,*p为第二个字符串的第一个字符,在下一个输出区输出b。第三次循环时,*p为第三个字符串的第一个字符,因此在下一个输出区输出d。答案:abcdef a b d。习 题一、选择题1下列程序片段中不正确的字符串赋值或初始化方式是( )。(A)char *str; str=string; (B)char str7=s,t,r,i,n,g,0;(C)char str10; str=string; (D)char str =string; 2有以下定义及语句,则对数组a元素的正确引用的表达式是( )。int a;int (*p)5=a;(A)p+1 (B)*(p+3) (C)*(p+1)2 (D)*(*p+1)3有以下定义及语句,则不能正确表示a数组元素的表达式是( )。int a43=1,2,3,4,5,6,7,8,9,10,11,12;int (*pt)3=a,*p4,i;for(i=0;i4;i+)pi=ai;(A)a43 (B)p00 (C)pt22 (D)(*(p+1)14有以下定义及语句,则对数组a元素的不正确引用的表达式是( )。int a;*p2,j;for (j = 0 ; j 4 ; j+)pj=aj;(A)p00 (B)*(a+3)4 (C)*(p1+2) (D)*(&a00+3)5有以下定义及语句,则能正确表示数组元素a23的表达式是( )。int a;(*p)5=a,*pt=a0;(A)*(*p+1)2) (B)*(*(pt+3) (C)*(p+1)+2 (D)*(pt+8)6若有下列的程序段,则对数组元素的错误引用是( )。int a12 = 0 , *p3, * * pp , j;for (j = 0 ; j 3 ; j+)pj=&aj*4;pp = p ;(A)pp01 (B)a10 (C)p31 (D)*(*(p+2)+2)二、程序阅读与填空题1下列程序输出的结果是( )。#include void abc( char *str )int a, b ;for(a = b = 0 ; stra!=0; a+ )if(stra!= c)strb+ = str a;strb=0;void main( )char str =abcdef ;abc(str);printf(str =%s , str );2以下程序输出的结果是( )。#include#includevoid fun( char *w ,int m) char s, *p1 , *p2; p1 = w; p2= w+m-1; while(p1p2) s = *p1+; *p1= *p2- ; *p2 = s ;void main( ) char a = ABCDEFG; fun(a ,strlen(a); puts(a); 3以下程序输出的结果是( )。#include int aa33 = 2,4,6;void main( ) int i ,*p = &aa00; for(i = 0;i2;i+) if (i=0) aaii+1=*p+1; else +p; printf(%d,*p); 4阅读以下程序说明和C程序,把应填的内容写入空格处。本函数为二分法查找key值。数组中元素值已递增排序,若找到jet则返回对应的下标,否则返回-1。int binary(double a, int n, double key) int low,high,mid;low=0;high=n-1;while( (1) )mid=(low+high)/2; if(keyanid) (3) ;else (4) ;return(-1); 5下述函数从一个数组v中删除值为key的元素。数组的元素个数由指针n指明,请填空。void delnode(doub
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年钢铁冶金工程师考试试题及答案
- 初中道德与法治统编版 七年级上册 3.1 做有梦想的少年 教学课件+内嵌视频
- 2025年人力资源开发与助力企业转型考试试卷及答案
- 2025届湖北省襄阳市襄阳五中学实验中学英语八年级第二学期期末复习检测试题含答案
- 血液净化护理查房
- 世界读书日少先队主题活动方案
- 2025年创新与创意产业工作者考试试题及答案
- 贵州省黔南长顺县2025年英语七下期末学业质量监测试题含答案
- 2025年测绘工程专业考试试题及答案
- 绿化公司员工培训
- 体育指导员协会筹备
- MOOC 光纤通信-南京邮电大学 中国大学慕课答案
- 军事学:国际战略环境必看考点四
- (高清版)DZT 0212.4-2020 矿产地质勘查规范 盐类 第4部分:深藏卤水盐类
- 粉尘防爆安全操作规程范文
- 《快速原型制造》课件
- 监理抽检表 - 06防护支挡工程
- 南邮组织行为学期末复习题
- 物业工程维修作业安全操作指南
- 农村医生个人工作简历表
- 装修常用数据手册(空间布局和尺寸)
评论
0/150
提交评论