qt做网站,cms进行网站开发,千部小黄油资源百度云,免费虚拟主机控制面板C语言允许为一个数据类型起一个新的别名#xff0c;就像给人起“绰号”一样。
起别名的目的不是为了提高程序运行效率#xff0c;而是为了编码方便。例如有一个结构体的名字是 stu#xff0c;要想定义一个结构体变量就得这样写#xff1a;
struct stu stu1;struct 看起来…C语言允许为一个数据类型起一个新的别名就像给人起“绰号”一样。
起别名的目的不是为了提高程序运行效率而是为了编码方便。例如有一个结构体的名字是 stu要想定义一个结构体变量就得这样写
struct stu stu1;struct 看起来就是多余的但不写又会报错。如果为 struct stu 起了一个别名 STU书写起来就简单了
STU stu1;这种写法更加简练意义也非常明确不管是在标准头文件中还是以后的编程实践中都会大量使用这种别名。
使用关键字 typedef 可以为类型起一个新的别名。typedef 的用法一般为
typedef oldName newName;oldName 是类型原来的名字newName 是类型新的名字。例如
typedef int INTEGER;
INTEGER a, b;
a 1;
b 2;INTEGER a, b;等效于int a, b;。
typedef 还可以给数组、指针、结构体等类型定义别名。先来看一个给数组类型定义别名的例子
typedef char ARRAY20[20];表示 ARRAY20 是类型char [20]的别名。它是一个长度为 20 的数组类型。接着可以用 ARRAY20 定义数组
ARRAY20 a1, a2, s1, s2;它等价于
char a1[20], a2[20], s1[20], s2[20];注意数组也是有类型的。例如char a1[20];定义了一个数组 a1它的类型就是 char [20]。
又如为结构体类型定义别名
typedef struct stu{char name[20];int age;char sex;
} STU;STU 是 struct stu 的别名可以用 STU 定义结构体变量
STU body1,body2;它等价于
struct stu body1, body2;再如为指针类型定义别名
typedef int (*PTR_TO_ARR)[4];表示 PTR_TO_ARR 是类型int * [4]的别名它是一个二维数组指针类型。接着可以使用 PTR_TO_ARR 定义二维数组指针
PTR_TO_ARR p1, p2;按照类似的写法还可以为函数指针类型定义别名
typedef int (*PTR_TO_FUNC)(int, int);
PTR_TO_FUNC pfunc;示例 为指针定义别名。
#include stdio.htypedef char (*PTR_TO_ARR)[30];
typedef int (*PTR_TO_FUNC)(int, int);int max(int a, int b){return ab ? a : b;
}char str[3][30] {http://www.baidu.com,百度搜索引擎,C-Language
};int main(){PTR_TO_ARR parr str;PTR_TO_FUNC pfunc max;int i;printf(max: %d\n, (*pfunc)(10, 20));for(i0; i3; i){printf(str[%d]: %s\n, i, *(parri));}return 0;
}运行结果
max: 20
str[0]: http://www.baidu.com
str[1]: 百度搜索引擎
str[2]: C-Language注意typedef 是赋予现有类型一个新的名字而不是创建新的类型。为了“见名知意”请尽量使用含义明确的标识符并且尽量大写。
typedef 和 #define 的区别
typedef 在表现上有时候类似于 #define但它和宏替换之间存在一个关键性的区别。正确思考这个问题的方法就是把 typedef 看成一种彻底的“封装”类型声明之后不能再往里面增加别的东西。
1 . 可以使用其他类型说明符对宏类型名进行扩展但对 typedef 所定义的类型名却不能这样做。如下所示
#define INTERGE int
unsigned INTERGE n; //没问题typedef int INTERGE;
unsigned INTERGE n; //错误不能在 INTERGE 前面添加 unsigned2 . 在连续定义几个变量的时候typedef 能够保证定义的所有变量均为同一类型而 #define 则无法保证。例如
#define PTR_INT int *
PTR_INT p1, p2;经过宏替换以后第二行变为
int *p1, p2;这使得 p1、p2 成为不同的类型p1 是指向 int 类型的指针p2 是 int 类型。
相反在下面的代码中
typedef int * PTR_INT
PTR_INT p1, p2;p1、p2 类型相同它们都是指向 int 类型的指针。