二级C语言选择题练习附答案

(1)下列叙述中正确的是

A)所谓算法就是计算方法

B)程序可以作为算法的一种描述方法

C)算法设计只需考虑得到计算结果

D)算法设计可以忽略算法的运算时间

答案:B

【解析】算法是指对解题方案的准确而完整的描述,算法不等于数学上的计算方法,也不等于程序,A选项错误。算法设计需要考虑可行性、确定性、有穷性与足够的情报,不能只考虑计算结果,C选项错误。算法设计有穷性是指操作步骤有限且能在有限时间内完成,如果一个算法执行耗费的时间太长,即使最终得出了正确结果,也是没有意义的,D选项错误。算法在实现时需要用具体的程序设计语言描述,所以程序可以作为算法的一种描述方法,B选项正确。

(2)下列叙述中正确的是

A)一个算法的空间复杂度大,则其时间复杂度也必定大

B)一个算法的空间复杂度大,则其时间复杂度必定小

C)一个算法的时间复杂度大,则其空间复杂度必定小

D)算法的时间复杂度与空间复杂度没有直接关系

答案:D

【解析】算法的空间复杂度是指算法在执行过程中所需要的内存空间,算法的时间复杂度,是指执行算法所需要的计算工作量,两者之间并没有直接关系,答案为D。

(3)下列叙述中错误的是

A)数据结构中的数据元素不能是另一数据结构

B)数据结构中的数据元素可以是另一数据结构

C)空数据结构可以是线性结构也可以是非线性结构

D)非空数据结构可以没有根结点

【答案】A

【解析】数据元素是一个含义很广泛的概念,它是数据的“基本单位”,在计算机中通常作为一个整体进行考虑和处理。数据元素可以是一个数据也可以是被抽象出的具有一定结构数据集合,所以数据结构中的数据元素可以是另一数据结构。

满足有且只有一个根结点并且每一个结点最多有一个前件,也最多有一个后件的非空的数据结构认为是线性结构,不满足条件的结构为非线性结构。

空数据结构可以是线性结构也可以是非线性结构。非空数据结构可以没有根结点,如非性线结构“图”就没有根结点。故选A选项

(4)结构化程序设计的基本原则不包括(  )。

A)多态性

B)自顶向下

C)模块化

D)逐步求精

答案:A

【解析】结构化程序设计的思想包括:自顶向下、逐步求精、模块化、限制使用goto语句,所以选择A)。

(5)结构化程序设计中,下面对goto语句使用描述正确的是

A)禁止使用goto语句

B)使用goto语句程序效率高

C)应避免滥用goto语句

D)以上说法均错误

答案:C

【解析】结构化程序设计中,要注意尽量避免goto语句的使用,故选C。

(6)下列叙述中正确的是

A)软件是程序、数据和文档

B)软件是程序和数据

C)软件是算法和数据结构

D)软件是算法和程序

答案:A

【解析】计算机软件由两部分组成:一是机器可执行的程序和数据;二是机器不可执行的,与软件开发、运行、维护、使用等有关的文档。故选A选项

(7) 软件生命周期是指(  )。

A)软件产品从提出、实现、使用维护到停止使用退役的过程

B)软件从需求分析、设计、实现到测试完成的过程

C)软件的开发过程

D)软件的运行维护过程

答案:A

【解析】通常,将软件产品从提出、实现、使用维护到停止使用退役的过程称为软件生命周期。也就是说,软件产品从考虑其概念开始,到该软件产品不能使用为止的整个时期都属于软件生命周期

(8)下面能作为软件需求分析工具的是

A)PAD图

B)程序流程图

C)甘特图

D)数据流程图(DFD图)

答案:D

【解析】软件需求分析方法包括结构化分析方法和面向对象的分析方法两大类,前者常用工具为数据流图(DFD)、数据字典(DD)、判定表、判定树等。故D选项正确。

(9)在数据库管理系统提供的数据语言中,负责数据的查询、增加、删除和修改等操作的是

A)数据定义语言

B)数据管理语言

C)数据操纵语言

D)数据控制语言

答案:C

