1.函数strcmp从头至尾顺序地将其对应字符比较,遇到两个字符不等时,两个字符相减得到一个int型值,两个字符串完全相同时,则返回0。
答:对。我的理解产生了错误。误以为返回值的是ascii码的大小。事实上int大于0则是1,小于则是-1。
2.数组名就是一个指针常量,指向数组的首元素(或者说代表了数组的首地址)。
答:错。数组名是地址,不是指针常量,它的值可以赋给指针。
3.有说明语句int a[4][5];,则a[2]+3表示 A 。
A.a数组行下标为2、列下标为3的元素的地址
B.0a数组行下标为2、列下标为3的元素的值
C.a数组第2行的首地址
D.a数组第3行的首地址
答:a[2]表示地址。+3表示地址后移3个元素。
4.语句int *p; *p=50;执行时,不会有任何错误。
答:错。在执行时,*P没有值。printf不出来任何值。
5.对于以下结构定义,++p->str中的++加在 A。 (2分)
struct
{
int len;
char *str;
} *p;
A.指针str上
B.指针p上
C.str指的内容上
D.以上均不是
答:因为p->str是对指针str的引用。
6.在一个以 h 为头的单向链表中,p 指针指向链尾的条件是(A)。
A.p->next=h
B.p->next=NULL
C.p->next->next=h
D.p->.data=-1
答:p 指针指向链尾那么p即为尾指针,循环链中尾指针下一个指向头指针。
7.以下哪个定义中的p不是指针,请选择恰当的选项: C
A.char **p;
B.char (*p)[10];
C.char p[6];
D.给出的三项中,p都是指针
答:[]的优先级高于,所以P先于[]结合,所以P是一个数组。数组里存放的元素都是指针。
8.c语言源程序是文本文件,目标文件和可执行文件是二进制文件。
答:对。只有二进制文件。才能被机器所识别。
9.如果二进制文件a.dat已经存在,现在要求写入全新数据,应以(B)方式打开。
A.“w”
B.“wb”
C.“w+”
D.“wb+”
答:首先是dat(二进制)文件,必须带b。全新文件,不能有+号,故选B。
10.定义FILE *fp; 则文件指针fp 指向的是(B)。
A.文件在磁盘上的读写位置
B.文件在缓冲区上的读写位置
C.整个磁盘文件
D.文件类型结构体
11.int (*p)[4]它表示p是一个指针数组,它包含4个指针变量元素.
答:错。p为指向包含4个元素的一维数组的指针变量。它只是一个指针。
12.设变量定义为 int a[2]={1,3}, p=&a[0]+1;,则p的值是( B)。(2分)
A.2
B.3
C.4
D.&a[0]+1
答:p在定义时赋值,意为将&a[0]+1赋给了p。且,a为int型,所以+1就是a向后加了一个元素大小的位置。故等于a[1]的值。
13.根据声明int a[10], *p=a; ,下列表达式错误的是( D)。 (2分)
A.a[9]
B.p[5]
C.a++
D.*p++
答:a为数组首地址的值,是常量。不能自加。
14.数组名就是一个指针常量,指向数组的首元素(或者说代表了数组的首地址)。
答:错。数组名代表数组首地址,与指针常量无关。
15.有说明语句int a[4][5];则a[2]+3表示
A.a数组行下标为2、列下标为3的元素的地址
B.a数组行下标为2、列下标为3的元素的值
C.a数组第2行的首地址
D.a数组第3行的首地址
答案:A.因为a[2]是取二位数组a[2]的地址,+3是表示按照int 类型地址+3.所以答案为地址,且数组下标是以0开始,则0+3=3,答案为A.
16.以下哪个定义中的p不是指针,请选择恰当的选项: (C)
A.char **p;
B.char (*p)[10];
C.char *p[6];
D.给出的三项中,p都是指针
答:*p[6]代表指针数组,其中的元素才代表指针。
17.语句int *p; *p=50;执行时,不会有任何错误(F)
答:P需要指向一个地址后才能对 *p赋值.
18.对于定义 char str[] = “abc\000def\n”(注:其中0为数字零),求字符串str的长度len和数组str的大小size,len和size分别是: (C)
A.12 ,13
B.3 ,11
C.3 ,9
D.3 ,4
答:\0XX为八进制,当XX为1-77时。\000视为\0,strlen为3。sizeof是全部占用的大小,与\0无关,则为12.
19.若定义pf为指向float类型变量f的指针,下列语句中(B)是正确的。
A.float f, *pf = f;(地址没有浮点型的)
B.float f, *pf = &f;
C.float *pf = &f, f;
D loat f, *pf =0.0;
解析:定义时初始化float *pf = &f;的等价的语句是: float *pf; pf = &f;.
20.在下列形式的常数中,C程序不允许出现的是( B )。
A: .45
B: ±123
C: 25.6e-2
D: 4e3
答案:
A:是常量,允许出现的。
B:在C语言中不允许像数学中一样同时表达一个数的正负,所以应该选择B答案。
C、D:都是表示指数形式的常量,书写格式正确。
21.下列可以作用C语言常量的是(A)
A: " "
B: ‘ab’
C: 二进制10010001
D: 3.0E
答:
B:不能写成‘ab’,只能是分开的‘a’,‘b’。(这是普通字符:用单撇号括起来的一个字符)
C:转义字符中有八进制字符,十六进制字符,没有二进制的转义字符。
D:有E的为指数形式的常量。规定以字母e或E代表以10为底的指数,在它们之前必须有数字,并且之后必须为整数,所以D这样的写法是错误的,E之后没有数字。
22.已定义以下函数:
int fun(int *p){return *p;}
fun函数返回值是 ( C )
A: 一个整数
B: 形参p的地址值
C: 形参p中存放的值
D: 不确定的值
解析:
在函数中传入的形参是一个指针变量,之后return 返回的值是这个指针变量中所存放的值。而A答案一个整数太笼统,地址也可以是一个整数,所以选C答案更加全面具体。
23.以下程序输出结果是( )
main( )
{
int x=1,y=0,a=0,b=0;
switch(x)
{
case 1:switch(y)
{
case 0 :a++;break;
case 1 :b++;break;
}
case 2:a++;b++;break;
case 3:a++;b++;
}
printf("a=%d,b=%d",a,b);
}
A: a=1,b=0
B: a=2,b=1
C: a=1,b=1
D: a=2,b=2
标准答案:B,代入数据即可。
24.
数组循环右移
本题要求实现一个对数组进行循环右移的简单函数:一个数组a中存有n(>0)个整数,将每个整数循环向右移m(≥0)个位置。
#include <stdio.h>
#define MAXN 10
int ArrayShift( int a[], int n, int m );
int main()
{
int a[MAXN], n, m;
int i;
scanf("%d %d", &n, &m);
for ( i = 0; i < n; i++ ) scanf("%d", &a[i]);
ArrayShift(a, n, m);
for ( i = 0; i < n; i++ ) {
if (i != 0) printf(" ");
printf("%d", a[i]);
}
printf("\n");
return 0;
}
int ArrayShift(int a[], int n, int m)
{ while (m--) {
int temp = a[n - 1];
for (int i = n - 1; i >= 1; i--)
a[i] = a[i - 1];
a[0] = temp; }
return a;}
答:思路:1.先控制数组元素的个数和表明移动的次数。
2.将控制的次数代入函数,在函数内部完成数组右移。
3.在函数内部,将移动次数设为while与for循环嵌套,每次for循环右移一次。
25.斐波那契数列
已知斐波那契数列定义:f(0) = 0; f(1) = 1; f(n) = f(n-1) + f(n-2); 那么你的任务是根据已知的n(n<30),求出f(n);
输入样例:
在这里给出一组输入。例如:
1
2
3
4
5
输出样例:
在这里给出相应的输出。例如:
1
1
2
3
5
代码:
#include<stdio.h>
int f(int x);
int main()
{
int a,b;
while(~scanf("%d",&a))
{
b=f(a);
printf("%d\n",b);
}
}
int f(int x)
{
int acc;
if(x>=2)
{
acc=f(x-1)+f(x-2);
}
if(x==0)
acc=0;
if(x==1)
acc=1;
return acc;
}
答:思路:利用递归函数讲n逐步分解为0和1在求和得解.