C primer plus复习题答案(下)

本文详细介绍了C Primer Plus中关于存储类别、链接、文件输入输出、结构体和其他数据形式、位操作等核心概念。包括局部变量、静态存储、文件操作、结构体定义、位运算符的应用等内容,并提供了相关代码示例和问题解析,帮助读者深入理解C语言编程中的关键知识点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C primer plus复习题答案下

第十二章 存储类别,链接和存储

  1. 哪些类别的变量可以成为它所在函数的局部变量?

    自动存储类别;寄存器存储类别;静态、无链接存储类别
    
  2. 哪些类别的变量在它所在程序的运行期一直存在?

    静态、无链接存储类别;静态、内部链接存储类别;静态、外部链接存储类别。
    
  3. 哪些类别的变量可以被多个文件使用?哪些类别的变量仅限于在一个 文件中使用?

    静态、外部链接存储类别可以被多个文件使用;静态、内部链接存储类别。
    
  4. 块作用域变量具有什么链接属性?

    无链接接
    
  5. extern 关键字有什么用途?

    extern用来引用式声明(referencing declaration),告诉编译器该变量的定义在程序的别处,该声明不会引起分配存储空间。
    对于函数来说,extern 关键字声明定义在其他文件中,使用extern让编译器在别处查找函数的定义式声明, 且除非使用static关键字,否则一般函数声明都默认为extern。
    
  6. 考虑下面两行代码,就输出的结果而言有何异同:

int * p1 = (int *)malloc(100 * sizeof(int)); 

int * p1 = (int *)calloc(100, sizeof(int)); 
两者都分配了一个内容100个int类型的数组,第二行代码使用了calloc()把数组中的每个元素都设置为0
  1. 下面的变量对哪些函数可见?程序是否有误?

     /* 文件 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。
    
    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); 
          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()函数使用了。
      
      1. 假设文件的开始处有如下声明:
       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++表达式。
      

第十三章 文件输入输出

  1. 下面的程序有什么问题?
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;
}
  1. 下面的程序完成什么任务?(假设在命令行环境中运行)
#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个参数名相同名称的文件,并在屏幕上显示文件中的每个数字字符。

  1. 假设程序中有下列语句:
#include<stdio.h>
FILE  * fp1,* fp2; 
char ch; 
fp1 =  fopen("terky", "r")<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不好,商鞅要跑

谢谢咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值