第一题
1. 下列for循环的循环体执行次数为()
for(int i = 10, j = 1; i = j = 0; ++i, --j)
A:0
B:1
C:无限
D:以上都不对
答案及解析 A
for循环的判断条件是 i = j = 0;赋值语句做判断条件,赋值表达式结果为右操作数的值,所以右操作数为0,整个结果就是0,0为假,非0为真,那执行次数就是0
第二题
2. 对于下面 char (*p)[16] 的声明描述正确的一项是()
A:p是长度为16的字符指针数组
B:p是包含16个字符的字符串
C:p是指向长度为16的字符数组的指针
D:p是长度为16的字符数组
答案及解析 C
首先*会先和p结合形成指针,指针的类型是char [16],是一个长度16的字符数组,所以这是一个指向长度为16的字符数组的指针。
第三题
3. 有以下程序,程序运行后的输出结果是()
void ss (char *s,char t) { while (*s) { if(*s == t) *s = t - 'a' + 'A'; s++; } } int main() { char str1[100] = "abcddfefdbd", c = 'd'; ss(str1, c); printf ("%s\n", str1); }
A:ABCDDEFEDBD
B:abcDDfefDbD
C:abcAAfefAbA
D:Abcddfefdbd
答案及解析 B
本题中ss函数的功能就是将字符串中的d都变成大写的,所以选B
第四题
4. 有以下语句定义,则选项中表达式错误的是()
int x = 5; const int *const p = &x; int *const q = &x; int const *next = &x; const int *j = &x;
A:*p = 1;
B:q++;
C:next++;
D:( *j )++;
答案及解析 ABD
const 在 * 左侧,指针指向的内容不可以修改;
const 在 * 右侧,指针本身不可修改
第五题
5. 有以下程序输出结果是( )
#include <stdio.h> int main() { int a[3][4] = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23}; int(*p)[4] = a, i, j, k = 0; for (i = 0; i < 3; i++) for (j = 0; j < 2; j++) k = k + *(*(p + i) + j); printf("%d", k); return 0; }
A:40
B:60
C:80
D:100
答案及解析 B
首先一个二维数组和一个数组指针如下图:
第一次循环:k = k + *(*(p + i) + j); i = 0;j = 0;k = 0
k = k + **p
p = a ,a 是二维数组名,代表的是第一行的地址,也就是&a[0]
p = &a[0],所以*p = *&a[0] = a[0]
a[0]是二维数组的行,代表的是每行的首元素地址,就是&a[0][0],
*p = &a[0][0];
**p = *&a[0][0] = a[0][0] = 1;
k = k + 1 = 1
第二次循环:k = k + *(*(p + i) + j);i = 0;j = 1;k = 1
k = k + *( *p + 1)
*p = &a[0][0]
k = k + *( &a[0][0] + 1) = k + *&a[0] [1] = k + a[0][1] = 4
k = 4
第三次循环:k = k + *(*(p + i) + j);i = 1;j = 0;k = 4;
k = k + *(*(p + 1) + 0) = k + *(*(p + 1)) = 12
第四次循环:k = k + *(*(p + i) + j);i = 1;j = 1;k = 13
k = k + *(*(p + 1) + 1) = 23
第五次循环:k = k + *(*(p + i) + j);i = 2;j = 0;k = 24
k = k + *(*(p + 2)) = 40
第六次循环:k = k + *(*(p + i) + j);i = 2;j = 1;k = 41
k = k + *(*(p + 2) + 1) = k + 19 = 60;