C专家编程(三)

来源:互联网 发布:dos怎么运行java 编辑:程序博客网 时间:2024/04/28 18:39
第三章 分析C语言的声明
1、一些声明
非法:
1)函数的返回值不能是一个函数,如:foo()()
2)函数的返回值不能是一个数组,如:foo()[]
3)数组里面不能有函数,如:foo[]()
合法:
1)函数的返回值可以是一个函数指针,如:int (* fun())();
2)函数的返回值可以是一个指向数组的指针,如:int (* fun())[];
3)数组里面可以有函数指针,如:int (* foo[])();

2、结构struct
struct { 内容... };
struct { 内容... } plum,pear;     //plum是该结构类型的变量
struct fruit_tag { 内容... } plum,pear;    //struct fruit_tag作为struct { 内容... }的简写
为了便于理解,建议把变量的声明与类型的声明分开!

3、联合union
结构中,每个成员依次存储
联合中,所有成员都是从偏移地址0开始存储,意味着某一时刻,只有一个成员真正存储于改地址
用途:(使用同struct)
1)存储互斥的字段,节省空间
2)同一个数据解释成两种不同的东西

4、枚举enum
enum sizes { small=7,middle,large=10,humungous } all;
内容是一些标识符的列表,或者是有一些整型值赋给它们。
缺省时,整型值从0开始。
对列表中某个标识符赋值后,后边的标识符比它大1,依次类推。

5、C语言声明的优先级规则
A 声明从它的名字开始,然后按照优先级读取
B 优先级从高到低依次是:
   B. 1 声明中被括号括起来的那部分
   B. 2 后缀操作符:括号()表示是一个函数,方括号[]表示是一个数组
   B. 3 前缀操作符:星号*表示指向..的指针
C 如果const关键字后面紧随类型说明符,则作用于类型说明符
   在其他情况下,const作于于它左边紧邻的指针星号
例子:char * const *(*next)();
next是一个指针,它指向一个函数,该函数返回另一个指针,该指针指向一个类型为char的常量指针。

6、typedef
它为一种类型引入一个新的名字,而不是为变量分配空间。
typedef的格式与变量声明完全一样,只是多了个关键字而已。
普通声明表示“这个名字是一个指定类型的变量”,而typedef表示“这个名字是指定类型的同义词”。

7、typedef和#define的区别
1)可以用其他类型说明符对宏类型名进行进行扩展,但是对typedef却不能
例子:#define peach int
          unsigned peach i;            //正确
          typedef int banana;
          unsigned banana i;      //错误
2)连续变量声明中,typedef可以保证变量为同一类型
例子:#define int_ptr int *
          int_ptr chalk,cheese;
          int *chalk,cheeese;     //不一致
          typedef char * char_ptr;
          char_ptr chalk,cheese;    //一致

8、名字空间
1)标签名
2)标签
3)成员名
4)其他
同一名字空间,名字必须唯一,不同空间可以存在相同名字。

9、typedef和结构struct
例子:
typedef struct my_tag { int i; } my_type;
struct my_tag variable_1;
my_type variable_2;
这里面my_type作为 struct my_tag { int i; }的简写形式。
typedef struct my_tag1 { int i; } my_type1;       // my_type1是结构类型
             struct my_tag2 { int i; } my_type2;       // my_type2是结构变量
适用场合:
1)数组、结构、指针以及函数的组合类型
2)可移植类型。便于修改,一处代替多处
3)为强制类型转换提供别名
原创粉丝点击