第一题
1、下列程序的输出是( )
#include<stdio.h> int main() { int a[12]= {1,2,3,4,5,6,7,8,9,10,11,12}; int *p[4]; int i; for(i=0;i<4;i++) { p[i]=&a[i*3]; } printf("%d\n",p[3][2]); return 0; }
A: 上述程序有错误
B: 6
C: 8
D: 12
答案及解析 D
p是一个指针数组,p[i] = &a[i*3]相当于是把数组a每3个一组分开并把每组的首地址存在p数组,此时p类似一个4行3列的二维数组,p[3][2]就是4行第3个元素12,下面是图解:
第二题
2、二维数组X按行顺序存储,其中每个元素占1个存储单元。若 X[4][4] 的存储地址为 Oxf8b82140 , X[9][9] 的存储地址为 Oxf8b8221c ,则 X[7][7] 的存储地址为( )
A: Oxf8b821c4
B: Oxf8b821a6
C: Oxf8b82198
D: Oxf8b821c0
答案及解析 A
我们首先没办法确定这个二维数组的行就是9,列就是9,所以我们要假设每行有n个元素。
所以在X[9][9]和X[4][4]之间,一共有4n+(n-4)+9个元素;一个元素是一个存储单元,那他们的地址总共差了也是4n+(n-4)+9个;
所以21c - 140 = 4n + (n - 4) + 9;
解得 n = 43;
设x[7][7]的地址是z
所以x[7][7]和x[9][9]地址的距离为:
21c - z = 43 + 9 + 43 - 7;
解得 z = 1c4
第三题
3、以下哪个选项可以正确描述 sizeof(double) ( )
A: 一个整型表达式
B: 一个双精度型表达式
C: 一个不合法的表达式
D: 一种函数调用
答案及解析 A
sizeof是C语言中的一个操作符,不是函数调用,简单的说其作用就是返回一个对象或者类型所占的内存字节数,结果是无符号整数,因此可以把它看作是整型表达式。所以选择A
第四题
4、下列代码运行后的结果是什么( )
int main() { char a = 'a'; char b; printf("%c,", ++a); printf("%c\n", b = a++); return 0; }
A: b,b
B: b,c
C: a,b
D: a,c
答案及解析 A
前置++,保留的是++后的值
后置++,保留的是当前值
第五题
5、以下逗号表达式的值为( )
(x = 4 * 5 , x * 5) , x + 5;
A: 25
B: 20
C: 100
D: 45
答案及解析 A
逗号表达式是从前到后依次计算子表达式,而其结果是最后一项的值,此题去掉括号后的表达式,和原表达式是等价的,先计算4*5并赋值给x,x变为20,中间x*5并没有改变x的值,最后一项x+5值是25,也就是整个表达式的值