【解析】数据库管理系统提供了相应的数据语言,它们是:数据定义语言,该语言负责数据的模式定义与数据的物理存取构建;数据操纵语言,该语言负责数据的操纵,包括查询与增、删、改等操作;数据控制语言,该语言负责数据完整性、安全性的定义与检查以及并发控制、故障恢复等功能。C选项正确。

(10)在数据库系统中,考虑数据库实现的数据模型是

A)概念数据模型

B)逻辑数据模型

C)物理数据模型

D)关系数据模型

答案:B

【解析】数据模型按照不同的应用层次分为以下3种类型:概念数据模型,它是一种面向客观世界、面向用户的模型,它与具体的数据库管理系统和具体的计算机平台无关;逻辑数据模型,是面向数据库系统的模型,着重于在数据库系统一级的实现;物理数据模型,是面向计算机物理实现的模型,此模型给出了数据模型在计算机上物理结构的表示。B选项正确。

(11)以下叙述中错误的是(  )。

A) 使用三种基本结构构成的程序只能解决简单问题

B) 结构化程序由顺序、分支、循环三种基本结构组成

C) C语言是一种结构化程序设计语言

D) 结构化程序设计提倡模块化的设计方法

答案:A

【解析】使用顺序,选择(分支),循环三种基本结构构成的程序可以解决所有问题,而不只是解决简单问题,所以A)错误。

(12)以下选项中叙述正确的是

A) 函数体必须由 { 开始

B) C程序必须由main语句开始

C) C程序中的注释可以嵌套

D) C程序中的注释必须在一行完成

答案:A

【解析】函数体是函数首部下面的花括号内的部分,所以函数体必须由{开始,A选项正确。一个源程序文件可以包括预处理命令、全局声明、函数定义,程序总是从main函数开始执行的,不是main语句,B选项错误。C程序中的允许两种注释,以//开头的单行注释;以/开始,以/结束的块式注释,D选项错误。函数可以嵌套,注释不能嵌套,C选项错误。

(13)以下叙述正确的是

A) C编译程序把文件后缀为.c的源程序文件编译成文件后缀为.obj的二进制文件

B) C编译程序把文件后缀为.c的源程序文件编译成文件后缀为.exe的可执行文件

C) C编译程序把文件后缀为.obj的二进制文件编译成文件后缀为.exe的可执行文件

D) 链接程序把文件后缀为.c的源程序文件链接成文件后缀为.exe的可执行文件

答案:A

【解析】C编译程序把文件后缀为.c的源程序文件编译成文件后缀为.obj的二进制文件,链接将一个或多个目标文件与程序用到的库文件连接起来,形成一个可以在操作系统直接运行的执行程序.exe,故排除B,C,D选项,答案选A选项。

(14)按照C语言规定的用户标识符命名规则,不能出现在标识符中的是(  )。

A) 大写字母

B) 下划线

C) 数字字符

D) 连接符

答案:D

【解析】C语言中标识符由字母、下划线、数字组成,且开头必须是字母或下划线。所以D)选项中的连接符不合法。

(15)下列定义变量的语句中错误的是

A) int _int;

B) double int_;

C) char For;

D) float US$;

答案:D

【解析】C语言规定,变量命名必须符合标识符的命名规则。D选项中包含了非法字符”$”,所以错误。标识符由字母、数字或下划线组成,且第一个字符必须是大小写英文字母或者下划线,而不能是数字。大写字符与小写字符被认为是两个不同的字符,所以For不是关键字for。

(16)C语言中的标识符分为关键字、预定义标识符和用户标识符,以下叙述正确的是

A) 关键字可用作用户标识符,但失去原有含义

B) 预定义标识符可用作用户标识符,但失去原有含义

C) 在标识符中大写字母和小写字母被认为是相同的字符

D) 用户标识符可以由字母和数字任意顺序组成

答案:B

【解析】关键字不可用作C语言的标识符,所以A错误。在标识符中大写字母与小写字母作为不同字符处理,所以C错误。标识符由下划线、字母、数字组成,且必须以下划线和字母开始,所以D错误。

(17)以下选项中合法的常量是

A) 9 9 9

B) 2.7e

C) 0Xab

D) 123E 0.2

答案:C

