在 C 语言中, 可以使用结构体 (Struct) 来存放一组不同类型的数据. 结构体的定义形式为:
struct 结构体名{
类型 结构体所包含的变量或数组
};
结构体是一种集合, 它里面包含了多个变量或数组, 它们的类型可以相同, 也可以不同, 每个这样的变量或数组都称为结构体的成员(Member). 请看下面的一个例子:
- struct stu{
- char *name; // 姓名 注意大括号后面的分号; 不能少, 这是一条完整的语句.
- int num; // 学号
- int age; // 年龄
- char group; // 所在学习小组
- float score; // 成绩
- };
像 int,float,char 等是由 C 语言本身提供的数据类型, 不能再进行分拆, 我们称之为基本数据类型; 而结构体可以包含多个基本类型的数据, 也可以包含其他的结构体, 我们将它称为复杂数据类型或构造数据类型.
成员的获取和赋值
结构体使用点号. 获取单个成员. 获取结构体成员的一般格式为: 结构体变量名. 成员名;
通过这种方式可以获取成员的值, 也可以给成员赋值:
- int main(){
- struct{
- char *name; // 姓名
- int num; // 学号
- int age; // 年龄
- char group; // 所在小组
- float score; // 成绩
- } stu1;
- // 给结构体成员赋值
- 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);
除了可以对成员进行逐一赋值, 也可以在定义时整体赋值, 例如:
- struct{
- char *name; // 姓名
- int num; // 学号
- int age; // 年龄
- char group; // 所在小组
- float score; // 成绩
- } stu1, stu2 = { "Tom", 12, 18, 'A', 136.5 };
结构体数组
在 C 语言中, 定义结构体数组和定义结构体变量的方式类似, 请看下面的例子:
- struct stu{
- char *name; // 姓名
- int num; // 学号
- int age; // 年龄
- char group; // 所在小组
- float score; // 成绩
- }class[5];
结构体数组在定义的同时也可以初始化(当对数组中全部元素赋值时, 也可不给出数组长度), 例如:
- struct stu{
- char *name; // 姓名
- int num; // 学号
- int age; // 年龄
- char group; // 所在小组
- float score; // 成绩
- }class[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}
- };
结构体数组的使用也很简单, 例如, 获取 Wang ming 的成绩:
class[4].score;
修改 Li ping 的学习小组:
class[0].group = 'B';
结构体指针
当一个指针 http://c.biancheng.net/c/80/ 变量指向结构体时, 我们就称它为结构体指针.
struct 结构体名 * 变量名;
在定义结构体的同时定义结构体指针:
- struct stu{
- char *name; // 姓名
- int num; // 学号
- int age; // 年龄
- char group; // 所在小组
- float score; // 成绩
- } stu1 = { "Tom", 12, 18, 'A', 136.5 }, *pstu = &stu1;
结构体指针可以获取结构体成员:
- (*pointer).memberName
- // 或者
- pointer->memberName
第一种写法中,. 的优先级高于 *,(*pointer)两边的括号不能少. 如果去掉括号写作 * pointer.memberName, 那么就等效于 *(pointer.memberName), 这样意义就完全不对了.
第二种写法中,->是一个新的运算符, 习惯称它为 "箭头", 有了它, 可以通过结构体指针直接取得结构体成员; 这也是 ->在 C 语言中的唯一用途.
来源: http://www.bubuko.com/infodetail-3384818.html