C语言typedef的用法详解
起"别名"的目的不是为了提高程序运行效率,而是为了"编码方便"。
例如有一个结构体的名字是 kangkang,要想定义一个结构体变量就得这样写:
struct kangkang kang1;
struct 看起来就是多余的,但不写又会报错。
如果为 struct kangkang 起了一个别名 KK,书写起来就简单了:
KK kangkang1;
这种写法更加简练,意义也非常明确,不管是在标准头文件中还是以后的编程实践中,都会大量使用这种别名。
使用关键字 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;
//eg为指针定义别名。
#include <stdio.h>
typedef char (*PTR_TO_ARR)[30];
typedef int (*PTR_TO_FUNC)(int, int);
int max(int a, int b){
return a>b ? a : b;
}
char str[3][30] = {
"kangkangshuaishuai",
"康康很帅",
"K真的帅"
};
int main(){
PTR_TO_ARR parr = str;
PTR_TO_FUNC pfunc = max;
int i;
printf("max: %d\n", (*pfunc)(10, 20));
for(i=0; i<3; i++){
printf("str[%d]: %s\n", i, *(parr+i));
}
return 0;
}
结果:
max: 20
str[0]: kangkangshuaishuai
str[1]: 康康很帅
str[2]: K真的帅