Skip to content

Latest commit

 

History

History
123 lines (111 loc) · 6.5 KB

File metadata and controls

123 lines (111 loc) · 6.5 KB

复习题2.9

  1. 给出下面术语的定义:指针、数组、记录

    • 指针:存储内存地址的变量
    • 数组:数组是单类数据的集合
    • 记录:具有不同类型数据的集合
  2. 怎样定义一个枚举类型,类型名是polygonT,包含元素Triangle、Square、Pentagon、Hexagon和Octagon?怎样改动这个定义,使得每个图形都对应它们相应的边数?

    typedef enum
    {
        Triangle = 3,
        Square,
        Pentagon,
        Hexagon,
        Octagon = 8
    } polygonT;
  3. 定义枚举类型可以实现和用#define一样的作用,本文列出了3种使用枚举类型的好处,这些优点是什么?

    • 程序员不用显示地指定内部编码;
    • 同类型不同名称可以使得程序易读,因为声明变量时可以使用更有意义地类型名称替代简单的int等;
    • 在很多系统中,使用枚举类型的程序更易调试,因为枚举变量由编译器处理,可以调试。
  4. 正误判断:在C语言中,可以将在整数上定义的任何运算应用于任何标量类型的值

    • 正确
  5. 下面的程序很像本章2.1.2小节“标量类型”中定义的RightFrom函数,但是RightFrom函数可以正常地工作,而这个程序有一些小问题。确认问题出在何处,重写该函数,以便它能正确的计算dir偏左90°的罗盘方向。

    directionT LeftFrom(directionT dir)
    {
        return ((dir - 1) % 4);
    }
    • 修改
    directionT LeftFrom(directionT dir)
    {
        return ((dir - 1 + 4) % 4);
    }
  6. 用自己的语言,解释如何使用关键字typedef

    • typedef重命名已有的数据为一个类型名,typedef typename newtypename;
  7. 给出下面术语的定义:位、字节、字、地址

    • 位:计算机的最小单元存储,能记录一个0或1;
    • 字节:现代计算机中一般用8位表示一个字节,它可以表示一个字符类型;
    • 字:字的大小不固定,但它一定能表示该计算机上一个int类型的数据,有些计算机用双字节 int = 16bit,有些计算机用四字节 int = 32bit;
    • 地址:每一个字节的在内存中的位置的标识编码。
  8. 正误判断:在C语言中,int型通常占用4个字节空间

    • 错:根据机器和编译器决定,32位机器下一般是4个字节。
  9. 正误判断:在C语言中,char型变量通常占用1个字节

    • 对:C语言标准中的确规定了char的内存占用为1字节
  10. 运算符sizeof的作用是什么?怎样使用它?

    • sizeof运算符用来查看一个变量或类型占用多大的内存空间,它只有一个操作数,操作数为类型名或变量或表达式,如果是类型名和变量,sizeof返回类型或变量所占内存数,如果是表达式,sizeof返回该表达式的值所占的字节数。
    • 注意:sizeof在编译时就计算大小,运行时sizeof运算符的位置将被常量替代。
  11. 本章指出使用指针的4个原因是什么?

    • 指针可以以一种简洁的方式访问一个大的数据结构;
    • 指针可以使程序不同部分间的数据共享更方便;
    • 指针可以在程序执行时留出内存空间;
    • 指针可以记录各数据项之间的关系。
  12. 什么是左值?

    • 任何引用能存储数据的内存的表达式被称为左值。
  13. 下列声明生成的变量类型是什么?int *p1, p2;

    • p1是指向int型的指针变量,p2是int型变量
  14. 如何声明一个指向布尔类型的名为pFag的变量?

    • bool* pFag;
  15. 指针的两个基本运算是什么?哪一个是取值运算?

    • &,取址运算;*,取值运算
  16. 解释一下指针赋值与普通赋值之间的差别?

    • 指针赋值需要先使用取值运算得到内存,然后再赋值;
    • 普通赋值直接运用变量名赋值。
  17. 略。

  18. 常量NULL的内部表示是什么?

    • 是地址值0,NULL再stdlib.h中定义
  19. 引用调用是什么意思?

    • 引用调用是指再函数参数中传递指针,使得这个函数可以访问实际参数。
  20. 为下列数组变量写出数组声明

    • 数组realArray包括100个浮点型元素: float realArray[100];
    • 数组inUse包括16个布尔型元素: bool inUse[16];
    • 数组lines可以容下1000个字符串: string lines[1000];
  21. 写出用于创建和初始化下列整数数组的变量声明和for循环;

    int square[10];
    for (int i=0; i<10; i++)
    {
        square[i] = i * i;
    }
  22. 分配空间和利用空间的区别是什么?

    • 分配空间指声明数组时,指明的我们数组包含的元素个数;
    • 利用空间指这个数组实际用到的元素个数。
  23. 略。

  24. 略。

  25. 假设intArray声明如下:int intArray[10]; j是一个整型变量,描述计算机得到下面表达式值得过程:&intArray[j+3];

    • 首先计算j + 3的值;
    • 根据值的大小乘以数组类型的大小找到 intArray基地址 + 类型大小 * (j + 3)的元素地址;
    • 取得元素值。
  26. 如果arr被声明为一个数组,描述下列表达式:arr[2]和arr+2之间的区别 *

  27. 假设double型变量在您当前使用的计算机上占用8个字节。如果数组doubleArray起始位置是1000,那么doubleArray+5的地址是多少?

    • doubleArray + 5 = 1000 + 5 * 8 = 1040;
  28. 正误判断:如果p是一个指针变量,表达式p++表示把p所指数据加1

    • 错,p++表示指针移向下一项,下一项的地址根据指针类型有所变化。
  29. 声明一个记录变量的步骤是什么?

    • 定义记录类型;
    • 声明记录变量。
  30. 如果变量p被定义为一个指向记录的指针,这个记录有一个字段cost,下面表达式表示对指针p取值,然后选择该值的cost字段,有何不对?在C语言中,如何表达这种取值和选择的操作?*p.cost

    • .操作符的优先级高于*符号,所以表达的意思有问题;
    • 使用->操作符表达相应意思。
  31. 什么是堆?

    • 堆是可以被动态分配的内存,但是堆内存被申请后需要被显示指定释放。
  32. 类型void* 的作用是什么?

    • void* 用于接收任意类型的地址值,但不能直接被取值使用。
  33. 略。

  34. 什么是“垃圾回收”?

    • 在一些编程语言中,提供处理动态分配内存的系统,该系统检查内存,保留那些还在使用的空间,释放一些不再使用的内存,这种策略就叫垃圾回收。