【解析】A选项中含有非法的空格,所以错误。C语言中十六进制常量以0x开头,所以C正确。实型常量中e的前后必须均有数据,且其后必须为整数,所以B和D错误。

(17)有以下程序

#include <stdio.h>

main()

{ int k=33;

printf(“%d,%o,%x\n”, k, k, k);

}程序的运行结果是

A) 33,41,21

B) 33,33,33

C) 41,33,21

D) 33,21,41

答案:A

【解析】整型常量有3种表示方法,分别是十进制数表示法、八进制数表示法和十六进制数表示法。十进制整型常量没有前缀,输出格式控制符为%d;八进制整型常量以0作为前缀,输出格式控制符为%o;十六进制整型常量以0X或0x作为前缀,输出格式控制符为%x。整型33用八进制表示为41,十六进制表示为21,A选项正确。

(18)以下选项中,合法的一组C语言数值常量是(  )。

A) 12. 0Xa23 4.5e0

B) 028 .5e-3 -0xf

C) .177 4e1.5 0abc

D) 0x8A 10,000 3.e5

答案:A

【解析】C语言中八进制整型常量的开头是数字0,十六进制整型常量的开头数字是0x。C语言中的实型常量有两种表示形式:小数形式,小数形式表示的实型常量必须要有小数点;指数形式,以”e”或”E”后跟一个整数来表示以10为底数的幂数,且规定字母e或E之前必须要有数字,且e或E后面的指数必须为整数。B)选项中 028错误,八进制中没有数字8。C)选项中4e1.5中e后面的指数不是整数。D)选项中数字“10,000”不能用逗号。

(19)已知大写字母A的ASCII码是65,小写字母a的ASCII码是97。以下不能将变量c中的大写字母转换为对应小写字母的语句是()。

A) c=(‘A’+c)%26-‘a’

B) c=c+32

C) c=c-‘A’+’a’

D) c=(c-‘A’)%26 +’a’

答案:A

【解析】根据题意可知,小写字母比与之对应的大写字母的ASCII码大32。A选项中字符A加上c表示的大写字符再对字母个数26取余,本身这个表达式没有任何含义所以选择A选项。

(20)若有定义:double a, b, c; 能正确给a,b,c输入数据的语句是()。

A) scanf(” %lf %lf %lf” &a, &b, &c )

B) scanf(” %f %f %f”,&a, &b, &c );

C) scanf(” %lf %lf %lf”,a, b, c );

D) scanf(” %lf %lf %lf”,&a, &b, &c );

答案:D

【解析】%lf,%le是针对double的,如果仅用%f,输入的数据可能不完全接收,数据的精度可能不足。%f主要针对float类型的变量的输入,因此选项B错误。根据题目格式可知A,C错误。故答案为D选项。

(21)若有以下程序段

double x=5.16894;

printf(“%f\n”,  (int)(x*1000+0.5)/(double)1000  );

则程序段的输出结果是

A) 5.170000

B) 5.175000

C) 5.169000

D) 5.168000

答案:C

【解析】%f的输出格式是以带小数点的数学形式输出浮点数。首先计算x*1000,结果为5168.94然后+0.5,结果为5169.44,然后进行强制类型转换,转换成整型为5169,然后除以双精度数据1000,结果也为双精度数据5.169,输出时按照%f的格式输出,所以输出结果为5.169000。

(22)若变量已正确定义,在if (W) printf(“%d\n” ,k ); 中,以下不可替代W的是(  )。

A) a<>b+c

B) ch=getchar()

C) a==b+c

D) a++

答案:A

【解析】选项A)是非法的表达式,C语言中没有<>运算符。

(23) #include <stdio.h>

main()

{ int x, y, z;

x=y=1;

z=x++,y++,++y;

printf(“%d,%d,%d\n”,x,y,z);

}

程序运行后的输出结果是(  )。

A) 2,3,3

B) 2,3,2

C) 2,3,1

D) 2,2,1

答案:C

【解析】z=x++,y++,++y;因为赋值运算符的优先级高于逗号运算符的优先级,所以可以将上式表示成(z=x++),(y++),(++y)。然后从左向右先计算表达式z=x++,因为x++先使用后自增,所以z的值为1,x的值为2。再计算逗号表达式第二个表达式y++,此时y的值为2,最后计算第三个表达式++y,y的值为3。

