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)只能以有限方式使用。不能定义该类型的对象。不完全类型只能用于定义指向该类型的指针及引用,或者用于声明(而不是定义)使用该类型作为形参类型或返回类型的函数。
在创建类的对象之前,必须完整地定义该类。必须定义类,而不只是声明类。
只有当类定义体完成后才能定义类,因此类不能具有自身类型的数据成员。然而,只要类名一出现就可以认为该类已声明。因此,类的数据成员可以是指向自身类型的指针或引用: