结构体
* 可以有不同类型的数据组成
* 先定义结构体类型,在利用类型定义变量
1. 定义结构体
1> 定义结构体类型
struct Person
{ 里面的3个变量,可以称为是结构体的成员或者属性
int age; // 年龄
double height; // 身高
char *name; // 姓名
};
2> 根据结构体类型,定义结构体变量
struct Person p = {20, 1.55, "jack"};
p.age = 30;
p.name = "rose";
错误写法:
struct Person p2;
p2 = {30, 1.67, "jake"};
2. 定义结构体变量的3种方式
1> 先定义类型,再定义变量(分开定义)
struct Student
{
int age;
};
struct Student stu;
2> 定义类型的同时定义变量
struct Student
{
int age;
} stu;
struct Student stu2;
3> 定义类型的同时定义变量(省略了类型名称)
struct
{
int age;
} stu;
注意:结构体类型不能重复定义
3. 结构体类型的作用域
1> 定义在函数外面:全局有效(从定义类型的那行开始,一直到文件结尾)
2> 定义在函数(代码块)内部:局部有效(从定义类型的那行开始,一直到代码块结束
4. 结构体数组
1> 先定义类型
struct RankRecord
{
int no; // 序号 4
int score; // 积分 4
char *name; // 名称 8
};
2> 定义结构体数组
struct RankRecord records[3] =
{
{1, "jack", 5000},
{2, "jim", 500},
{3, "jake",300}
};
访问更改数组元素
records[0].no = 4;
records[0] = {4, "rose", 9000}; 错误写法
* 遍历
for (int i = 0; i<3; i++)
{
printf("%d\t%s\t%d\n", records[i].no, records[i].name, records[i].score);
}
5. 指向结构体的指针
1> 定义
struct Student *p;
2> 利用指针访问结构体的成员
* (*p).成员名称
* p->成员名称
例:
struct Student
{
int no;
int age;
};
// 结构体变量
struct Student stu = {1, 20};
// 指针变量p将来指向struct Student类型的数据
struct Student *p;
// 指针变量p指向了stu变量
p = &stu;
p->age = 30;
// 第一种方式
printf("age=%d, no=%d\n", stu.age, stu.no);
// 第二种方式
printf("age=%d, no=%d\n", (*p).age, (*p).no);
// 第三种方式
printf("age=%d, no=%d\n", p->age, p->no);
6. 结构体的嵌套
1> 定义类型
struct Date
{
int year;
int month;
int day;
};
// 类型
struct Student
{
int no; // 学号
struct Date birthday; // 生日
struct Date ruxueDate; // 入学日期
// 这种写法是错误的
//struct Student stu;
};
2> 定义变量
struct Student stu = {1, {2000, 9, 10}, {2012, 9, 10}};
|
|