一、结构体的定义
结构体可以由多个不同类型的数据构成。
int main()
{
//定义结构体
struct person
{
int age;
double height;
char *name;
};
//定义结构体变量
struct person p = {20, 1.55, “jack”};
struct person p2 = {.name=”jack”, .age=20; .height=1.55}; //不按顺序赋值
p.age = 30; //结构体内部变量赋值
p.name = “rose”;
}
定义结构体变量的三种方式:
1.先定义类型,再定义变量
</pre><pre name="code" class="csharp">struct Student
{
int age;
};
struct Student stu;
2.定义类型的同时定义变量
struct Student
{
int age;
} stu;// stu为变量名
struct Student stu2;// 也可以继续定义新变量
3.定义类型同时定义变量(省略类型名称)
struct
{
int age;
} stu;
二、结构体的内存分析
int main()
{
//声明结构体类型,不分配内存空间
struct Date
{
int year;
int month;
int day;
};
struct Date d1 = {2014, 4, 10};
struct Date d2 = {2012, 8, 9};
d2.month = 12;
int size = sizeOf(d1);
printf(“%d\n”, size); //输出为12 = 4 + 4 + 4,三个int类型长度相加。注意:结构体所占存储空间的个数为最大成员字节数的倍数(补齐算法、对齐算法)
return 0;
}
内存示意图如下:
倘若 d2 = d1;
意味着将d1的所有成员值对应的赋值给d2的所有成员
三、结构体数组
struct RankRecord
{
int no;
char *name;
int score;
};
struct RankRecord records[3] =
{
{1, “jack”, 5000},
{2, “jim”, 500},
{3, “jack”, 300}
};
for(int i=0; i<3; i++)
{
printf(“%d\t%s\t%d\n”, records[i].no, records[i].name, records[i].score);
}
注意:records[0] = {4, “rose”, 9000};写法是错误的,因为结构体定义不可以使用用变量名单独赋值,变量前应该有结构体类型;所以这种情况应该使用records[0].no = 4;records[0].name = “rose”;records[0].score = 9000;
四、指向结构体的指针
int main()
{
struct Student
{
int no;
int age;
};
// 结构体变量
struct Student stu = {1, 20};
// 指针变量p将来指向struct Student类型的数据
struct Student *p;
// 指针变量p指向了stu变量
p = &stu;
// 第一种方式
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);<span style="white-space:pre"> </span>// <span style="font-family:Arial, Helvetica, sans-serif;">"</span><span style="font-family: 'Times New Roman';">p->age"</span><span style="font-family: 宋体;">也可以用来修改结构体成员变量值</span>
return 0;
}
1.指向结构体的指针的定义
struct Student *p;
2.利用指针访问结构体的成员
1>(*p).成员名称
2>p->成员名称
3>结构体变量名.成员名称
五、结构体的嵌套的使用
注意:结构体不可以包含自身作为成员
int main()
{
struct Date
{
int year;
int month;
int day;
};
// 类型
struct Student
{
int no; // 学号
struct Date birthday; // 生日
struct Date ruxueDate; // 入学日期
};
struct Student stu = {1, {2000, 9, 10}, {2012, 9, 10}};
printf(“year=%d, month=%d, day=%d\n”, stu.birthday.year, stu.birthday.month, stu.birthday.day);
return 0;
}
六、枚举的使用
int main()
{
enum Sex {Man, Woman, Unkown};
// 0男 1女 -1不详
// int sex = 3;
// enum Sex s = Unkown;
// 1.定义枚举类型
enum Season
{
spring = 1, // 如果这里等于1,那么后边的成员的值依次递增1
summer,
autumn,
winter
};
// 2.定义枚举变量
enum Season s = winter;
printf(“%d\n”, s);
return 0;
}