(24)有如下程序

#include <stdio.h>

main()

{

int a = 0, b = 1;

if (a++ && b++)

    printf(“T”);

else

    printf(“F”);

printf(“a=%d,b=%d\n”, a, b);

}

程序运行后的输出结果是

A) Ta=1,b=2

B) Fa=0,b=2

C) Fa=1,b=1

D) Ta=0,b=1

答案:C

【解析】题目中判断if条件是否成立,a++先取值为0,则(a++ && b++)为0,且不计算b++,而后a自增得a=1,if条件不成立执行else函数体,输出F。最后执行语句printf(“a=%d,b=%d\n”, a, b);按照格式输出a=1,b=1。C选项正确。

(25)有以下程序

#include <stdio.h>

main()

{  char *s=”120119110″;

   int n0,n1,n2,nn,i;

   n0=n1=n2=nn=i=0;

   do{

        switch(s[i++])

        {  default   : nn++;

           case  ‘0’ : n0++;

           case  ‘1’ : n1++;

           case  ‘2’ : n2++;

         }

       } while(s[i]);

  printf(“n0=%d,n1=%d,n2=%d,nn=%d\n”,n0,n1,n2,nn);

}

程序的运行结果是()。

A) n0=3,n1=8,n2=9,nn=1

B) n0=2,n1=5,n2=1,nn=1

C) n0=2,n1=7,n2=10,nn=1

D) n0=4,n1=8,n2=9,nn=1

答案:A

【解析】本题执行过程为,s[0]=’1’,匹配case’1’,n1=1,n2=1;s[1]=’2’,匹配case’2’, n2=2;s[2]=’0’,匹配case’0’,n0=1,n1=2,n2=3;s[3]=’1’,匹配case’1’,n1=3,n2=4;s[4]=’1’,匹配case’1’,n1=4,n2=5;s[5]=’9’,匹配default,nn=1,n0=2,n1=5,n2=6;s[6]=’1’,匹配case’1’,n1=6,n2=7;s[7]=’1’,匹配case’1’,n1=7,n2=8;s[8]=’0’,匹配case’0’,n0=3,n1=8,n2=9;s[9]=’\0’,退出循环。输出n0,n1,n2,nn为3,8,9,1,A选项正确。

(26)有以下程序

#include <stdio.h>

main( )

{ int i,j = 0;

char a[] = “How are you”, b[10] = {0};

for (i=0; a[i]; i++)

 if (a[i] == ‘ ‘)

    b[j++] = a[i+1];

printf(“%s\n”,b);

}

程序运行后的输出结果是()。

A) Hay

B) Howareyou

C) we

D) ay

答案:D

【解析】for语句循环体执行功能是,每次当a[i]元素为’ ‘时,自动将a[i]下一个元素赋值给b[j],赋值完成后,j值加1,因此a[i]的’a’和’y’分别赋值给b[0],b[1],答案为D选项。

(27)有以下程序

#include <stdio.h>

main()

{ char a=3, b=6, c;

c=(a^b)<<2;

printf(“%d \n”, c );

}

程序运行后的输出结果是()。

A) 5

B) 1

C) 20

D) 18

答案:C

【解析】运算符为按位异或运算符,即01=1,10=1,11=0,00=0,因此ab=101在进行<<操作,变为101002=2010,因此答案为C选项。

(28)有如下程序

#include <stdio.h>

main()

{

int i, *ptr;

int array[5] = {5,3,1};

for (ptr=array, i=0; i<5; i++, ptr++)

{

    if (*ptr == 0)

        putchar(‘X’);

    else

        putchar(‘A’ + *ptr);

}

printf(“\n”);

}

程序运行后的输出结果是

A) FDBXX

B) FFFXX

C) FDBBB

D) ABCDE

答案:A

