C Primer Plus(第6版)第十二章复习题答案

12.8复习题

  1. 哪些类别的变量可以成为它所在函数的局部变量?
    答:(我的答案)具有块作用域的变量,还有函数头中的形式参数。
    (标准答案)自动存储类别;寄存器存储类别;静态、无链接存储类别

  2. 哪些类别的变量可以在它所在的程序的运行期一直存在?
    答:(我的答案)具有静态存储期的变量。
    (标准答案)静态、无链接存储类别;静态、内部链接存储类别;静态、外部链接存储类别。

  3. 哪些类别的变量可以被多个文件使用?哪些类别的变量仅限于在一个文件中使用?
    答:(我的答案)具有外部链接的文件作用域的变量可以被多个文件使用,具有内部链接的文件作用域变量仅限于在一个文件中使用。
    (标准答案)静态、外部链接存储类别可以被多个文件使用;静态、内部链接存储类别。

  4. 块作用域变量具有什么链接属性?
    答:块作用域变量具有无链接属性。

  5. extern关键字有什么用途?
    extern用来引用式声明(referencing declaration),告诉编译器该变量的定义在程序的别处,该声明不会引起分配存储空间。
    对于函数来说,extern 关键字声明定义在其他文件中,使用extern让编译器在别处查找函数的定义式声明, 且除非使用static关键字,否则一般函数声明都默认为extern。

  6. 考虑下面两行代码,就输出的结果而言有何异同:
    同:两者都申请分配100个存储空间
    int * p1 = (int *)malloc(100 * sizeof(int));
    输出的是分配地址中的垃圾值(每个值竟然一样?)
    int *p1 = (int *)calloc(100, sizeof(int));
    异:calloc将数组中的每个元素都设置为0

  7. 下面的变量对哪些函数可见?程序是否有误?

/* file 1 */
int daisy;	//外部链接,文件作用域,静态变量, 自动初始化为0,对petal,stem,root可见
int main(void)
{
    int lily;		//自动存储期,只对main可见
    ...;
}
int petal()
{
    extern int daisy, lily;	//这里有错lily不能被extern修饰
    ...;
}
/* file 2 */
extern int daisy;		//定义在其它文件中的全局变量(文件作用域变量)
static int lily;		//内部链接的文件作用域变量()只对file2可见
int rose;//全局变量,对root可见,如果在mian中加入 extern int rose即可在main使用rose
int stem()
{
    int rose;		//自动存储期,块作用域, 覆盖了外部的rose
    ...;
}
void root()
{
    ...;
}
  1. 下面的程序会打印什么?
#include <stdio.h>
char color= 'B';
void first(void);
void second(void);
int main(void)
{
    extern char color;
    
    printf("color in main() is %c\n", color);		// B
    first();		// R
    printf("color in main() is %c\n", color);		// B
    second();		//G	second()中修改了全局变量color的值
    printf("color in main() is %c\n", color);		//G
    
    return 0;
}

void first(void)
{
    char color;
    color = 'R';
    printf("color in first() is %c\n", color);
}

void second(void)
{
    color = 'G';
    printf("color in second() is %c\n", color);
}

程序运行结果如图:
在这里插入图片描述

  1. 假设文件的开始处有如下声明:
    static int plink;
    int value_ct(const int arr[], int value, int n);
    a. 以上声明表明了程序员的什么意图
    答:plink具有静态存储期,该文件包含的函数都可以使用这个变量;const修饰arr表明不希望value_ct使用arr修改原始数组的值
    b. 用const int value 和 const int n 分别替换 int value 和 int n, 是否对主调函数的值加强保护。
    答:不会,因为 value和 n已经是原始数据的备份,所以该函数无法更改主调函数中的相应的值。这些声明是防止在ret_val中修改value 和 n 的值。例如,如果用const修饰n,就不能使用n++表达式。

猜你喜欢

转载自blog.csdn.net/weixin_42912350/article/details/83040877