打印本文 打印本文  关闭窗口 关闭窗口  
05年9月等级考试二级C语言考前密卷1
作者:佚名  文章来源:不详  点击数  更新时间:2008/4/18 14:37:38  文章录入:杜斌  责任编辑:杜斌

 选择题(1)~(10)每小题2分,(11)-(50)每小题1分,共60分)
  
  下列各题A)、B)、C)、D)四个选项中,只有一个选项是正确的,请将正确选项涂写在答题卡相应位置上,答在试卷上不得分。
  
  (1)数据结构中,与所使用的计算机无关的是数据的________。
  A)存储结构   B)物理结构      C)逻辑结构     D)物理和存储结构
  答案:C
  评析:数据结构概念一般包括3个方面的内容,数据的逻辑结构、存储结构及数据上的运算集合。数据的逻辑结构只抽象的反映数据元素之间的逻辑关系,而不管它在计算机中的存储表示形式。
  
  (2)栈底至栈顶依次存放元素A、B、C、D,在第五个元素E入栈前,栈中元素可以出栈,
  则出栈序列可能是________。
  A)ABCED     B)DBCEA       C)CDABE       D)DCBEA
  答案:D
  评析:栈操作原则上"后进先出",栈底至栈顶依次存放元素A、B、c、D,则表明这4个元素中D是最后进栈,B、c处于中间,A最早进栈。所以出栈时一定是先出D,再出c,最后出A。
  
  (3)线性表的顺序存储结构和线性表的链式存储结构分别是________。
  A)顺序存取的存储结构、随机存取的存储结构
  B)随机存取的存储结构、顺序存取的存储结构
  C)随机存取的存储结构、随机存取的存储结构
  D)任意存取的存储结构、任意存取的存储结构
  答案:B
  评析:顺序存储结构中,数据元素存放在一组地址连续的存储单元中,每个数据元素地址可通过公式LOC(ai)。LOC(a1)+(i-1)L计算得到,从而实现了随机存取。对于链式存储结构,要对某结点进行存取,都得从链的头指针指向的结点开始,这是一种顺序存取的存储结构。
  
  (4)在单链表中,增加头结点的目的是________。
  A)方便运算的实现          B)使单链表至少有一个结点
  C)标识表结点中首结点的位置     D)说明单链表是线性表的链式存储实现
  答案:A
  评析:头结点不仅标识了表中首结点的位置,而且根据单链表(包含头结点)的结构,只要掌握了表头,就能够访问整个链表,因此增加头结点目的是为了便于运算的实现。
  
  (5)软件设计包括软件的结构、数据接口和过程设计,其中软件的过程设计是指________。
  A)模块间的关系            B)系统结构部件转换成软件的过程描述
  C)软件层次结构            D)软件开发过程
  答案:B
  评析:软件设计包括软件结构设计、数据设计、接口设计和过程设计。其中结构设计是定义软件系统各主要部件之间的关系;数据设计是将分析时创建的模型转化为数据结构的定义;接口设计是描述软件内部、软件和操作系统之间及软件与人之间如何通信;过程设计则是把系统结构部件转换成软件的过程性描述。
  


  (6)为了避免流程图在描述程序逻辑时的灵活性,提出了用方框图来代替传统的程序流程  图,通常也把这种图称为________。
  A)PAD图    B)N-S图       C)结构图       D)数据流图
  答案:B
  评析:常见的过程设计工具 有:程序流程图、N-S图、PAD图和HIPO图。其中,为了避免流程图在描述程序逻辑时的灵活性,提出了用方框图来代替传统的程序流程图,通常也把这种图称为N-S图。
  
  (7)数据处理的最小单位是________。
  A)数据     B)数据元素      C)数据项      D)数据结构
  答案:C
  评析:数据处理的最小单位是数据项;由若干数据项组成数据元素;而数据是指能够被计算机识别、存储和加工处理的信息载体;数据结构是指数据之间的相互关系和数据运算。
  
  (8)下列有关数据库的描述,正确的是________。
  A)数据库是一个DBF文件       B)数据库是一个关系
  C)数据库是一个结构化的数据集合   D)数据库是一组文件
  答案:C
  评析:数据库(Database,简称DB)是数据的集合,它具有统一的结构形式并存放于统一的存储介质内,是多种应用数据的集成,并可被各个应用程序所共享。数据库中的数据具有"集成"、"共享"之特点。
  
  (9)单个用户使用的数据视图的描述称为 ______ 。
  A)外模式    B)概念模式     C)内模式      D)逻辑模式
  答案:A
  评析:外模式是用户的数据视图,也就是用户所见到的数据模式;全局数据视图的描述称为概念模式,即数据库中全部数据的整体逻辑结构的描述;物理存储数据视图的描述称为内模式,即数据库在物理存储方面的描述;存储模式即为内模式。
  
  (10)需求分析阶段的任务是确定______。
  A)软件开发方法  B)软件开发工具  C)软件开发费用    D)软件系统功能
  答案:D
  评析:需求分析是软件定义时期的最后一个阶段,它的基本任务就是详细调查现实世界要处理的对象(组织、部门、企业等),充分了解原系统的工作概况,明确用户的各种需求,然后在此基础上确定新系统的功能。
  
  (11)若变量a是int类型,并执行了语句:a=’A’+1.6;,则正确叙述是______。
  A)a的值是字符C           B)a的值是浮点型
  C)不允许字符型和浮点型相加     D)a的值是字符’A’的ASCII值加上l
  答案:D
  评析:在赋值表达式中,赋值符右边的值的类型会自动转换成赋值符左边的变量的类型。在本题中,先用"A"的ASCII码值加上1.46得到66.46,然后将它强制转换成int型,转换后,实数的小数部分全部
  
  (12)若以下选项中变量已正确定义,则正确的赋值语句是______。
  A)x1=26.8%3;  B)1+2=x2;   C)x3=0x12;     D)x4=1+2=3;
  答案:C
  评析:赋值符号"="就是赋值运算符,它的作用是将一个数据赋给一个变量。如果赋值运算符两侧的类型不一致,但都是数值型或字符型时,在赋值时要进行类型转换,所以选项A错误。在赋值表达式中,赋值运算符的左侧必须是一个变量,所以选项B、D错误。选项C是将一个十六进制数赋值给变量x3。
  
  (13)以下程序段的输出结果是______。
  int a=1234;
  printf("%2d\n",a);
  A)12       B)34        C)1234  D)提示出错、无结果
  答案:C
  评析:本题主要考查对primf函数域宽描述符的理解,在这里我们要特别注意:输出数据的实际精度并不主要决定于格式项中的域宽与精度,也不决定于输入的数据精度,而主要决定于数据在机器内的存储精度。
  


  (14)以下选项中不属于C语言的类型的是______。
  A)signed short int         B)unsigned char
  C)signed long            D)long short
  答案:D
  评析:c语言中归纳起来,基本类型数据有以下几种:
  [signed]char;unsigned char;[signed]short[int];unsigned short[int];[signed]long[int];unsigned long[int];float;double.
  
  (15)设有定义:int a,*pa=&a;以下scanf语句能正确为变量a读入数据的是______。
  A)scanf("%d",B);         B)scanf("%d",a);
  C)scanf("%d",&pa);        D)scanf("%d",*pa);
  答案:C
  评析:scanf函数要求其中的输入项必须是地址形式,比如:普通变量的地址、数组名、指针变量等。对于普通变量,地址形式为:&变量名;当一个普通变量的地址赋予了一个指针变量名,scanf函数的输入项处就可以直接写这个指针变量名。
  
  (16)以下程序的输出结果是______。
  main()
  {int a=5,b=4,c=6,d;
  printf("%d\n",d=a>c?(a>c?a:C):(b));
  }
  A)5       B)4         C)6        D)不确定
  答案:B
  评析:本题最重要的分析d=a>c?(a>c?a:C):(b)),首先运算括号内的式子a>c?a:c,它的值是c的值6,即式子化成d=a>c?6:4。显然a=c,所以将4赋给d。
  
  (17)以下程序中,while循环的循环次数是______ 。
  main()
  { int i=0:
  while(i<10)
  {if(i<1)continue;
  if(i==5)break;
  i++:
  }
  ……
  }
  A)1       B)10        C)6        D)死循环,不能确定次数
  答案:D
  评析:进入循环后,先执行一个条件语句,如果i的值小于l,那么直接进入下一轮循环,因为i的初始值是0,小于l,故直接进入下一轮循环,又因为i的值始终没有改变,所以这个循环成了死循环。
  
  (18)有以下程序:
  main()
  {
  char k;int i;
  for(i=1;i<3;i++)
  {
  scanf("%c",&k);
  switch(k)
  {
  case’0’:printf["another\n"];
  ca se’1’:printf["number\n");
  }
  }
  }
  程序运行时,从键盘输入:0l<回车>,程序执行后输出结果是______。
  A)another   B)another      C)another      D)number
  number      number        number       number
  another       number
  答案:C
  评析:switch语句是多分支选择语句,执行完一个case后面的语句后,流程控制转移到下一个case继续执行。"case常量表达式"只是起语句标号作用,并不是在该处进行条件判断。在执行switch语句时,根据switch后面表达式的值找到匹配的入口标号,就从此标号开始执行下去,不再进行判断。
  


  (19)以下程序的输出结果是______。
  main()
  {Int a=O,i;
  for(
  (27)有以下程序段:
  int a[10]={1,2,3,4,5,6,7,8,9,10},*p=&a[3],b;
  b=p[5];
  b中的值是______。
  A)5       B)6         C)8         D)9
  答案:D
  评析:数组a各元素a[O]~a[9]的值依次为1~10;在程序的说明部分,指针变量p初始化为&a[3](即a+3),则p[5]相当于·(p+5),相当于a[8],所以执行语句b=p[5];后,b的值为9。
  
  (28)在C语言中,形参的缺省存储类是______。
  A)auto     B)register      C)static      D)extern
  答案:A
  评析:程序进行编译时,并不为形式参数分配存储穿间。只有在被调用时,形式参数才临时地占有存储空间。形式参数用关键字auto作存储类别的声明时,关键字"auto"可以省略,auto不写则隐含确定为"自动存储类别",它属于动态存储方式。
  
  (29)有以下定义:
  #include
  char a[10],*b=a;
  不能给数组a输入字符串的语句是______。
  A)gets(a);  B)gets(a[0]);  C)gets(&a[0]); D)gets(b);
  答案:B
  评析:函数gets的格式为:gets(字符数组名)
  c语言中,字符数组名代表数组的首元素地址,即&a[O],字符指针变量lb值也为数组a的首地址,选项A、c、D均能给数组a输入字符串。选项B中a[O]为数组元素,是一个数据变量。
  
  (30)若指针p已正确定义,要使p指向两个连续的整型动态存储单元,不正确的语句是 ______.
  A)p=2*(int*)malloc(sizeof(int));  B)p=(int*)malloc(2*sizeof(int))
  C)p=(int*)malloc(2*2)        D)p=(int*)calloc(2,sizeof(int))
  答案:A
  评析:malloe函数的作用是在内存开辟指定大小的存储空问,并将此存储空间的地 址作为函数值带回,它的原型为void。malloe(unsigned int size),函数值为指针,这个指针是指向void类型。如果要将此返回地址赋给一个指向特定类型的指针变量,则应进行强制类型转换。
  calloc函数的模型是:void*calloc(unsigned int num,unsigned int size)作用是分配num个大小为size字节的空间。
  
  (31)下面程序段的输出结果是______ 。
  main()
  {
  char strl [10]={’s’,’t’,’u’,’d’,’e’,’n’,’t’};
  printf("%d\n",strlen(strl));
  }
  A)7       B)8         C)10        D)存在语法错误
  答案:A
  评析:strlen()函数得到字符串的长度,返回值为数值型。字符数组初始化,若提供的初值个数大于数组长度,则按语法错误处理。如果初值个数小于数组长度,则只将这些字符赋给数组中前面那些元素,其余的元素自动定义为空字符。
  


  (32)以下程序的输出结果是______。
  main()
  {int x=040;
  printf("%o\n",x<<1);
  }
  A)100      B)80        C)64         D)32
  答案:A
  评析:040用二进制表示就是00100000,左移一位,得到的值应该是01000000,化成八进制应该是0100。
  


  (33)下面程序运行后的输出结果是______。
  main()
  {
  char arr[2][4];
  strcpy(arr[0],"you");strcpy(arr[1],"me");
  arr[0][3]=’&’;
  print"%s\n",arr[0]);
  }
  A)you&me    B)you        C)me         D)err
  答案:A
  评析:在主函数中定义了一个2*4的二维字符数组,执行strcpy(arr[O]"fIyou");后,arr[0]={’y’’o’,’u’,’ \0’},执行strcpy(arr[1],"me");后arr[1]={ ’m’, ’e’,’\0’,不定},当执行完arr[O][3];’&’;从arr[O]开始的存储空间中的字符依次是’y’,’o’,’u’, ’&’,’m’,’e’,’\0’,故执行printf("%s\n",arr[O]);后的输出结果为"you&me",选A。
  
  (34)若要打开A盘上的user子目录下名为abc.txt的文本文件进行读、写操作,下面符合  此要求的函数调用是______。
  A)fopen("A:\user\abc.txt","r")   B)fopen("A:\\user\\abc.txt","r+")
  C)fopen("A:\user\abc.txt","rb")   D)fopen("A:\\user\\abc.txt","w")
  答案:B
  评析:本题考查点是fopen函数中文件使用方式的指定。
  文件使用方式"r",表示以"只读"方式打开一个字符文件。 
 文件使用方式"r+",表示以"读写"方式打开一个字符文件。
  文件使用方式""rb",表示以"只读"方式打开一个二进制文件。
  文件使用方式"w",表示以"只写"方式打开一个字符文件。
  
  (35)以下不能正确进行字符串赋初值的语句为______。
  A)char str[5]= "good! "     B)char str[]="good! "
  C)char *str="good! "       D)char str[5]={’g’,’0’,’o’,’d’}
  答案:A
  评析:用字符串作初值为字符数组赋值时,系统总会自动在字符串的末尾补上一个"\O",如选项A中定义的话,把第6个字符也就是"\0"赋给str数组,但此数组只含5个元素,而放到了s仃数组之后的存储单元中,这就可能会破坏其它数据区或程序本身。
  
  (36)有以下程序:
  #include
  main(int argc,char*argv[])
  {
  int i,len=O;
  for(i=1;i  Print("%d\n",len);
  }
  经编译连接后生成可执行文件ex.exe,若运行时输入以下带参数的命令行
  ex abcd efg h3 k44
  运行后输出结果是______。
  A)14      B)12         C)8         D)6
  答案:C
  评析:main函数的第一个参数argc是int型变量,用来统计命令行中的字符串个数,本题输入带参数的命令行"ex abed efg h3 k44<回车>",argc的值是5;第二个参数是字符型指针数组,长度由argc的值决定,每个数组元素存放一个指向字符串数据的指针。 for语句将命令行中两个字符串abed和h3的长度进行累加,放在变量len中。
  


  (37)若有下面的说明和定义:
  struct test
  { int ml;char m2;float m3;
  union uu{char ul[5];int u2[2];}ua;
  }myaa;
  则sizeof(stuct test)的值是______。
  A)12      B)16          C)14       D)9
  答案:A
  评析:在定义了结构体变量后,系统会为之分配内存单元,在内存中一个整型占2个字节,一个字符占1个字节,一个数组元素占1个字节,一个浮点型占4个字节。结构体变量所占内存长度是各成员占的内存长度之和;而共用体变量所占的内存长度等于最长的成员的长度。所以test在内存中占12个字节(2+l+4 +5=12)。
  
  (38)若有定义:int aa[8];,则以下誊达式中不能代表数组元素aa[1]的地址的是______。
  A)&aa[0]+l   B)&aa[1]      C)aa[0]++    D)aa+1
  答案:C
  评析:答案A中&aa[0]表示aa[0]的地址,加上1就是aa[1]的地址。同样aa[1]的地址也可以直接用&aa[1]或aa+l表示。
  


  (39)下面叙述中正确的是______。
  A)全局变量的作用域一定比局部变量的作用域范围大
 B)静态类别变量的生存期贯穿于整个程序的运行期间
  C)函数的形参都属于全局变量
  D)未在定义语句中赋值的auto变量和static变量的初值都是随机值
  答案:B
  评析:c语言中,全局变量的作用范围是从定义处到程序结束,因此全局变量的定义点直接影响其作用范围,因此选项A错误。静态(statiC)存储类别变量是在程序编译时分配存储空间,该类别变量在整个程序运行期间占据着固定的存储单元,当多次调用其所在的函数时,该类别变量的值为上一次调用的值,直至整个程序结束运行后才释放该变量所占存储单元。因此选项B正确,选项D错误。c语言规定:函数的形参是auto型局部变量,因此选项c错误。
  
  (40)以下程序的输出结果是______ 。
  f(int b[],int m,int n)
  {jnt i,s=0;
  for(i=m;i  return s;
  )
  main()
  {int x,a[]:{1,2,3,4,5,6,7,8,9};
  x=f(a,3,7);
  printf("%d\n",x);
  )
  A)10      B)18         C)8         D)15
  答案:A
  评析:本题中,主函数调用f函数,在f函数中执行了两次循环,第一次i=3,s=0+b[i]:4,然后i的值被修改成5,仍然满足循环条件,进入第二轮循环,s=4+b[5]=4+6=10,随后,i的值被修改成7,不再满足循环条件,退出循环,返回s的值。所以最后输出结果是10。
  
  (41)若有以下定义和语句:
  int s[4][5],(*ps)[5];
  ps=s;
  则对s数组元素的正确引用形式是______ 。
  A)ps+l       B)*(ps+3)     C)ps[0][2]    D)*(ps+1)+3
  答案:C
  评析:选项A得到的是s数组第一行的地址,选项B得到的是s数组第三行第零列元素的地址,而选项D得到的是s数组第一行第三列元素的地址。只有选项c正确引用了ps数组第零行第二列的元素。
  
  (42)以下程序的输出结果是______。
  main()
  {int b[3][3]={0,1,2,0,1,2,0,1,2},i,j,t=1;
  for(i=0;i<3;i++)
  fbr(j=I;J<=I;J++)t=t+b[i][b[j][j]];
  printf("%d\n",t);
  }
  A)3       B)4          C)l         D)9
  答案:B
  评析:`两个循环语句嵌套使用,在第一次外循环中,i=0,执行内循环时,将j赋值为i的值O,执行一次t=t+b[i][b[j][j]],得到t
  (27)有以下程序段:
  int a[10]={1,2,3,4,5,6,7,8,9,10},*p=&a[3],b;
  b=p[5];
  b中的值是______。
  A)5       B)6         C)8         D)9
  答案:D
  评析:数组a各元素a[O]~a[9]的 值依次为1~10;在程序的说明部分,指针变量p初始化为&a[3](即a+3),则p[5]相当于·(p+5),相当于a[8],所以执行语句b=p[5];后,b的值为9。


  (28)在C语言中,形参的缺省存储类是______。
  A)auto     B)register      C)static      D)extern
  答案:A
  评析:程序进行编译时,并不为形式参数分配存储穿间。只有在被调用时,形式参数才临时地占有存储空间。形式参数用关键字auto作存储类别的声明时,关键字"auto"可以省略,auto不写则隐含确定为"自动存储类别",它属于动态存储方式。
  
  (29)有以下定义:
  #include
  char a[10],*b=a;
  不能给数组a输入字符串的语句是______。
  A)gets(a);  B)gets(a[0]);  C)gets(&a[0]); D)gets(b);
  答案:B
  评析:函数gets的格式为:gets(字符数组名)
  c语言中,字符数组名代表数组的首元素地址,即&a[O],字符指针变量lb值也为数组a的首地址,选项A、c、D均能给数组a输入字符串。选项B中a[O]为数组元素,是一个数据变量。
  


  (30)若指针p已正确定义,要使p指向两个连续的整型动态存储单元,不正确的语句是 ______.
  A)p=2*(int*)malloc(sizeof(int));  B)p=(int*)malloc(2*sizeof(int))
  C)p=(int*)malloc(2*2)        D)p=(int*)calloc(2,sizeof(int))
  答案:A
  评析:malloe函数的作用是在内存开辟指定大小的存储空问,并将此存储空间的地址作为函数值带回,它的原型为void。malloe (unsigned int size),函数值为指针,这个指针是指向void类型。如果要将此返回地址赋给一个指向特定类型的指针变量,则应进行强制类型转换。
  calloc函数的模型是:void*calloc(unsigned int num,unsigned int size)作用是分配num个大小为size字节的空间。
  
  (31)下面程序段的输出结果是______ 。
  main()
  {
  char strl [10]={’s’,’t’,’u’,’d’,’e’,’n’,’t’};
  printf("%d\n",strlen(strl));
  }
  A)7       B)8         C)10        D)存在语法错误
  答案:A
  评析:strlen()函数得到字符串的长度,返回值为数值型。字符数组初始化,若提供的初值个数大于数组长度,则按语法错误处理。如果初值个数小于数组长度,则只将这些字符赋给数组中前面那些元素,其余的元素自动定义为空字符。
  
  (32)以下程序的输出结果是______。
  main()
  {int x=040;
  printf("%o\n",x<<1);
  }
  A)100      B)80        C)64         D)32 
 答案:A
  评析:040用二进制表示就是00100000,左移一位,得到的值应该是01000000,化成八进制应该是0100。
  
  (33)下面程序运行后的输出结果是______。
  main()
  {
  char arr[2][4];
  strcpy(arr[0],"you");strcpy(arr[1],"me");
  arr[0][3]=’&’;
  print"%s\n",arr[0]);
  }
  A)you&me    B)you        C)me         D)err
  答案:A
  评析:在主函数中定义了一个2*4的二维字符数组,执行strcpy(arr[O]"fIyou");后,arr[0]={’y’’o’,’u’,’ \0’},执行strcpy(arr[1],"me");后arr[1]={ ’m’, ’e’,’\0’,不定},当执行完arr[O][3];’&’;从arr[O]开始的存储空间中的字符依次是’y’,’o’,’u’, ’&’,’m’,’e’,’\0’,故执行printf("%s\n",arr[O]);后的输出结果为"you&me",选A。
  
  (34)若要打开A盘上的user子目录下名为abc.txt的文本文件进行读、写操作,下面符合  此要求的函数调用是______。
  A)fopen("A:\user\abc.txt","r")   B)fopen("A:\\user\\abc.txt","r+")
  C)fopen("A:\user\abc.txt","rb")   D)fopen("A:\\user\\abc.txt","w")
  答案:B
  评析:本题考查点是fopen函数中文件使用方式的指定。
  文件使用方式"r",表示以"只读"方式打开一个字符文件。
  文件使用方式"r+",表示以"读写"方式打开一个字符文件。
  文件使用方式""rb",表示以"只读"方式打开一个二进制文件。
  文件使用方式"w",表示以"只写"方式打开一个字符文件。
  


  (35)以下不能正确进行字符串赋初值的语句为______。
  A)char str[5]= "good! "     B)char str[]="good! "
  C)char *str="good! "       D)char str[5]={’g’,’0’,’o’,’d’}
  答案:A
  评析:用字符串作初值为字符数组赋值时,系统总会自动在字符串的末尾补上一个"\O",如选项A中定义的话,把第6个字符也就是"\0"赋给str数组,但此数组只含5个元素,而放到了s仃数组之后的存储单元中,这就可能会破坏其它数据区或程序本身。
  
  (36)有以下程序:
  #include
  main(int argc,char*argv[])
  {
  int i,len=O;
  for(i=1;i  Print("%d\n",len);
  }
  经编译连接后生成可执行文件ex.exe,若运行时输入以下带参数的命令行
  ex abcd efg h3 k44
  运行后输出结果是______。
  A)14      B)12    C)8         D)6
  答案:C
  评析:main函数的第一个参数argc是int型变量,用来统计命令行中的字符串个数,本题输入带参数的命令行"ex abed efg h3 k44<回车>",argc的值是5;第二个参数是字符型指针数组,长度由argc的值决定,每个数组元素存放一个指向字符串数据的指针。 for语句将命令行中两个字符串abed和h3的长度进行累加,放在变量len中。
  


  (37)若有下面的说明和定义:
  struct test
  { int ml;char m2;float m3;
  union uu{char ul[5];int u2[2];}ua;
  }myaa;
  则sizeof(stuct test)的值是______。
  A)12      B)16          C)14       D)9
  答案:A
  评析:在定义了结构体变量后,系统会为之分配内存单元,在内存中一个整型占2个字节,一个字符占1个字节,一个数组元素占1个字节,一个浮点型占4个字节。结构体变量所占内存长度是各成员占的内存长度之和;而共用体变量所占的内存长度等于最长的成员的长度。所以test在内存中占12个字节(2+l+4 +5=12)。
  
  (38)若有定义:int aa[8];,则以下誊达式中不能代表数组元素aa[1]的地址的是______。
  A)&aa[0]+l   B)&aa[1]      C)aa[0]++    D)aa+1
  答案:C
  评析:答案A中&aa[0]表示aa[0]的地址,加上1就是aa[1]的地址。同样aa[1]的地址也可以直接用&aa[1]或aa+l表示。
  
  (39)下面叙述中正确的是______。
  A)全局变量的作用域一定比局部变量的作用域范围大
  B)静态类别变量的生存期贯穿于整个程序的运行期间
  C)函数的形参都属于全局变量
  D)未在定义语句中赋值的auto变量和static变量的初值都是随机值
  答案:B
  评析:c语言中,全局变量的作用范围是从定义处到程序结束,因此全局变量的定义点直接影响其作用范围,因此选项A错误。静态(statiC)存储类别变量是在程序编译时分配存储空间,该类别变量在整个程序运行期间占据着固定的存储单元,当多次调用其所在的函数时,该类别变量的值为上一次调用的值,直至整个程序结束运行后才释放该变量所占存储单元。因此选项B正确,选项D错误。c语言规定:函数的形参是auto型局部变量,因此选项c错误。
  
  (40)以下程序的输出结果是______ 。
  f(int b[],int m,int n)
  {jnt i,s=0;
  for(i=m;i  return s;
  )
  main()
  {int x,a[]:{1,2,3,4,5,6,7,8,9};
  x=f(a,3,7);
  printf("%d\n",x);
  )
  A)10      B)18         C)8         D)15
  答案:A
  评析:本题中,主函数调用f函数,在f函数中执行了两次循环,第一次i=3,s=0+b[i]:4,然后i的 值被修改成5,仍然满足循环条件,进入第二轮循环,s=4+b[5]=4+6=10,随后,i的值被修改成7,不再满足循环条件,退出循环,返回s的值。所以最后输出结果是10。
  
  (41)若有以下定义和语句:
  int s[4][5],(*ps)[5];
  ps=s;
  则对s数组元素的正确引用形式是______ 。
  A)ps+l       B)*(ps+3)     C)ps[0][2]    D)*(ps+1)+3
  答案:C
  评析:选项A得到的是s数组第一行的地址,选项B得到的是s数组第三行第零列元素的地址,而选项D得到的是s数组第一行第三列元素的地址。只有选项c正确引用了ps数组第零行第二列的元素。
  
  (42)以下程序的输出结果是______。
  main()
  {int b[3][3]={0,1,2,0,1,2,0,1,2},i,j,t=1;
  for(i=0;i<3;i++)
  fbr(j=I;J<=I;J++)t=t+b[i][b[j][j]];
  printf("%d\n",t);
  }
  A)3       B)4          C)l         D)9
  答案:B
  评析:`两个循环语句嵌套使用,在第一次外循环中,i=0,执行内循环时,将j赋值为i的值O,执行一次t=t+b[i][b[j][j]],得到t
  (27)有以下程序段:
  int a[10]={1,2,3,4,5,6,7,8,9,10},*p=&a[3],b;
  b=p[5];
  b中的值是______。
  A)5       B)6         C)8         D)9
  答案:D
  评析:数组a各元素a[O]~a[9]的值依次为1~10;在程序的说明部分,指针变量p初始化为&a[3](即a+3),则p[5]相当于·(p+5),相当于a[8],所以执行语句b=p[5];后,b的值为9。


  (28)在C语言中,形参的缺省存储类是______。
  A)auto     B)register      C)static      D)extern
  答案:A
  评析:程序进行编译时,并不为形式参数分配存储穿间。只有在被调用时,形式参数才临时地占有存储空间。形式参数用关键字auto作存储类别的声明时,关键字"auto"可以省略,auto不写则隐含确定为"自动存储类别",它属于动态存储方式。
  
  (29)有以下定义:
  #include
  char a[10],*b=a;
  不能给数组a输入字符串的语句是______。
  A)gets(a);  B)gets(a[0]);  C)gets(&a[0]); D)gets(b);
  答案:B
  评析:函数gets的格式为:gets(字符数组名)
  c语言中,字符数组名代表数组的首元素地址,即&a[O],字符指针变量lb值也为数组a的首地址,选项A、c、D均能给数组a输入字符串。选项B中a[O]为数组元素,是一个数据变量。
  
  (30)若指针p已正确定义,要使p指向两个连续的整型动态存储单元,不正确的语句是 _____  _.
  A)p=2*(int*)malloc(sizeof(int));  B)p=(int*)malloc(2*sizeof(int))
  C)p=(int*)malloc(2*2)        D)p=(int*)calloc(2,sizeof(int))
  答案:A
  评析:malloe函数的作用是在内存开辟指定大小的存储空问,并将此存储空间的地址作为函数值带回,它的原型为void。malloe (unsigned int size),函数值为指针,这个指针是指向void类型。如果要将此返回地址赋给一个指向特定类型的指针变量,则应进行强制类型转换。
  calloc函数的模型是:void*calloc(unsigned int num,unsigned int size)作用是分配num个大小为size字节的空间。
  
  (31)下面程序段的输出结果是______ 。
  main()
  {
  char strl [10]={’s’,’t’,’u’,’d’,’e’,’n’,’t’};
  printf("%d\n",strlen(strl));
  }
  A)7       B)8         C)10        D)存在语法错误
  答案:A
  评析:strlen()函数得到字符串的长度,返回值为数值型。字符数组初始化,若提供的初值个数大于数组长度,则按语法错误处理。如果初值个数小于数组长度,则只将这些字符赋给数组中前面那些元素,其余的元素自动定义为空字符。
  
  (32)以下程序的输出结果是______。
  main()
  {int x=040;
  printf("%o\n",x<<1);
  }
  A)100      B)80        C)64         D)32
  答案:A
  评析:040用二进制表示就是00100000,左移一位,得到的值应该是01000000,化成八进制应该是0100。
  
  (33)下面程序运行后的输出结果是______。
  main()
  {
  char arr[2][4];
  strcpy(arr[0],"you");strcpy(arr[1],"me");
  arr[0][3]=’&’;
  print"%s\n",arr[0]);
  }
  A)you&me    B)you        C)me         D)err
  答案:A
  评析:在主函数中定义了一个2*4的二维字符数组,执行strcpy(arr[O]"fIyou");后,arr[0]={’y’’o’,’u’,’ \0’},执行strcpy(arr[1],"me");后arr[1]={ ’m’, ’e’,’\0’,不定},当执行完arr[O][3];’&’;从arr[O]开始的存储空间中的字符依次是’y’,’o’,’u’, ’&’,’m’,’e’,’\0’,故执行printf("%s\n",arr[O]);后的输出结果为"you&me",选A。
  
  (34)若要打开A盘上的user子目录下名为abc.txt的文本文件进行读、写操作,下面符合  此要求的函数调用是______。
  A)fopen("A:\user\abc.txt  ","r")   B)fopen("A:\\user\\abc.txt","r+")
  C)fopen("A:\user\abc.txt","rb")   D)fopen("A:\\user\\abc.txt","w")
  答案:B
  评析:本题考查点是fopen函数中文件使用方式的指定。
  文件使用方式"r",表示以"只读"方式打开一个字符文件。
  文件使用方式"r+",表示以"读写"方式打开一个字符文件。
  文件使用方式""rb",表示以"只读"方式打开一个二进制文件。
  文件使用方式"w",表示以"只写"方式打开一个字符文件。
  


  (35)以下不能正确进行字符串赋初值的语句为______。
  A)char str[5]= "good! "     B)char str[]="good! "
  C)char *str="good! "       D)char str[5]={’g’,’0’,’o’,’d’}
  答案:A
  评析:用字符串作初值为字符数组赋值时,系统总会自动在字符串的末尾补上一个"\O",如选项A中定义的话,把第6个字符也就是"\0"赋给str数组,但此数组只含5个元素,而放到了s仃数组之后的存储单元中,这就可能会破坏其它数据区或程序本身。
  
  (36)有以下程序:
  #include
  main(int argc,char*argv[])
  {
  int i,len=O;
  for(i=1;i  Print("%d\n",len);
  }
  经编译连接后生成可执行文件ex.exe,若运行时输入以下带参数的命令行
  ex abcd efg h3 k44
  运行后输出结果是______。
  A)14      B)12         C)8         D)6
  答案:C
  评析:main函数的第一个参数argc是int型变量,用来统计命令行中的字符串个数,本题输入带参数的命令行"ex abed efg h3 k44<回车>",argc的值是5;第二个参数是字符型指针数组,长度由argc的值决定,每个数组元素存放一个指向字符串数据的指针。 for语句将命令行中两个字符串abed和h3的长度进行累加,放在变量len中。
  
  (37)若有下面的说明和定义:
  struct test
  { int ml;char m2;float m3;
  union uu{char ul[5];int u2[2];}ua;
  }myaa;
  则sizeof(stuct test)的值是______。
  A)12      B)16          C)14       D)9
  答案:A
  评析:在定义了结构体变量后,系统会为之分配内存单元,在内存中一个整型占2个字节,一个字符占1个字节,一个数组元素占1个字节,一个浮点型占4个字节。结构体变量所占内存长度是各成员占的内存长度之和;而共用体变量所占的内存长度等于最长的成员的长度。所以test在内存中占12个字节(2+l+4 +5=12)。
  
  (38)若有定义:int aa[8];,则以下誊达式中不能代表数组元素aa[1]的地址的是______。
  A)  &aa[0]+l   B)&aa[1]      C)aa[0]++    D)aa+1
  答案:C
  评析:答案A中&aa[0]表示aa[0]的地址,加上1就是aa[1]的地址。同样aa[1]的地址也可以直接用&aa[1]或aa+l表示。
  
  (39)下面叙述中正确的是______。
  A)全局变量的作用域一定比局部变量的作用域范围大
  B)静态类别变量的生存期贯穿于整个程序的运行期间
  C)函数的形参都属于全局变量
  D)未在定义语句中赋值的auto变量和static变量的初值都是随机值
  答案:B
  评析:c语言中,全局变量的作用范围是从定义处到程序结束,因此全局变量的定义点直接影响其作用范围,因此选项A错误。静态(statiC)存储类别变量是在程序编译时分配存储空间,该类别变量在整个程序运行期间占据着固定的存储单元,当多次调用其所在的函数时,该类别变量的值为上一次调用的值,直至整个程序结束运行后才释放该变量所占存储单元。因此选项B正确,选项D错误。c语言规定:函数的形参是auto型局部变量,因此选项c错误。
  
  (40)以下程序的输出结果是______ 。
  f(int b[],int m,int n)
  {jnt i,s=0;
  for(i=m;i  return s;
  )
  main()
  {int x,a[]:{1,2,3,4,5,6,7,8,9};
  x=f(a,3,7);
  printf("%d\n",x);
  )
  A)10      B)18         C)8         D)15
  答案:A
  评析:本题中,主函数调用f函数,在f函数中执行了两次循环,第一次i=3,s=0+b[i]:4,然后i的值被修改成5,仍然满足循环条件,进入第二轮循环,s=4+b[5]=4+6=10,随后,i的值被修改成7,不再满足循环条件,退出循环,返回s的值。所以最后输出结果是10。
  


  (41)若有以下定义和语句:
  int s[4][5],(*ps)[5];
  ps=s;
  则对s数组元素的正确引用形式是______ 。
  A)ps+l       B)*(ps+3)     C)ps[0][2]    D)*(ps+1)+3
  答案:C
  评析:选项A得到的是s数组第一行的地址,选项B得到的是s数组第三行第零列元素的地址,而选项D得到的是s数组第一行第三列元素的地址。只有选项c正确引用了ps数组第零行第二列的元素。
  
  (42)以下程序的输出结果是______。
  main()
  {int b[3][3]={0,1,2,0,1,2,0,1,2},i,j,t=1;
  for(i=0;i<3;i++)
  fbr(j=I;J<=I;J++)t=t+b[i][b[j][j]];
  printf("%d\n",t);
  }
  A)3       B)4          C)l         D)9
  答案:B
  评析:`两个循环语句嵌套使用,在第一次外循环中,i=0,执行内循环时,将j赋值为i的值O,执行一次t=t+b[i][b[j][j]],得到 
打印本文 打印本文  关闭窗口 关闭窗口