第一题
1. 有以下说明语句:则下面引用形式错误的是()
struct Student { int num; double score; }; struct Student stu[3] = {{1001,80}, {1002,75}, {1003,91}} struct Student *p = stu;
A:p->num
B:(p++).num
C:(p++)->num
D:(*p).num
答案及解析 B
本题考查的是对结构体变量如何引用,如果是结构体定义的对象,用 ' -> ';如果是结构体的指针,就用 ' . ' ;
A:p是一个结构体指针,指向的是一个结构体数组的首元素,所以p->num,拿到的是首元素的num = 1001;
B:p++还是一个结构体指针,不可以用 ' . ';
C:正确,p++是后置++,返回的是++之前的值,所以取到的是首元素的num
D:解引用之后才是结构体的对象,使用 ' . '来访问,取到的是首元素的num = 1001
第二题
2. 以下程序运行的结果是()
#include <stdio.h> #define X 5 #define Y X+1 #define Z Y*X/2 int main() { int a = Y; printf("%d,%d", Z, --a); return 0; }
A:7,6
B:12,6
C:12,5
D:7,5
答案及解析 D
本题考查的是宏定义是替换,所以
--a = --Y = --X + 1 = 4 + 1 = 5;
Z = Y * X / 2 = X + 1 * X / 2 = 5 + 1 * 5 / 2 = 7;
所以
--a = 5;
Z = 7;
第三题
3. 不能把字符串"HELLO!"赋给数组b的语句是()
A:char b[10] = {'H','E','L','L','O','!','\0'};
B:char b[10]; b = "HELLO!";
C:char b[10]; strcpy(b,"HELLO!");
D:char b[10] = "HELLO!";
答案及解析 B
A CD都是正确的赋值;但是我们要知道b是数组名,数组名是首元素的地址,是一个常指针,不可以被改变,所以错误;b的数据类型为char * const ,可以改变数组的内容,但是不能改变数组的地址
第四题
4. 下面C程序的输出结果是()
unsigned fun(unsigned num) { unsigned k = 1; do { k *= num % 10; num /= 10; } while (num); return(k); } int main() { unsigned num = 26; printf("%d", fun(num)); return 0; }
A:12
B:无限循环
C:1
D:26
答案及解析 A
单独的unsigned指的是unsigned int类型;
无符号整数,永远是大于等于0;
第一次进入循环
k = 6 num = 2
第二次进入循环
k = 12 num = 0;
num = 0的时候结束循环,返回k = 12
第五题
5. 以下代码的输出结果是()
int main() { int n = 10; int const *p = &n; p++; printf("%d", *p); return 0; }
A:10
B:11
C:随机值
D:编译错误
答案及解析 C
int const *p = &n; const是在*的左侧,修饰的是p指向的内容不能被修改,所以p++之后,p指向的是n下面的地址处,这里存储的值是未知的,所以是随机值。