【解析】在对数组进行初始化时,如果对数组的全部元素赋以初值,定义时可以不指定数组长度,如果被定义数组的长度与初值个数不同,则数组长度不能省略;如果在说明数组时给出了长度,但没有给所有的元素赋予初始值,而只依次给前面的几个数组元素赋予初值,那么C语言将自动对余下的元素赋初值,则array={5,3,1,0,0}。程序执行过程为:执行for循环,将数组首地址赋给指针ptr,依次遍历每一个元素,如果数组元素为0则输出‘X’,如果不为0则按照字母表输出字符‘A’后第array[i]个字符。程序运行后的输出结果为:FDBXX,A选项正确。

(29)有以下程序

#include <stdio.h>

main()

{

char  *s=”12134″;

int  k=0, a=0 ;

while( s[ k +1 ] )

{ 

    k++;

    if ( k % 2 ==0 )

    {

         a = a + ( s[ k ] – ‘0’ +1 ) ;

         continue;

    }

    a = a + ( s[ k ] – ‘0’ );

}

printf (” k=%d a=%d\n”, k, a );

}

程序运行后的输出结果是()。

A) k=5 a=15

B) k=4 a=12

C) k=6 a=11

D) k=3 a=14

答案:B

【解析】当k=0时,执行while一次,得到k=1,a为2;当k=1时,执行while一次,得到k=2,a为4;当k=2时,执行while一次,得到k=3,a为7;当k=3时,执行while一次,得到k=4,a为12;所以答案为B选项。

(30)有以下程序

#include <stdio.h>

main()

{  int  a, b;    

   for( a=1,b=1; a<=100; a++ )

   {  if(b>=20) break;

      if(b % 3==1) {  b=b+3; continue; }

      b=b-5;

   }

   printf(“%d\n”,a);

}

程序的输出结果是()。

A) 10

B) 9

C) 8

D) 7

答案:C

【解析】首先注意for循环的控制条件当b>=20或者a>100则跳出for循环也即b<20且a<=100时执行for循环;第一次进入循环a=1,b=1均满足循环条件,但b%31条件满足,故执行b=b+3,得到b=4,注意有continue,所以后面语句不执行,直接跳转到a++这个语句,所以第一次循环完之后a=2,b=4;进入第二轮循环,b%31也是满足的,故再次b=b+3,此轮循环执行之后a=3,b=7,进入下一轮。此后和前面循环同理,都是b%3==1满足,因为每次都是加3,而之后又去模3,且都跳过for后面语句直接执行a++,所以,一直循环到b=22跳出for循环。此时a为8. 综合起来就是,每次循环b增加3,a增加1,且当b>22时跳出循环,结束程序。所以b从1增加到22,有(22-1)/3=7,所以a=1+7=8. 因此C选项正确。

(31)设有一个M*N的矩阵已经存放在一个M行N列的数组x中,且有以下程序段

   sum=0;

   for(i=0;i<M;i++)  sum+=x[i][0]+x[i][N-1];

   for(j=1;j<N-1;j++) sum+=x[0][j]+x[M-1][j];

以上程序段计算的是

A) 矩阵两条对角线元素之和

B) 矩阵所有不靠边元素之和

C) 矩阵所有元素之和

D) 矩阵所有靠边元素之和

答案:D

【解析】程序执行过程为:第一个for循环实现对第一列和第N列求和。第二个for循环在上一个for循环结果上实现对第一行和第M行从第二个元素到第N-1个元素的求和,总体来说,就是矩阵所有靠边元素之和,D选项正确。

(32)若有以下程序

 #include <stdio.h>

 void fun(int  a[ ], int  n)

 {  int  t, i, j;

    for ( i=0;  i<n;  i+=2 )

       for ( j=i+2;  j<n;  j+=2 )

         if ( a[i] > a[j] ) {  t=a[i];  a[i]=a[j];  a[j]=t; }

 }

 main()

 {  int  c[10]={10,9,8,7,6,5,4,3,2,1},i;

    fun(c, 10);

    for ( i=0; i<10;  i++ )  printf(“%d,”, c[i]);

    printf(“\n”);

 }

则程序的输出结果是()。

A) 1,10,3,8,5,6,7,4,9,2,

B) 10,9,8,7,6,5,4,3,2,1,

C) 10,1,8,3,6,5,4,7,2,9,

D) 2,9,4,7,6,5,8,3,10,1,

答案:D

