C primer plus复习题答案下
C primer plus复习题答案下
第十二章 存储类别,链接和存储
-
哪些类别的变量可以成为它所在函数的局部变量?
自动存储类别;寄存器存储类别;静态、无链接存储类别
-
哪些类别的变量在它所在程序的运行期一直存在?
静态、无链接存储类别;静态、内部链接存储类别;静态、外部链接存储类别。
-
哪些类别的变量可以被多个文件使用?哪些类别的变量仅限于在一个 文件中使用?
静态、外部链接存储类别可以被多个文件使用;静态、内部链接存储类别。
-
块作用域变量具有什么链接属性?
无链接接
-
extern 关键字有什么用途?
extern用来引用式声明(referencing declaration),告诉编译器该变量的定义在程序的别处,该声明不会引起分配存储空间。 对于函数来说,extern 关键字声明定义在其他文件中,使用extern让编译器在别处查找函数的定义式声明, 且除非使用static关键字,否则一般函数声明都默认为extern。
-
考虑下面两行代码,就输出的结果而言有何异同:
int * p1 = (int *)malloc(100 * sizeof(int));
int * p1 = (int *)calloc(100, sizeof(int));
两者都分配了一个内容100个int类型的数组,第二行代码使用了calloc()把数组中的每个元素都设置为0
-
下面的变量对哪些函数可见?程序是否有误?
/* 文件 1 */ int daisy; int main(void) { int lily; ...; } int petal() { extern int daisy, lily; ...; }
/* 文 件 2 */ extern int daisy; static int lily; int rose; int stem() { int rose; ...; } void root() { ...; }
默认情况下,daisy只对main()可见,以extern声明的daisy才对petal()、stem()和root()可见。文件2中的extern int daisy;声明使得daisy对文件2中的所 有函数都可见。第1个lily是main()的局部变量。petal()函数中引用的lily是错误的,因为两个文件中都没有外部链接的lily。虽然文件2中有一个静态的lily,但是它只对文件2可见。第1个外部rose对root()函数可见,但是stem()中的局部rose覆盖了外部的rose。
-
下面程序会打印什么?
#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); first(); printf("color in main() is %c\n", color); second(); printf("color in main() is %c\n", color); 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); }
color in main() is B color in first() is R color in main() is B color in second() is G color in main() is G first()函数没有使用color变量,但是second()函数使用了。
- 假设文件的开始处有如下声明:
static int plink; int value_ct(const int arr[], int value, int n);
a. 以上声明表明了程序员的什么意图?
b. 用 const int value 和 const int n 分别替换 int value 和 int n,是否对主调 程序的值加强保护。
a.声明告诉我们,程序将使用一个变量plink,该文件包含的函数都可以使用这个变量。calu_ct()函数的第1个参数是指向一个整数的指针,并假定它指向内含n个元素的数组。这里关键是要理解该程序不允许使用指针arr修改原始数组中的值。 b.不会。value和n已经是原始数据的备份,所以该函数无法更改主调函数中相应的值。这些声明的作用是防止函数修改value和n的值。例如,如果用const限定n,就不能使用n++表达式。
-
第十三章 文件输入输出
- 下面的程序有什么问题?
int main(void)
{
int * fp;
int k;
fp = fopen("gelatin");
for (k = 0; k < 30; k++)
fputs(fp, "Nanette eats cgelatin.");
fclose("gelatin");
return 0;
}
根据文件定义,应包含#include <stdio.h>。应该把fp声明为文件指针:FILE *fp;。要给fopen()函数提供一种模式:fopen(“gelatin”,“w”),或者"a"模式。fputs()函数的参数顺序应该反过来。输出字符串应该有一个换行符,提高可读性。fclose()函数需要一个文件指针,而不是一个文件名:fclose(fp);。下面是修改后的版本:
#include <stdio.h>
int main(void)
{
FILE * fp;
int k;
fp = fopen("gelatin", "w");
for (k = 0; k < 30; k++)
fputs("Nanette eats gelatin.\n", fp);
fclose(fp);
return 0;
}
- 下面的程序完成什么任务?(假设在命令行环境中运行)
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main(int argc, char *argv [])
{
int ch;
FILE *fp;
if (argc < 2)
exit(EXIT_FAILURE);
if ((fp = fopen(argv[1], "r")) == NULL)
exit(EXIT_FAILURE);
while ((ch = getc(fp)) != EOF)
if (isdigit(ch))
putchar(ch);
fclose(fp);
return 0;
}
如果可以打开的话,会打开与命令行第1个参数名相同名称的文件,并在屏幕上显示文件中的每个数字字符。
- 假设程序中有下列语句:
#include<stdio.h>
FILE * fp1,* fp2;
char ch;
fp1 = fopen("terky", "r")<