C语言查缺补漏(八)typedef的使用

忽略点八: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是在编译时处理的。

转载请注明出处!!!

​ 如果有写的不对或者不全面的地方 可通过主页的联系方式进行指正,谢谢!

猜你喜欢

转载自blog.csdn.net/Ivan_zcy/article/details/82932011