14 自定义数据类型
14.1 枚举
语法规则:
enum 枚举名称
{
枚举元素1,
枚举元素2,
...
枚举元素N
};
注意:元素之间是用逗号,逗号隔开的,真无语。
烦死了,今天放假了,似乎又没有
特点:
枚举元素的值必须在同一枚举中是唯一的.
枚举元素的值必须是整数类型,通常是int
如果没有为枚举元素指定值,编译器会自动为它们分配值,从0开始,依次递增。
定义枚举的时候也可以为枚举元素自定义值,需保证唯一性和整型类型。
如果有的元素赋值,有的元素没赋值,没有赋值元素的值是,紧挨着的,上一个,元素的值加1
14.1.4 枚举的应用
枚举常量的值应该是连续的,如果不连续,则无法遍历。
也不是完全不会遍历,会遍历一部分,或者是错的
#include<stdio.h>
enum Weekday{
MOD = 1,
TUE,
WED,
THU = 7,
FRI = 9,
SAT,
SUN
}day;
int main(){
//用循环遍历出所有的枚举常量
for (day = MOD; day < SUN; day++)
{
printf("%d\n",day);
}
return 0;
}
//1 2 3 4 5 6 7 8 // 9 10
这个循环的判断条件是day < 11,但是初始条件MOD = 1,所以会遍历从1 到10,会出现一个不正常的赋值。
枚举可以和switch结合。
14.2 结构体
14.2.3 声明结构体
struct 结构体名
{
数据类型1 成员名1;
数据类型2 成员名2;
……
数据类型n 成员名n;
};
元素之间是用分号隔开,
14.2.4 声明结构体变量
// 定义结构体
struct Student
{
int id; // 学号
int age; // 年龄
char *name; // 姓名
char gender; // 性别
char *address; // 家庭住址
};
// 定义结构体变量
struct Student stu1,stu2;
Student是结构体
stu1,stu2是结构体变量
14.2.5 成员的获取和赋值
了解一下指针的赋值和取值
#include <stdio.h>
// 声明结构体以及结构体变量,并给结构体成员赋值
struct Student{
int id; // 学号
int age; // 年龄
char *name; // 姓名
char gender; // 性别
char *address; // 家庭住址
};
int main()
{
struct Student stu1;
stu1 = {1002, 19, "Jim Liu", 'f', "Songjiang Shanghai"};
// 获取成员的值
printf("id: %d \n", stu1.id);
printf("name: %s \n", stu1.name);
printf("age: %d \n", stu1.age);
printf("gender: %c \n", stu1.gender);
printf("address: %s \n \n", stu1.address);
return 0;
}
14.2.6 结构体指针
是一个指针,指向结构体。
语法规则:
struct 结构体名 *结构体指针变量名;
结构体指针访问结构体成员用 ->
好几个方法可以访问成员变量的值:look
#include<stdio.h>
struct Student
{
char * name;
int age;
char sex;
double score;
};
int main(){
struct Student stu = {"cuicui",12,'f',76.5};
struct Student *pstu = &stu;
printf("name = %s\n",pstu->name);
printf("age = %d\n",(*pstu).age);
printf("sex = %c\n",(&stu)->sex);
printf("score = %lf\n",stu.score);
return 0;
}
// name = cuicui
// age = 12
// sex = f
// score = 76.500000
14.2.7 案例
小狗案例:
编写一个Dog结构体,包含name(char *)、age(int)、weight(double)属性。
编写一个say函数,返回字符串,方法返回信息中包含所有成员值。
在main方法中,创建Dog结构体变量,调用say函数,将调用结果输出
#include <stdio.h>
struct Dog
{
char *name;
int age;
double weight;
};
char *say(struct Dog dog)
{
static char info[50];
sprintf(info, "name=%s,age=%d,weight=%.2lf", dog.name, dog.age, dog.weight);
return info;
}
int main()
{
struct Dog dog;
dog.name = "小黄";
dog.age = 12;
dog.weight = 45;
char *info = say(dog);
printf("%s", info);
return 0;
}
盒子案例:
(1)编程创建一个Box结构体,在其中定义三个成员表示一个立方体的长、宽和高,长宽高可以通过控制台输入。
(2)定义一个函数获取立方体的体积(volume)。
(3)创建一个结构体指针,打印给定尺寸的立方体的体积。
#include <stdio.h>
struct Box{
double length;
double wide;
double high;
};
void volumn(struct Box *box){
double mult = (box->high) * (box->length) * (box->wide);
printf("%lf", mult);
}
int main(){
struct Box *box;
printf("请输入盒子的长:");
scanf("%lf", &box->length);
printf("请输入盒子的宽:");
scanf("%lf", &box->wide);
printf("请输入盒子的高:");
scanf("%lf", &box->high);
volumn(box);
return 0;
}
景区门票案例:
(1)一个景区根据游人的年龄收取不同价格的门票。
(2)请编写游人结构体(Visitor),根据年龄段决定能够购买的门票价格并输出。
(3)规则:年龄>18,门票为20元,其它情况免费。
(4)可以循环从控制台输入名字和年龄,打印门票收费情况,如果名字输入n,则退出程序。
#include<stdio.h>
struct Visitor
{
char *name;
int age;
double peice;
};
void tick(struct Visitor *visitor){
if (visitor->age > 18)
{
visitor->peice = 20;
}else{
visitor->peice = 0;
}
}
int main(){
struct Visitor *visitor;
while (1)
{
printf("请输入游客的名字");
scanf("%s",visitor->name);
if (!strcmp("n",visitor->name))
{
break;
}else{
printf("请输入游客的年龄:");
scanf("%d",&(visitor->age));
tick(visitor);
printf("游客应当付:%.2lf\n",visitor->peice);
}
}
return 0;
}
14.3 共用体
共用体与结构体是不一样的,共用体是凉饿成员共用一个内存区,后一个成员的值会占据前一个成员的值。他的长度是以最长的变量所占的内存为主。
14.3.2 声明共用体
格式:
union 共用体类型名称{
数据类型 成员名1;
数据类型 成员名2;
...
数据类型 成员名3;
}
14.3.3 声明共用体变量
这三种自定义数据类型结构声明共用体变量都一样。
1.先定义类型再定义变量
2.定义类型的同时一起定义变量
3.不给类型名直接定义变量
14.3.4 共用体内存分析
以最长的成员变量进行分配
14.3.5 成员的获取和赋值
//方式1
union data a;
a.c = 4;
//方式2
union data a = {.c = 4};
//方式3
union data a = {8};
14.4 typedef
14.4.1 typedef
为其他的数据类型起别名
typedef 类型名 别名;