1、给出以下定义:
char acX[] = “abcdefg”;
char acY[] = {‘a’,’b’,’c’,’d’,’e’,’f’,’g’};
则正确的叙述为( C )
A) 数组acX和数组acY等价 B) 数组acX和数组acY的长度相同
C) 数组acX的长度大于数组acY的长度 D) 数组acX的长度小于数组acY的长度
答案解析: acX多一个‘\0’
void example(char acHello[])
{
printf(“%d”,sizeof(acHello));
return;
}
void main()
{
char acHello[] = “hello,Bit”;
example(acHello);
return;
}
的输出结果是( A )
A) 4 B)12 C) 13 D)不确定
答案解析: 数组名传参,传的是首元数的地址,实际上形参也是一个地址,故sizeof(地址)=4
3、以下叙述中不正确的是( D )
A) 在不同的函数中可以使用相同名字的变量
B) 函数中的形式参数是在栈中保存
C) 在一个函数内定义的变量只在本函数范围内有效
D) 在一个函数内复合语句中定义的变量在本函数范围内有效(复合语句指函数中的成对括号构成的代码)
答案解析:
4、设有如下定义:
unsigned long pulArray[] = {6,7,8,9,10};
unsigned long *pulPtr;
则下列程序段的输出结果为( C )
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)=*(pulPtr+3)+3 意思是解引用拿到下标为3的数字9然后+3放在
下标为3的位置下 故 *(pulPtr + 3)=12; 而此时指针pulPtr仍旧指向首元素地址。就像a+3,a
的值是不变的。
5、void example()
{
int i;
char acNew[20];
for(i = 0; i < 5; i++)
{
acNew[i] = ‘0’;
}
printf(“%d\n”,strlen(acNew));
return ;
}
的输出结果为( D )
A) 0 B) 5 C) 6 D)不确定
数组未初始化,里面放的全是随机值,而字符0和\0是不同的。
6、全局变量可以定义在被多个 .C 文件包含着的头文件中( B )
A) 正确 B)错误
会出现重定义
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 ;
}
的输出结果为( C )
A) zhang B)zhao C) wang D)18
数组名其实是首元素的地址,只要两种特殊情况1 sizeof(数组名)求的是所有元素的字节大小
2&数组名,取出的整个数组的地址。 所以当数组名students+1传参传的是数组中第二个元素。
#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 )
A) 3839 B) 3938 C) 380039 D)不确定
答案解析,电脑一般是小端模式,低位存放在低地址
9、下列定义正确的有(多选):( ABF )
A: char *pcPtr = “abcd”;
B: char pc[] = “abcd”;
C: char pc[4] = “abcd”;
D: char pc[] = ‘abcd’;
E: char pc[] = ‘a’’b’’c’’d’;
F: char pc[] = {‘a’,’b’,’c’,’d’,’\0’};
这题属实没啥好说的==
10、设有以下宏定义:
#define N 4
#define Y(n) ((N+2)*n) /*这种定义在编程规范中是严格禁止的*/
则执行语句:z = 2 * (N + Y(5+1));后,z的值为( D )
A) 80 B) 60 C) 48 D) 70
涉及到宏定义展开: 5+1直接带入,不是6代入
z=2*(4+(4+2)*5+1) 则结果为70
#define BUF_LEN 2048
struct AAA
{
unsigned long ulLen; //
char buf[BUF_LEN];
};
函数PrintBufLen的作用是打印出结构体中buf的实际占用长度,有下面两种实现方法:
方法一:
void PrintBufLen(struct AAA *pBuf)
{
if(NULL == pBuf)
{
printf(“Error,pBuf is NULL.\n”);
return;
}
printf(“len = %u\n”,pBuf->ulLen);
return;
}
方法二:
void PrintBufLen(struct AAA Buf)
{
printf(“len = %u \n”,Buf.ulLen);
return;
}
以下说法只有一个正确的是( A )
A: 优选方法一,原因是以指针作为入参,减少函数参数压栈的系统开销
B: 优选方法二,原因是可以不做入参合法性判断,不容易出错
C: 两种方法一样,可以任选一种
D: 以上说法都不对
答案解析:传址,不用开辟额外的空间,
12、void main()
{
unsigned char a = 200;
unsigned char b = 100;
unsigned char c = 0;
c = a + b;
printf(“%d %d”, a+b,c);
}
程序的执行结果为( C )
A) 300 300 B) 44 44 C) 300 44 D) 44 300
答案解析: 无符号char的取值范围是0---255;放在c里面溢出了255
具体的计算要涉及的原码,反码,补码,如果想了解,可以问我,我会回答的。
#define MAX_SIZE A+B
struct _Record_Struct
{
unsigned char Env_Alarm_ID : 4;
unsigned char Para1 : 2;
unsigned char state;
unsigned char avail : 1;
}*Env_Alarm_Record;
struct _Record_Struct *pointer = (struct _Record_Struct*)malloc
(sizeof(struct _Record_Struct) * MAX_SIZE);
当A=2, B=3时,pointer分配( D )个字节的空间。
A) 20 B) 15 C) 11 D) 9
答案解析 位段是3个字节大小,然后又是宏定义展开,上面说过