C语言----自定义类型(高阶篇三十)
typedef自定义类型
格式:
typedef 新类型名
如:
typedef int INTEGER;
typedef float REAL;
定义之后就可以用新的类型定义变量:
INTEGER i;
typedef还有更复杂的用法,比如用它去定义一个数组名,再用这个数组名去定义变量:
typedef int ARR[100];
ARR a,b,c;
这个定义相当于int a[100],b[100],c[100];
实际上,typedef的定义不像想象中这么简单,下面就归纳下它的定义方法:
(1)先按定义变量的方法写出定义体(如:int i)
(2)将变量名换成新类型名(如:将i换成COUNT)
(3)在前面加typedef(如:typedef int COUNT)
(4)然后可以用新类型名去定义变量。
再以定义上述的数组类型为例来说明:
(1)先按定义数组变量形式书写:int n[100];
(2)将变量名n换成自己指定的类型名:int ARR[100];
(3)在前面加上typedef,得到typedef int ARR[100];
(4)用来定义变量ARR a;
注意:
※typedef只能定义各种类型,但它不能定义变量。
※C语言没有字符串类型,可以用typedef自己定义一个字符串类型:
typedef char STRING[100];
STRING Str;
Str就是个字符串,比使用char Str[100];来定义字符串要直观的多。
结构与自定义类型
第一种:定义结构,同时定义一个结构变量stu,当然也可以同时给它的成员进行初始化。注意这个结构定义时没有结构类型名,因此这个结构只定义了一次变量stu,就再也不起作用了。因为你不知道再用什么方式引用它。
struct
{
...
}stu;
第二种:定义结构时顺便定义一些变量或同类型数组。
struct student
{
...
}stu, stuarray[5];
这种变量定义可分解为:
struct student stu,stuarray[5];
省掉中间的花括号,就是它的定义形式。
同样,使用typedef可以将结构后面定义的变量提升成类型:
typedef struct student
{
char name[9];
int age;
}STU,STUARRAY[5];
参照typedef的定义逻辑,以后用STU stu就相当于struct student stu;用STUARRAY stuarray就相当于struct student stuarray[5]。
程序1
用typedef定义结构类型
// 30-1用typedef定义结构类型.c。 #include <stdio.h> //自定义结构类型 STU STUARRY typedef struct student { char name[9]; int age; }STU,STUARRY[3]; //定义了两个类型 main() { STU stu; STUARRY stuarry; //三个元素的组成的结构数组 scanf("%s%d",stu.name,&stu.age); printf("姓名:%s 年龄:%d\n\n\n", stu.name, stu.age); scanf("%s%d",stuarry[0].name,&stuarry[0].age); scanf("%s%d", stuarry[1].name, &stuarry[1].age); scanf("%s%d", stuarry[2].name, &stuarry[2].age); printf("数组元素0的姓名%s 年龄%d\n",stuarry[0].name,stuarry[0].age); printf("数组元素1的姓名%s 年龄%d\n", stuarry[1].name, stuarry[1].age); printf("数组元素2的姓名%s 年龄%d\n", stuarry[2].name, stuarry[2].age); }
练习
将“结构与自定义类型”小节定义的STU和STUARRAY两种类型用到实处(比如从5个学生中找出成绩最好的学生)。
// 30-2用typedef定义结构类型并应用.c #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #include <time.h> //定义学生结构 typedef struct student { char name[10]; int age; float grade; }STU[5]; main() { STU stu; //定义5个元素的结构数组 float maxgrade = 0; //成绩最好的学生中间变量 int max; //最好学生的下标 srand((unsigned)time(NULL)); //随件函数 for (int i = 0; i < 5; i++) { itoa(i, stu[i].name, 10); // 将 i 整型转换成字符串类型 strcat(stu[i].name, "stu"); // 赋值学生名字 stu[i].age = rand() % 3 +15; //学生年龄 15 到 17之间 stu[i].grade = rand()/(double)(RAND_MAX/20)+80; //学生成绩 80 - 100 分浮点数 } for (int i = 0; i < 5; i++) { printf("姓名:%s 年龄:%d 成绩:%.1f\n",stu[i].name,stu[i].age,stu[i].grade); //输出生成值 if (maxgrade < stu[i].grade) //作比较 { maxgrade = stu[i].grade; //分数比较 max = i; //赋值分数高的同学下标 } } printf("\n\n\n成绩最好的学生姓名:%s 年龄:%d 成绩:%.1f\n", stu[max].name, stu[max].age, stu[max].grade); }