typedef三种功能
- 起别名
第一种方式起别名方式
struct person
{
char name[20];
int age;
};
//为上面结构体构造的新数据类型起别名
typedef struct person Person;
int main(void)
{
struct person a = {"小明",12};//直接使用结构体变量名创建变量
Person b = {"小王",11}; //使用别名创建变量
return 0;
}
第二种方式起别名方式
//第二种起别名方式
//直接在结构体前加typedef创建
typedef struct student
{
int ID;
int garden;
}Student;
int main(void)
{
//第二种方式
Student c = {12312,5};
return 0;
}
- 区分数据类型
void test()
{
char* p, q;//此处的 p q,p为指针变量、q为字符变量
//通过打印其所占内存大小确定两者数据类型不一样
//指针变量占4个字节 字符型变量占1个字节
printf("p is %d\n",sizeof(p));
printf("q is %d\n", sizeof(q));
}
int main(void)
{
//typedef区分数据类型
test();
return 0;
}
窗口打印出的数据:
p is 4
q is 1
由上面试验得出使用
charp,q;
得出p为指针变量,q为字符变量,与其他数据类型不一样。可以使用typedef为char等指针变量起别名,这样别名同时创建的变量类型相同。可参考下面示例:
void test()
{
//使用typedef创建指针变量数据别名同时创建变量
typedef char* PCHAR;
PCHAR ptr, qtr;
printf("使用typedef创建别名之后\n");
printf("p is %d\n", sizeof(ptr));
printf("q is %d\n", sizeof(qtr));
}
int main(void)
{
//typedef区分数据类型
test();
return 0;
}
使用typedef创建别名之后
p is 4
q is 4
通过打印出的结果可知两个变量都为指针变量
- 提高可移植性
例如:在C89标准中我们不可以使用C99标准中的long long数据类型。如果我们把一个含有多个long long数据类型的代码移植到C89标准模式下执行我们必须对long long数据类型作出更改才能执行,为了挺高程序移植性,我们可以对long long使用typedef起一个新名字,再C89标准下作出更改是就不比一一更改,只需要更改typedef语句就可以。
void TypedefMoveTest()
{
typedef long long Lstruct;
Lstruct a;
long long b;
printf("a is %d\n", sizeof(a));
printf("b is %d\n", sizeof(b));
}
int main(void)
{
//使用typedef提高可移植性
TypedefMoveTest();
return 0;
}
打印使用typedef和未使用typedef long long数据类型的大小
a is 8
b is 8