1、对于代码段
1
2
3
float
x = 2.5, y = 4.7;
int
a = 7;
printf
(
"%.1f"
, x+a%3*(
int
)(x+y)%2/4);
的结果为()
A、2.5
B、2.8
C、3.5
D、3.8
答案:A
解析:本题考查的是运算符的优先级问题。在表达式 x+a%3*(int)(x+y)%2/4 中,()的优先级最高,所以先计算 x+y 并进行强制转换,代入值后原式化为:2.5+7%3*7%2/4,这个式子中%、*、/是同级的都大于+,结合性从左到右,所以原式化为:2.5+0(后面最后进行的是两个整数相除,不足1直接舍掉了),所以最后结果为2.5,选择选项A。
2、 以下说法错误的是:
A、指针和引用做为函数参数都可以改变实参
B、指针和引用都可以在定义后任意的改变指向
C、引用必须在创建的时候初始化,而指针则不需要
D、不能空引用,但是可以有空指针
答案:B
解析:引用一旦成为某个变量的别名后,不可以改变指向,故选择选项B。
3、在 C 语言中,引用数组元素时,其数组下标的数据类型允许是( )。
A、整型常量
B、整型表达式
C、整型变量
D、任何类型的表达式
答案:ABC
解析:仔细读题,区别是定义数组还是引用数组元素。定义数组是不可以用变量,引用数组时,整型常量(a[1]、a[2]......)、整型表达式(a[i+1]、a[i+2])、整型变量(常用循环赋值中,如a[i])均可。
4、C语言中浮点类型数据包括哪些部分()
A、符号位
B、指数位
C、尾数部分
D、整数
E、小数
答案:ABC
解析:本题考查的是浮点数在计算机内部的存储方式,浮点类型数据在计算机内部通常采用IEEE 754标准来表示,根据标准,浮点类型数据包括:符号位、指数位、尾数部分。选择选项ABC。
6、有定义语句int *ptr [4];,下面等价的定义语句是
A、int ** ptr;
B、int( * ptr) [4];
C、int ptr[4];
D、int * (ptr [4]);
答案:D
解析:首先看题目中的定义语句,定义的是一个指针数组,数组中有四个指针。选项A定义的是一个二级指针。选项B定义的是一个数组指针,也叫行指针。选项C定义的是一个普通的一维整型数组。前三个选项都不符合要求,下面来看选项D,由于[ ]的优先级高于*,无论加不加(),ptr都先与[ ]结合。所以D选项的()可以直接去掉,变成与题目中相同的形式,选择选项D。
7、声明一个指向含有10个元素的数组的指针,其中每个元素是一个函数指针,该函数的返回值是int,参数是int*,正确的是()
A、(int *p[10])(int*)
B、int [10]*p(int *)
C、int (*(*p)[10])(int *)
D、int ((int *)[10])*p
E、以上选项都不正确
答案:C
解析:从题目出发开始分析,首先有一个数组指针,假设为int (*p)[10]。然后有一个函数指针数组,假设为int(*s[10])(int *)。因为这个数组指针指向了这个函数指针数组,并且函数指针数组是一个一维数组,有p = &s,即*p = s。下面我将函数指针数组式子进行替换,变成
int(*(*p)[10])(int *)。下面我们从结果来检验一下符不符合题目条件,对于我们得到的式子,根据优先级判断如何结合。首先()的优先级最高,我们先看最里面的(),*和p先结合表明是一个指针。然后(*p)与[10]结合,表示为一个数组指针。然后整体与*结合降级,表示指向的数组是一个一维数组。最后外面加上返回值类型和参数类型,表示这个指向的一维数组是一个函数指针数组。综上,选择选项C。
8、 有如下程序段:
1
2
3
4
5
6
7
#include <stdio.h>
int
main() {
char
ch = -1;
printf
(
" %02x, %02x"
, ch, (unsigned
char
)ch);
return
0;
}
则输出:
A、-1,-1
B、ff,ff
C、ffffffff,ff
D、ff,ffffffff
答案:C
解析:首先,负数在计算机中要以补码的形式表示,-1的补码为11111111,并利用(unsigned char)将其中一个11111111转换为无符号数。接下来看前面的格式控制符%02x,表示以十六进制输出,至少输出两位,不足的用0补。并且%x默认输出unsigned int,所以会对原来的类型进行扩展,从八位扩展到三十二位。对于这个扩展,无符号数以0在前面填充,有符号数会以符号位在前面填充。所以打印出来应该是ffffffff,ff,选择选项C。
9、 下面程序段的运行结果是()
1
2
3
char
s[]=
"abcdefgh"
,*p =s;
p += 3;
printf(
"%d\n"
, strlen(strcpy(p,
"ABCD"
)));
A、8
B、12
C、4
D、7
答案:C
解析:首先定义了一个字符串,指针p指向字符串的首地址,然后指针进行偏移。偏移后对于字符串"abcdefgh",指针p指向字母d。先进行的是strcpy,拷贝结束后字符串为"abcABCD",但是返回的字符串为"ABCD",因为它返回的是第一个字符串的首地址,这个地址现在是p指针指向的位置,所以计算有效长度为4,选择选项C。
10、 运行以下C语言代码,输出的结果是()
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
int
main()
{
char
*str[3] ={
"stra"
,
"strb"
,
"strc"
};
char
*p =str[0];
int
i = 0;
while
(i < 3)
{
printf
(
"%s "
,p++);
i++;
}
return
0;
}
A、stra strb strc
B、s t r
C、stra tra ra
D、s s s
答案:C
解析:注意区分 char * p = str[0] 和 char * p = str 的区别,前者将数组中第一个指针赋给指针p,所以指针p指向的是字符串"stra"的首地址,进行移动是一个字符一个字符的移动,所以选择选项C。后者是将数组名(即&str[0])赋给了指针p,指针p指向的是数组中的第一个指针,如果进行p++,那么指针p就会指向数组中下一个指针,此时进行解引用再以%s进行输出,将会输出下一个字符串。