我们在C语言的关键字表中能够找到关键字typedef,它的意义是为复杂的声明定义简单的别名。对于这个单词,我们可以拆解,type为类型的意思,def是define(定义)的缩写。所以typedef的意义是为复杂的声明定义简单的别名。
关键字typedef用于为系统固有的或用户自定义的数据类型定义一个别名。假设有一个结构用三个坐标x,y,z表示一个点。它的定义如下:
struct pts
{
int x;
int y;
int z;
};
结构也是一种数据类型,那么关键字typedef也能为其定义一个别名。
我们就用关键字typedef为这个结构定义一个更方便的名字point,语句如下:
typedef struct pts point;
//这条语句指定名称point是struct pts的同义字。
利用typedef为数据类型定义一个别名后,有什么用途吗?例如上述利用typedef为结构struct pts定义一个别名point后,可以怎么用呢?
答:在定义结构变量时,有struct pts start_pt;因为
typedef struct pts point;
这条语句指定名称point是struct pts的同义字。所以在struct pts start_pt;这条语句中,利用等量代换,有
point start_pt;
即声明一些变量时,可以有以下语句:
point start_pt;
point end_pt;
typedef除了可以为结构定义别名外,还可以为基本的数据类型重新定义名称,以反映变量的含义。例如当程序涉及到不同种类物品的价格,如苹果的价格和衣服的价格,此时类型名称定义为double的同义词。
typedef double price;
//可以使用price声明变量
price apple;
price clothes;
//这些变量都是double类型,只是price是double的同义字
总结:typedef只是为一种已经存在的
数据类型
定义一个新的名称而已,并非定义一种新的数据类型。
下面我们通过一个例子来加深对typedef的理解:
//输入n个学生的信息,输出最高分学生的信息
#include<stdio.h>
typedef struct student
{
char ID[10];
char name[10];
char sex;
float score;
}STUDENT;
int main()
{
STUDENT stu,first;
int n,i;
printf("请输入学生人数:");
scanf("%d", &n);
first.score = -1; //把临时最优值first的成绩赋初始值-1
printf("请输入%d个学生的信息(学号 姓名 性别 成绩):\n", n);
for(i=1; i<=n; i++)
{
scanf("%s",stu.ID);
scanf("%s",stu.name);
scanf("%*c%c",&stu.sex);
scanf("%f", &stu.score);
if(stu.score > first.score)
first = stu;
}
printf("最高分学生的信息如下:\n");
printf("学号:%s\n",first.ID);
printf("姓名:%s\n",first.name);
printf("性别:%c\n",first.sex);
printf("成绩:%4.1f\n",first.score);
return 0;
}
STUDENT stu, first;//
这条语句声明两个STUDENT类型的结构变量,first用来保存当前分数最高的学生信息,first.score初始存放一个最小值,stu来循环接受每次读入的学生信息。
总结:利用typedef可以为数据类型起一个别名。