typedef
typedef ,type表示类型, def就是define, 定义的意思。所以,根据名字我们就可以知道typedef就是类型定义的意思。可以对一个类型进行重新定义。
一般对一个类型重新定义都是这种形式: typedef 类型 重定义
如:
这种对类型重定义的方法的好处就是万一以后想要改数据类型, 可以直接在typedef处直接将int改为想要的数据类型,比如我想要将int类型,改为char类型 ,只需要将typedef处改掉就好:
这样当想要修改一些数据类型时既不容易遗漏, 也不容易出错。增加了程序的可维护性。
这里有一些对数据类型进行重新定义的例子。
上面三种类型是比较常见l的typedef例子。我们可以看到第三组区别于第一二组。
所以这里需要注意的是, 数组指针和函数指针的重新定义不是一般的:typedef 类型 重定义
而是应该将类型的重新定义写在里面
比如对数组指针进行重新定义, 首先一个数组指针的类型, 什么是他的类型标志。
假如定义一个数组指针int (*p) [5] 我们要知道, int(*)[ ] 就是这个数组指针的类型。 所以对这个类型进行重新就是:
typedef int (* 重定义)[5]
重定义部分是我们重定义后的名字, 假如我要重定义为P_int_5, 那么就可以写成:
typedef int (* P_int_5)[5]
这样就是一个完整的定义过程。P_int_ 5就是我们要的类型名。
函数指针也是一样的道理,假如想要对int(*) (int, int)进行重新定义,并且重定义后的类型名叫:P_int_int_int, 就要将重定义写在括号里面, 即:
typedef (* P_int_int_int)(int, int)
其实这里还有一点需要强调, define 和typedef是不一样的。 define是一个宏。使用宏定义数据类型, 并不是创建了一个类型名, 而是一种“代换”, 比如我这里有一串代码:
我们可以看到, 这里的pd并不是int * 类型, 而是一个int类型, 那么为什么会是这样呢, 因为宏会在预处理阶段将定义重现转化为原来的东西。什么意思?就是这样:
在预处理阶段,P_INT被转换成立int*, 但是我们直到, 这个int* 是不能作用于pd的, 想要令pd也是指针必须在pd前面加*。
而P_int就不会发生这种情况, 因为typedef重定义int* 后, 已经将P_int类型作为新的一种类型, 这个类型的类型名是P_int,类型和int* 一样。