【解析】该题首先对一维数组进行初始化,c[0]到c[9]依次赋值为10到1;fun(c, 10);语句调用fun函数,fun函数的功能是将一维数组奇数位元素的数值由小到大排序;最后将排好序的新的一维数组进行输出。因此D选项正确。

(33)若有以下程序

 #include <stdio.h>

 #define  N  4

 void fun( int  a[][N], int  b[], int  flag )

 {  int  i,j;

    for( i=0; i<N; i++ )

    {  b[i] = a[0][i];

       for( j=1; j<N; j++ )

          if (flag ? (b[i] > a[j][i]) : (b[i] < a[j][i]))       b[i] = a[j][i];

    }

 }

 main()

 {  int  x[N][N]={1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16}, y[N],i;

    fun(x, y, 1);

    for (i=0;i<N; i++)   printf(“%d,”, y[i]);

    fun(x, y, 0);

    for (i=0;i<N; i++)   printf(“%d,”, y[i]);

    printf(“\n”);

 }

则程序的输出结果是

A) 4,8,12,16,1,5,9,13,

B) 1,2,3,4,13,14,15,16,

C) 1,5,9,13,4,8,12,16,

D) 13,14,15,16,1,2,3,4,

答案:B

【解析】该题首先初始化二维数组,if (flag ? (b[i] > a[i][j]) : (b[i] < a[i][j]))条件语句的条件表达式使用了条件运算符构成的选择结构,即flag为真时,以(b[i] > a[i][j])作为条件表达式的值,否则以(b[i] < a[i][j])作为条件表达式的值,fun函数功能是给一维数组赋值。fun(x, y, 1);该函数调用后,即当flag为真时,使一维数组获得二维数组第1行的数值;fun(x, y, 0);该函数调用后,即当flag为假时,使一维数组获得二维数组第4行的数值;因此B选项正确。

(34)有以下程序

#include <stdio.h>

void fun1(char *p)

{

char  *q;

q=p;

while(*q!=’\0′)

{ 

    (*q)++; 

    q++; 

}

}

main()

{

char  a[]={“Program”}, *p;

p=&a[3]; 

fun1(p); 

printf(“%s\n”,a);

}

程序执行后的输出结果是()。

A) Prphsbn

B) Prohsbn

C) Progsbn

D) Program

答案:B

【解析】(*q)++是q所指的字符加1,q++就是指针移到下一个字符。因此B选项正确。

(35)有以下程序

#include <stdio.h>

#include <string.h>

void fun( char *s, int m1, int m2 )

{ char t, *p;

p=s + m1; s= s+m2;

while( s<p )

{ t=*s; *s=*p; *p=t;

  s++;   p–;

}

}

main()

{ char ss[10]=”012345678″;

int  n=6;

fun( ss,0,n-1 );

fun( ss,9,n );

fun( ss,0,9 );

printf(“%s\n”, ss );

}

程序运行后的输出结果是()。

A) 012345

B) 876543210

C) 876543

D) 012345678

答案:A

【解析】fun(*ss, m1, m2 )的作用是,如果m1>m2交换数组元素ss[m1],ss[m2]。因此,fun(ss,0,5)后ss的0,1,2,3,4,5,6,7,8,\0。fun(ss,9,6) 后ss的0,1,2,3,4,5, \0,8,7,6。fun(ss,0,9)后ss的0,1,2,3,4,5,\0,8,7,6。因此打印结果012345。故答案为A选项

(36)有以下程序

#include <stdio.h>

typedef struct stu {

                   char  name[10];

                   char  gender;

                   int  score;

                 } STU;

void f( STU a, STU *b, STU c )

{ *b = c =a;

printf( “%s,%c,%d,”, b->name, b->gender, b->score );

printf( “%s,%c,%d,”, c.name, c.gender, c.score );

}

main( )

{ STU a={“Zhao”, ‘m’, 290}, b={“Qian”, ‘f’, 350}, c={“Sun”, ‘m’, 370};

f( a, &b, c );

printf( “%s,%c,%d,”, b.name, b.gender, b.score );

printf( “%s,%c,%d\n”, c.name, c.gender, c.score );

}

程序运行后的输出结果是()。

