第一题
已知int a[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }, *p = a;,不能表示数组a中元素的式子是()
A---*a
B---*p
C---a
D---a[p-a]
正确答案:C
解析:A和B选项,*a和*p都是数组的首元素地址;C选项中,a就是一个指向数组首元素地址的指针,a表示的是一个地址而不是数组的元素;D选项中,因为p-a=0,所以a[p-a]=a[0]。
第二题
C语言编译程序的首要工作是()
A---检查C程序的语法错误
B---检查C程序的逻辑错误
C---检查程序的完整性
D---生成目标文件
正确答案:A
解析:C语言编译程序的首要工作就是检查C语言程序中是否存在语法错误,如果
有则给出错误的提示信息,如果没有则生成的目标文件(.obj)。编译程序对程序中的逻辑
错误和程序的完整性是不检查的。所以选择A。
第三题
以下程序的运行结果是()
#define MIN(x,y) (x)<(y) ? (x):(y)
int main()
{
int i = 10, j = 15, k;
k = 10*MIN(i, j);
printf ("%d\n", k);
}
A---10
B---15
C---100
D---150
正确答案:B
解析:语句k=10*MIN(i,j);在预编译时将进行宏替换为k=10*(i)<(j) ? (i) : (j);。
因i=10,j=15,所以语句等价于k=10*10<15 ? 10:15;,10*10比15大,因此k的值
将是15。故正确答案是B。
第四题
若有代码段
int *p = (int *)malloc(sizeof(int));
则向内存申请到的内存空间中存入整数123的语句为()
A---scanf("%d",p);
B---scanf("%d",&p);
C---scanf("%d",*p);
D---scanf("%d",**p);
正确答案:A
解析:A选项中,p 是 int 的指针类型,scanf 要求 %d 相应参数也是 int 的指针类型,所以直接
scanf("%d",p);即可。B 选项中, &p 又取了一次 p 的地址,相当于指针的指针, scanf 尝试写入原本是指针的地址,导致 p 的值被改变(本应写入 p 指向的内存),后续解引用 *p 可能导致访问非法内存 产生运行时读内存错误。C 选项中, *p 解引用取值,是一个未初始化的乱值, scanf 会把该值当作地址,可能导致运行时写内存错误或写入不被期望的内存区域。D选项中, p 只是一次指针, **p 会编译错误。
第五题
在32位编译器上,设有定义
char *str1 = "Hello", str2[] = "Hello";
则以下语句
printf("%d %d", sizeof(str1), sizeof(str2));
的输出结果是()
A---5 6
B---5 5
C---6 6
D---4 6
正确答案:D
解析:str1表示一个char类型的指针, 指向只读区中"hello"位置。 所以sizeof(str1)仅表示指针的大小。32位系统指针大小为4B,64位系统指针大小为8B。而sizeof(str2)是整个数组大小,包括最后的'\0'。
第六题
设有定义语句
int x[6] = {2, 4, 6, 8, 5, 7}, *p = x, i;
要求依次输出x数组6个元素中的值,不能完成此操作的语句是()
A---for(i=0;i<6;i++)
printf("%2d",*(p++));
B---for(i=0;i<6;i++)
printf("%2d",*(p+i));
C---for(i=0;i<6;i++)
printf("%2d",*p++);
D---for(i=0;i<6;i++)
printf("%2d",(*p)++);
正确答案:D
解析:A选项和C选项,*(p++)和*p++都是指针移动取值。而D选项中,(*p)++为元素取值,输出结果为2、3、4、5、6、7 。所以选B。
第七题
为了提高程序的运行速度,在函数中对于整型或指针可以使用()型的变量。
A---auto
B---register
C---static
D---extern
正确答案:B
解析:
auto 自动变量类型,自动进行 推演
register 建议编译器将该变量放入cpu的寄存器中,(寄存器比内存速度读取更快)
static 静态变量
extern 声明变量,常用于多文件需要使用同一变量时
一般情况下,变量的值是存放在内存中的。如果有一些变量使用频繁(例如进行100000次的循环),则为存取变量的值要花费不少时间。为提高执行效率,允许将局部变量的值存放在CPU的寄存器中,需要时直接从寄存器取出参与运算,不必再到内存中去存取。由于对寄存器的存取速度远远的高于对内存的存取速度,因此这样做可以提高执行效率。
第八题
有以下定义语句 double a,b; int w; long c;
若各变量已正确赋值,则下列选项中正确的表达式是()
A---a=a+b=b++
B---w%(int)(a+b)
C---(c+w)%(int)a
D---w=a==b;
正确答案:BC
解析:A选项中,a+b是右值表达式,所以无法对其赋值。D选项,因为有;所以这不是表达式而是一条语句。如果是一条表达式,则先进行==的计算,判断a与b的值是否相等,相等返回1,不然将判断后的返回值赋值给w。
每一天都是一个新的机会,把握好,就会有新的希望。