选择题
2-5 定义带参数的宏“#define JH(a,b,t) t = a; a = b; b = t”,对两个参数a、b的值进行交换,下列表述中正确的是()。
- A. 不定义参数a和b将导致编译错误
- B. 不定义参数a、b、t将导致编译错误
解析:编译器不会检查宏参有没有定义,因此无论是否定义a、b、t都不导致编译错误。 - C. 不定义参数t将导致运行错误
解析:无论是否定义a、b、t都不导致编译错误。但是,不定义参数t将导致运行错误,因为交换两个数值需要一个变量来过度 - D. 不需要定义参数a、b、t类型
- 解析:宏里的参数不是变量,只是简单的替换,不需要定义类型。但是宏参只是达到替换的作用,不能定义它的类型,如果不定义,虽然不会导致编译错误,但是会出现运行错误。
2-7 下面说法中正确的()
- A. 若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度
解析:变量分为全局变量和局部变量。局部变量和形参的作用域是函数内部,全局变量的作用域是整个文件。但可以通过声明一个extern的全局变量拓展全局变量的作用域,也可以通过定义一个static的全局变量限制这种拓展。 - B. 若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度
解析:如果全局变量仅仅由单个函数访问,不存在耦合度的问题 - C. 设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑变量生命周期问题
解析:动态全局变量、静态全局变量、静态局部变量的生命周期都为程序运行期间,其中静态局部变量的生存周期虽然为整个源程序,但是其作用域仍然与局部变量相同,当退出函数是,该变量还存在,但是不能使用。 - D. 静态全局变量使用过多,可那会导致动态存储区(堆栈)溢出
解析:局变量和静态变量都是存储在静态存储区,所以在递归调用是不会压栈,也不会造成堆栈溢出。
函数题
6-1 数组指针与二维数组的关系
利用数组指针p将main函数中输入的二维数组a的所有元素输出, 要求先按行的顺序输出,然后再以列的顺序输出, 其中输出整型格式用 “%3d”, (测试用数据大小不要超过2位数)。
参考代码:
void reOut(int (*p)[3]) {
int i, j;
for (i = 0; i < 2; i++) {
for (j = 0; j < 3; j++)
printf("%3d", p[i][j]);
printf("\n");
}
for (i = 0; i < 3; i++) {
for (j = 0; j < 2; j++)
printf("%3d", p[j][i]);
printf("\n");
}
}
6-2 利用函数指针实现递增或递减排序
本题要求实现一个函数,根据主程序运行提示完成一组整数的递增或递减排序。
参考代码:
static void sortAorD(int *array, int n, int (*compare)(int a, int b)) {
int i, j, t;
for (j = 0; j < n-1; j++) {
for (i = 0; i < n-1-j; i++) {
if ((*compare)(array[i],array[i+1])) {
t = array[i];
array[i] = array[i+1];
array[i+1] = t;
}
}
}
}