忽略点八:typedef的使用
至于typedef,说起来实在是太丢人了!!这两年一直以为这个关键字是结构体的专属关键字:
typedef 结构体类型 {
//省略代码
} 类型别名
类型别名 变量名 //定义
最近才发现,它不仅可以给结构体起别名,还可以给各种各样的类型起各种各样的别名,用法实在是太活了!
——比如基本数据类型:
typedef int size;
size a; //等价于int a;
——比如数组:
typedef int T[105];
T a; //等价于 int a[105];
——比如指针:
typedef char* ps;
ps p1, p2; //等价于 char *p1, *p2;
说到这儿,有一个代码大家需要注意:
char* p1, p2;
这里面的p1和p2分别是什么类型?
可能和大家想的不太一样(反正到时我是掉坑里了,尴尬),p1是char型指针,p2是char型。
——用来定义与平台无关的东西:
比如定义一个叫Max_Double的浮点类型:
typedef long double Max_Double; //在一般平台的定义
typedef double Max_Double; //在不支持long double平台的定义
typedef float Max_Double; //在不支持double平台的定义
这样在跨平台时,只需要改一下Max_Double定义即可,比如之前博文写的通用long long写法 点这儿走你 添加的<inttype.h>头文件就是采用了该方法。
要记住!!!typedef是定义了一种类型的新别名,不是简单的字符串替换!!比如:
typedef int* T;
int mystrcmp(const T);
const T等同于什么?我当初不假思索地以为是const int* 。然后现实给了我狠狠的打嘴巴子,它实际上相当于int* const。原因在于const给予了整个指针本身以常量性,也就是形成了常量指针int const* (简单来说,记住当const和typedef一起出现时,typedef不会是简单的字符串替换就行。)
说到const int* 和 int* const等几个的区别:
——const int *a; 表示a是一个指针,可以任意指向int型常量或变量
——int const *a: 同const int *a
——int * const a; 表示a是一个指针常量,初始化时必须固定指向一个int变量,之后就不能再指向别的地方了
除此之外,typedef不能影响对象的存储特性!!!例如以下代码会出错:
typedef static int T; //无法与之前的'typedef'声明说明符结合使用
最后再总结一句:typedef作用是为类型起别名,但不同于#define的简单替换!而且不同于#define替换时不作正确性检查,typedef是在编译时处理的。
如果有写的不对或者不全面的地方 可通过主页的联系方式进行指正,谢谢!