C语言--读书笔记(二)

来源:互联网 发布:株洲网络问政平台 编辑:程序博客网 时间:2024/06/10 05:41

5. 指针的类型装换&类型

   1: char (*j)[20];    /* j是一个指向数组的数组指针*/
   2: j = (char (*)[20])malloc(20);
   3:  
   4: const int *grape;  /*常量指针:指针指向可改,
   5: int const *grape;   但是指向的内容不能改*/
   6: int * const graoe_jelly; /*指针常量:指针指向不可改,但是指向内容可改*/

6. 声明类型

   1: 函数的返回值允许是一个函数指针: int (*fun()) ();
   2: 函数的返回值允许是一个指向数组的指针:int (*foo())[]
   3: 数组里面允许有函数指针: int (*foo[]) ();
   4: 数组里面允许有其他数组: int foo[][];
   5: 例:struct s_tag {int a[100];};
   6:     struct s_tag orang, lime, lemon;
   7:     struct s_tag twofold (struct s_tag s) {.......}; //twofold为函数名
   8:     lemon = twofold(lime);
   9:     orange = lemon;

7. C语言中的声明的优先级规则

   A. 声明从它的名字开始读取,然后按照优先级顺序依次读取。
   B. 如果const和(或)volatile关键字后面紧跟类型说明符(如int,char等)那么它作用于类型说明符。
      在其他情况下,const或volatile作用越他左边紧邻的指针星号。

   例: char * const * (* next) ();
        /*声明 它表示"next是一个指针,他指向一个函数,该函数返回另一个指针,该指针是指向一个类型为char的常量的常指针。"


8. typedef与#define

A. 不要再一个typedef中放入几个声明器。

   例:typedef int *ptr, (fun)(), arr[5];

   B. 千万不要把typedef嵌到声明中间:

   例:#define peach int
       unsigned peach i;  /*没有问题*/
       typedef int banana;
       unsigned banana i;  /*非法*/

   C. 在连续几个变量的声明中,typedef定义能保证一致性

   例:
      #define int_ptr int*     /*chalk 为"int 的指针",
      int_ptr chalk, cheese;    cheese 是"int 类型"*/
      typedef char* char_ptr;          /*benty与Rolls_Royce类型相同,
      char_ptr Bentleg, Rolls_Royce;     同为"int的指针" */

9. typedef的名字空间
   C语言中存在很多的名字空间
    标签名(label name)
    标签(Tag):这个名字空间用于所有的结构,枚举和联合。
    成员名:每个结构或联合都有自身的名字空间

    例:typedef struct bas {int baz;} baz;
                                    |标签     |成员名 |类型别名
        struct bas variable_1;
                |标签
        baz variable_2;
         |类型别名

10. 区别类定义和类说明
    一旦遇到右花括号,类的定义就结束了。并且一旦定义了类,那以我们就知道了所有的类成员,以及存储该类的对象所需的存储空间。
    可以声明一个类而不定义它。这个声明,有时称为前向声明(forward declaraton),这个类是一个不完全类型(incompete type)。
    不完全类型(incomplete type)只能以有限方式使用。不能定义该类型的对象。不完全类型只能用于定义指向该类型的指针及引用,或者用于声明(而不是定义)使用该类型作为形参类型或返回类型的函数。
    在创建类的对象之前,必须完整地定义该类。必须定义类,而不只是声明类。
    只有当类定义体完成后才能定义类,因此类不能具有自身类型的数据成员。然而,只要类名一出现就可以认为该类已声明。因此,类的数据成员可以是指向自身类型的指针或引用: