C教程
结构体、结构体变量、结构体数组、结构体指针、枚举、共用体
在C语言中,可以使用结构体(Struct)来存放一组不同类型的数据
结构体是一种集合,可以包含任意数量、任意类型、的变量/数组/指针
既然结构体是一种数据类型,可以用它来定义变量
struct 用来定义C结构体类型
结构体包含、struct 结构体名{ 结构体成员变量;} 结构体类型变量;
可以在全局范围中定义定义结构体、创建结构体变量、但不能给结构体成员赋值
不能在函数外给结构体成员变量赋值、因为结构体是自定义类型、编译器对程序进行编译时,必须先构造或者创建全局变量,为全局变量分配内存,再找入口函数;而在创建全局变量时,该变结构体类型量编译器无法识别,故无法创建该全局变量
结构体使用点号.获取单个成员 "结构体变量名.成员名;"
需要注意的是,
结构体是一种自定义的数据类型,是创建变量的模板,不占用内存空间;
结构体变量可能包含实实在在的数据,需要内存空间来存储
结构体数组是指数组中的每个元素都是一个结构体。结构体数组常被用来表示一个拥有相同数据结构的群体,比如一个班的学生、一个车间的职工等。
结构体指针是指指向一个结构体的指针,定义的形式一般为:struct 结构体名 *变量名;
结构体变量名和数组名不同,数组名在表达式中会被转换为数组指针,而结构体变量名不会,无论在任何表达式中它表示的都是整个集合本身,要想取得结构体变量的地址,必须在前面加&
结构体指针获取结构体成员:"(*pointer).memberName" 或者 "pointer->memberName"
结构体指针作为函数参数:void average(struct stu *ps, int len);
struct stu{
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在学习小组
float score; //成绩
};
可以在定义结构体的同时定义结构体变量
struct stu{
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在学习小组
float score; //成绩
}stu1, stu2;
// ...
int main(){
//给结构体成员赋值
stu1.name = "Tom";
stu1.num = 12;
stu1.age = 18;
stu1.group = 'A';
stu1.score = 136.5;
//读取结构体成员的值
printf("%s的学号是%d,年龄是%d,在%c组,今年的成绩是%.1f!\n", stu1.name, stu1.num, stu1.age, stu1.group, stu1.score);
return 0;
}
定义结构体数组和定义结构体变量的方式类似
struct stu{
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在小组
float score; //成绩
}stus[5];
结构体数组在定义的同时也可以初始化
struct stu{
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在小组
float score; //成绩
}stus[5] = {
{"Li ping", 5, 18, 'C', 145.0},
{"Zhang ping", 4, 19, 'A', 130.5},
{"He fang", 1, 18, 'A', 148.5},
{"Cheng ling", 2, 17, 'F', 139.0},
{"Wang ming", 3, 17, 'B', 144.5}
};
当对数组中全部元素赋值时,也可不给出数组长度
struct stu{
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在小组
float score; //成绩
}stus[] = {
{"Li ping", 5, 18, 'C', 145.0},
{"Zhang ping", 4, 19, 'A', 130.5},
{"He fang", 1, 18, 'A', 148.5},
{"Cheng ling", 2, 17, 'F', 139.0},
{"Wang ming", 3, 17, 'B', 144.5}
};
定义结构体指针
#include <stdio.h>
struct stu{
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在小组
float score; //成绩
} stu1 = { "Tom", 12, 18, 'A', 136.5 };
//结构体指针
struct stu *pstu = &stu1;
int main(){
printf("%s的学号是%d,年龄是%d,在%c组,今年的成绩是%.1f!\n", pstu->name, pstu->num, pstu->age, pstu->group, pstu->score);
//Tom的学号是12,年龄是18,在A组,今年的成绩是136.5!
}
枚举的取值为有限的整数:在实际编程中,有些数据的取值往往是有限的,只能是非常少量的整数,并且最好为每个值都取一个名字,以方便在后续代码中使用,比如一个星期只有七天,一年只有十二个月,一个班每周有六门课程等
枚举类型的定义形式为:enum typeName{ valueName1, valueName2, valueName3, ...... };
枚举成员都是全局的不能在定义相同名称变量、
枚举成员都是常量,不能对它们赋值,只能将它们的值赋给其他的变量
枚举和宏其实非常类似:
宏在预处理阶段将名字替换成对应的值,
枚举在编译阶段将名字替换成对应的值。
我们可以将枚举理解为编译阶段的宏。
enum week{ Mon, Tues, Wed, Thurs, Fri, Sat, Sun }; //0-6
enum week{ Mon = 1, Tues = 2, Wed = 3, Thurs = 4, Fri = 5, Sat = 6, Sun = 7 }; //1-7
enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun }; //1-7
enum week a, b, c; //定义枚举变量
enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun } a, b, c; // 定义枚举类型的同时定义变量
enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun } a = Mon, b = Wed, c = Sat; // 定义枚举类型的同时定义变量、并赋值
#include <stdio.h>
int main(){
enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun } day;
scanf("%d", &day);
switch(day){
case 1: puts("Monday"); break;
case 2: puts("Tuesday"); break;
case 3: puts("Wednesday"); break;
case 4: puts("Thursday"); break;
case 5: puts("Friday"); break;
case 6: puts("Saturday"); break;
case 7: puts("Sunday"); break;
default: puts("Error!");
}
return 0;
}
C语言共用体(Union
union 共用体名{
成员列表
};
结构体和共用体的区别在于:结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员
结构体占用的内存大于等于所有成员占用的内存的总和(成员之间可能会存在缝隙),共用体占用的内存等于最长的成员占用的内存。共用体使用了内存覆盖技术,同一时刻只能保存一个成员的值,如果对新的成员赋值,就会把原来成员的值覆盖掉
共用体也是一种自定义类型,可以通过它来创建变量
共用体在一般的编程中应用较少,在单片机中应用较多
union data{
int n;
char ch;
double f;
};
union data a, b, c;
可以在定义共用体的同时创建变量
union data{
int n;
char ch;
double f;
} a, b, c;
网友评论