给出以下定义:
char acX[] = “abcdefg”;
char acY[] = {‘a’,’b’,’c’,’d’,’e’,’f’,’g’};
则正确的叙述为( )
A) 数组acX和数组acY等价 B) 数组acX和数组acY的长度相同
C) 数组acX的长度大于数组acY的长度 D) 数组acX的长度小于数组acY的长度
分析:
对于char acX[] = “abcdefg”; 其长度为7
对于char acY[] = {‘a’,’b’,’c’,’d’,’e’,’f’,’g’}; 由于无结束符‘\0’,所以编译器无法判断长度,其是随机值,但是长度大于或等于7,从做题角度来看,我们选择D。
CPU(32位小字节序处理器)
void example(char acHello[])
{
printf(“%d”,sizeof(acHello));
return;
}
void main()
{
char acHello[] = “hello,51_CC”;
example(acHello);
return;
}
的输出结果是( )
A) 4 B)12 C) 13 D)不确定
分析:
对于example(acHello); acHello本身为数组,但是现在作为函数的参数传递,退化为指针,处理器为32位,因此sizeof(acHello)值为4。
选A
设有如下定义:
unsigned long pulArray[] = {6,7,8,9,10};
unsigned long *pulPtr;
则下列程序段的输出结果为( )
pulPtr = pulArray;
*(pulPtr + 3) += 3;
printf(“%d ,%d\n”,*pulPtr, *(pulPtr + 3));
A) 9,12 B) 6,9 C) 6,12 D)6,10
分析:
*(pulPtr + 3) += 3;相当于*(pulPtr + 3) = *(pulPtr + 3) + 3; 相当于给数组第四个元素加4,9->12;
而指针指向不会发生变化,则*pulPtr相当于取数组第一个元素值,为6,
*(pulPtr + 3)相当于取数组第四个元素的值,为12.
选C
void example()
{
int i;
char acNew[20];
for(i = 0; i < 5; i++)
{
acNew[i] = ‘0’;
}
printf(“%d\n”,strlen(acNew));
return ;
}
的输出结果为( )
A) 0 B) 5 C) 6 D)不确定
分析:
数组acNew[20]; 未初始化,for循环给数组前五个元素赋了五个字符'0',但是没有结束符'\0',则其大小不确定。
注:若char acNew[20] = {0};该题答案会是多少呢?
这样相当于给数组初始化了,初始化都为0,赋值后,现在数组有结束符,可以判断大小了,为5.
本题选D
struct stu
{
int num;
char name[10];
int age;
};
void fun(struct stu *p)
{
printf(“%s\n”,(*p).name);
return;
}
void main()
{
struct stu students[3] = {{9801,”zhang”,20},
{9802,”wang”,19},
{9803,”zhao”,18}};
fun(students + 1);
return ;
}
的输出结果为( )
A) zhang B)zhao C) wang D)18
分析:
fun(students + 1);
students为结构体类型,students + 1 ,此处加1相当于加一个结构体大小,即参数传的是students[1]的地址,则(*p).name取的值为wang。
选C
在X86下,有下列程序
CPU(32位小字节序处理器)
#include<stdio.h>
void main()
{
union
{
short k;
char i[2];
}*s, a;
s = &a;
s->i[0] = 0x39;
s->i[1] = 0x38;
printf(“%x\n”,a.k);
}
输出结果是( )
A) 3839 B) 3938 C) 380039 D)不确定
分析:
处理器是小端存储模式,低地址存0x39,高地址存0x38,小端模式从高地址往低地址输出数据,而union共享存储空间,此时求a.k相当于取i[2]里面的数据,从高地址往低地址输出,则为3839.
选A
设有以下宏定义:
#define N 4
#define Y(n) ((N+2)*n) /*这种定义在编程规范中是严格禁止的*/
则执行语句:z = 2 * (N + Y(5+1));后,z的值为( )
A) 出错 B) 60 C) 48 D) 70
分析:
这种题,直接将宏代入即可,z = 2 * (N + Y(5+1))相当于z = 2*(4 + ((4+2)*5 + 1)))= 70
则选D
void main()
{
unsigned char a = 200;
unsigned char b = 100;
unsigned char c = 0;
c = a + b;
printf(“%d %d”, a+b,c);
}
程序的执行结果为( )
A) 300 300 B) 44 44 C) 300 44 D) 44 300
分析:
对于无符号char,其取值范围为0~255,a+b = 300,直接输出即可
而对于 c = a + b,a+b的值赋给c了,而c为无符号字符类型,最大上限为255,300-256 = 44.
则选C。
#include<stdio.h>
unsigned short *sum(unsigned char a, unsigned char b)
{
unsigned short s = 0;
s = a + b;
return &s;
}
int main()
{
unsigned short *p = NULL;
unsigned char a = 1, b = 2;
p = sum(a, b);
printf(“%u+%u”,a,b);
printf(“=%u\n”,*p);
return 0;
}
程序的执行结果为( )
A)1+2=0 B) 1+2=3 C) 1+2=NULL D)不确定
分析:
这道题考点是局部变量,p = sum(a, b); 对于函数sum,传给函数两个值,函数内部将两值相加,再返回s的地址,但是由于s为局部变量,当sum函数调用结束后,s的内存空间会被回收,则*p的值不确定。
选D。