A) Zhao,m,290,Zhao,m,290,Zhao,m,290,Sun,m,370

B) Zhao,m,290,Zhao,m,290,Zhao,m,290,Zhao,m,290

C) Zhao,m,290,Zhao,m,290,Qian,f,350,Sun,m,370

D) Zhao,m,290,Zhao,m,290,Qian,f,350,Zhao,m,290

答案:A

【解析】C语言函数参数传递分为:1、值传递过程中,被调函数的形参作为被调函数的局部变量处理,即在内存的堆栈中开辟空间以存放由主调函数放进来的实参的值,从而成为了实参的一个拷贝。值传递的特点是被调函数对形参的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值。

2、地址传递过程中,被调函数的形参虽然也作为局部变量在堆栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过堆栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。题设中,参数b是地址传递,因此会直接影响实参变量。a,c是值传递,传递是a,c的拷贝,不会a,c实参产生影响,因此,调用函数返回,c没有被修改,b被修改了。故答案为A选项。

(37)有以下程序:

#include <stdio.h>

#include <stdlib.h>

int fun(int n)

{  int *p;

p = (int*)malloc(sizeof(int));

*p=n; return *p;

}

main()

{  int a;

a = fun(10); printf(“%d\n”,a+fun(10));

}

程序的运行结果是(  )。

A) 0

B) 10

C) 20

D) 出错

答案:C

【解析】malloc(sizeof(int))的作用是开辟一个长度为sizeof(int)存储空间,并通过强制类型转换(int*)将此存储空间的地址赋给了一个整型的指针变量p。然后执行语句p=n,使得p的值为10,并通过return返回此值,即a的值为10。然后在主函数中输出a+fun(10)=10+10=20。

(38)有以下程序

#include <stdio.h>

#define f(x) xxx

main()

{

int a=3,s,t ;

s=f(a+1);

t=f((a+1));

printf(“%d,%d\n”,s,t);

}程序运行后的输出结果是()。

A) 10,64

B) 10,10

C) 64,10

D) 64,64

答案:A

【解析】本题考查宏定义的用法,宏定义只是做个简单的替换,所以本题中执行f(a+1)=a+1a+1a+1=3a+1=10,f((a+1))=(a+1)(a+1)*(a+1)=64,所以答案为A选项。

(39)有以下程序

#include <stdio.h>

main( )

{

int  i;

FILE*  fp;

for (i=0; i<3; i++)

{

    fp = fopen(“res.txt”, “w”);

    fputc(‘K’ + i, fp);

    fclose(fp);

}

}

程序运行后,在当前目录下会生成一个res.txt文件,其内容是()。

A) EOF

B) M

C) KLM

D) L

答案:B

【解析】for循环中,每次都执行打开文件res.txt、写入文件、再关闭文件的操作,由于fopen函数使用’w’模式写文件,所以每次打开res.txt后,都删除文件中的原有数据,再重新写入新数据。所以文件最终的内容只与最后一次for循环有关,最后一次for循环是向文件res.txt写入’K’+2, 即M,正确答案是B选项。

(40)有以下程序

#include <stdio.h>

main( )

{ FILE *fp;

int i, a[6] = {1,2,3,4,5,6}, k;

fp = fopen(“data.dat”, “w+”);

fprintf(fp, “%d\n”, a[0]);

for (i=1; i<6; i++)

{ rewind(fp);

   fprintf(fp, “%d\n”, a[i]);

}

rewind(fp);

fscanf(fp, “%d”, &k);

fclose(fp);

printf(“%d\n”, k);

}

程序运行后的输出结果是()。

A) 6

B) 21

C) 123456

D) 654321

答案:A

【解析】本题首先定义文件指针变量fp和一个数组a[],再打开一个文件”data.dat”,随后先给文件写入数据a[0],由于rewind函数是将文件指针从当前位置重新指向文件开始位置,所以for循环依次将数组a中的数据写入文件开始位置,退出循环后,文件中的数据顺序为:654321,重新使指针指向文件开始位置,将此时fp指向的数据(即文件中第一个数据6)写入变量k中,关闭文件,输出k值,答案为A选项。

猜你喜欢

转载自blog.csdn.net/qq_43581670/article/details/107605530