1、下面函数的功能是( )
1
2
3
4
5
6
int
sss(
char
s[],
char
t[])
{
int
i = 0;
while
(s[i] && t[i] && (t[i] == s[i])) i++;
return
(s[i] - t[i]);
}
A、求字符串的长度
B、比较两个字符串的大小
C、将字符串s复制到字符串t中
D、将字符串s接续到字符串t中
答案:B
解析:本题定义函数中传入两个指针,根据形式应该分别指向两个字符串。定义循环变量后,while循环中前两个条件的含义是遍历这两个字符串到'\0'位置结束,第三个条件是判断两字符串的对应位置是否是相同字符。循环结束后要么两个字符串相等,要么两个字符串不等,此时返回两字符串结束位置字符的ASCII码差。所以函数功能是比较两个字符串的大小,选择选项B。
2、 下列选项,不正确的是
A、for(int a=1;a<=10;a++);
B、int a=1; do { a++; }while(a<=10)
C、int a=1; while(a<=10) { a++; }
D、for(int a=1;a<=10;a++)a++;
答案:B
解析:本题考查的是基本语法,do while语句末尾需要加分号,int a=1; do { a++; }while(a<=10);(√),所以选择选项B。
3、
1
2
3
4
unsigned
char
*p1;
unsigned
long
*p2;
p1 = (unsigned
char
*)
0x801000
;
p2 = (unsigned
long
*)
0x810000
;
请问p1+5= 什么?p2+5= 什么?
A、801005 810005
B、801005 810020
C、801005 810014
D、801010 810014
答案:C
解析:本题考查的是指针的偏移,指针偏移是以其指向的类型大小为单位的。例如:int * p,指针p指向的类型为int,所以执行 p+n,指针p会移动 n*sizeof(int)大小的空间。在本题中,p1指针指向的是unsigned char,+5移动5*sizeof(unsigned char)大小的空间,p2指针的移动同理。本题还需注意将移动的大小转为16进制,sizeof(unsigned long)一般为4字节,所以本题选择选项C。
4、 在16位C编译系统上,以下程序的输出结果是().
1
2
3
4
5
void
main()
{
int
y=2456;
printf
(
"y=│%3o│ y=│%8o│y=│%#8o│ y=│%08o│"
,y,y,y,y);
}
A、y=│2456│ y=│□□□□2456│ y=│□□□02456│ y=│00002456│
B、y=│4630│ y=│□□□□4630│ y=│□□□04630│ y=│00004630│
C、y=│2456│ y=│□□□□2456│ y=│###02456│ y=│00002456│
D、y=│4630│ y=│4630□□□□│ y=│###04630│ y=│00004630│
答案:B
解析:代码中首先定义了一个int型变量并赋值为2456,这个数据是十进制数据。下面的输出都是以八进制输出的,将2456转换为八进制为4630,排除选项A、C。%3o限制域宽为3,数据实际长度为4,所以会原样输出数据。%8o限制域宽为8,会自动补空格,对其方式为右对齐。%#8o在%8o的基础上会显示进制输出。%08o相较于%8o的不同是前面自动补0。综上,选择选项B。
5、 定义符号常量pi。const float pi= 3.1415926f; 这句话是否正确
A、正确
B、错误
答案:A
解析:常量在定义初始化时可以进行赋值操作,并且这句代码符合语法规则,选择选项A。
6、 在x86的机器上执行:
1
2
int
a = 0xabcd1234;
char
b = ((
char
*)&a)[0];
请问b是多少
A、0xa
B、0x4
C、0xab
D、0x34
答案:D
解析:阅读题目后,通过x86机器这一信息可以得到:存储方式为小端存储,即低位存在低地址,高位存在高地址。char * 得到a地址中一个字节的大小的空间,由于是小端存储,则这段空间中存的是0x34,由于[0]与*可以互换,所以[0]将数据0x34取出赋值给b,b的值为0x34,选择选项D。
7、
1
2
unsigned
int
a = 0x1234;
unsigned
char
b = *(unsigned
char
*)&a;
在 32 位大端模式处理器上变量 b 等于()
A、0x00
B、0x12
C、0x34
D、0x1234
答案:A
解析:32位处理器上,unsigned int 占4个字节,变量a=0x1234即0x0000 1234。下面定义了一个指向unsigned char空间大小的指针,由于是大端存储,故指向地址中的内容为0x00,所以解引用后赋给变量b的值为0x00,选择选项A。
8、 代码段
1
2
3
4
5
6
7
8
#include <stdio.h>
int
main() {
int
i = 1;
sizeof
(i++);
printf
(
"%d\n"
, i);
return
0;
}
的输出为()
A、1
B、4
C、2
D、8
答案:A
解析:sizeof内的运算没有意义,不会执行。计算机会在编译时将sizeof(i++)翻译成sizeof(i++的数据类型),所以本题i最后的值为1,选择选项A。
9、 在32位小端的机器上,如下代码输出是什么:
1
2
3
4
5
char
array[
12
] = {
0x01
,
0x02
,
0x03
,
0x04
,
0x05
,
0x06
,
0x07
,
0x08
};
short
*pshort = (
short
*)array;
int
*pint = (
int
*)array;
int64 *pint64 = (int64 *)array;
printf(
"0x%x , 0x%x , 0x%llx , 0x%llx"
, *pshort , *(pshort+
2
) , *pint64 , *(pint+
2
));
A、0x201 , 0x403 , 0x807060504030201 , 0x0
B、0x201 , 0x605 , 0x807060504030201 , 0x0
C、0x201 , 0x605 , 0x4030201 , 0x8070605
D、0x102 , 0x506 , 0x102030405060708 , 0x0
答案:B
解析:由于采用小端存储,所以低位存放低地址,高位存放高地址。所以将数组元素按从高位到低位可以写成0x0807060504030201,指针pshort指向的类型是short类型,占两个字节,所以第一个输出应该是0x201。*(pshort+2)是pshort指针向高地址移动两个short类型占的空间,所以现在指向的0506所在的地址,第二个输出为0x605。*pint64所指向的类型是int64,占八个字节,又因为它指向的是数组首地址,故第三个输出为0x807060504030201。
*(pint+2)中,指针pint指向的类型是int,占四个字节,移动前指向数组首地址,移动后正好越过了已经赋值的数组区域,因为数组是部分初始化,没有赋值的区域会自动赋0,所以第四个输出为0x0。综上,选择选项B。
10、 不能把字符串"HELLO!"赋给数组b的语句是()
A、char b[10] = {'H','E','L','L','O','!','\0'};
B、char b[10];b = "HELLO!";
C、char b[10];strcpy(b,"HELLO!");
D、char b[10] = "HELLO!";
答案:B
解析:数组名是一个常量,不能被赋值。故选择选项B。