------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
一、什么是结构体
当一个整体由多个数据构成时,我们可以用数组来表示这个整体,但是数组有个特点:内部的每一个元素都必须是相同类型的数据。
在实际应用中,我们通常需要由不同类型的数据来构成一个整体,比如学生这个整体可以由姓名、年龄、身高等数据构成,这些数
据都具有不同的类型,姓名可以是字符串类型,年龄可以是整型,身高可以是浮点型。
为此,C语言专门提供了一种构造类型来解决上述问题,这就是结构体,它允许内部的元素是不同类型的。
1.定义形式
结构体内部的元素,也就是组成成分,我们一般称为"成员"。
结构体的一般定义形式为:
struct 结构体名{
类型名1 成员名1;
类型名2 成员名2;
};
2.举例
比如,我们定义一个学生类
- struct Student{
- charchar *name; // 姓名
- int no; // 学号
- float score; // 分数
- };
三、结构体变量的定义
前面只是定义了名字为Student的结构体类型,并非定义了一个结构体变量,就像int一样,只是一种类型。
定义结构体的方式一般有三种
1.先定义结构体类型,再定义变量
- struct Student{
- charchar *name;
- int no;
- float score;
- };
2.定义结构体类型的同时定义变量
- struct Student{
- charchar *name;
- int no;
- float score;
- }stu;
3.直接定义结构体类型变量,省略类型名
- struct stu{
- charchar *name;
- int no;
- float score;
- }stu;
四、结构体的注意点
1.结构体不可以包含自己
- struct Student {
- int age;
- struct Student stu;
- };
2.结构体内可以包含别的结构体
- struct Date {
- int year;
- int month;
- int day;
- };
- struct Student {
- charchar *name;
- int no;
- float score;
- struct Date birthday;
- };
3.只有当定义属于结构体类型的变量时,系统才会分配存储空间给该变量
- struct Student {
- charchar *name;
- int age;
- };//没有分配存储空间
- struct Student stu;//分配了内存空间给结构体变量
4.结构体占用的字节数和结构体内部的成员变量有关
五、结构体的初始化
将各成员的初值,按顺序地放在一对大括号{}中,并用逗号分隔,一一对应赋值。
比如初始化Student结构体变量stu
- struct Student{
- charchar *name;
- int no;
- float score;
- };
- struct Student stu = {"ZM",110,120};
结构体只能在定义变量的时候赋初值
- struct Student stu = {"ZM",110,120};
- /****************************************************************************
- *题目:
- *1:结构体的初步练习,定义并输出结构体
- ****************************************************************************/
- #include <stdio.h>
- int main()
- {
- struct Person{
- int age;
- double height;
- charchar *name;
- };
- struct Person p = {20,1.75,"ZhangMing"};
- p.age = 23;
- p.name = "XieQing";
- p.height = 1.73;
- printf("age=%d,name=%s,height=%.2f\n",p.age,p.name,p.height);
- return 0;
- }
- /****************************************************************************
- *
- *题目:
- *复习定义结构体的三种方式
- *使用循环语句输出结构体
- ****************************************************************************/
- //struct Student{
- // int age;
- //};
- //struct Student stu;
- //
- //struct Student{
- // int age;
- //}stu;
- //struct Student stu2;
- //
- //struct {
- // int age;
- //}stu;
- int main()
- {
- struct RankRecord {
- int no;
- charchar *name;
- int score;
- };
- struct RankRecord records[3] = {
- {1,"jack",100},
- {2,"jims",98},
- {3,"jake",89}
- };
- records[0].name = "lily";
- for (int i=0; i<3; i++)
- {
- printf("%d\t%s\t%d\n",records[i].no,records[i].name,records[i].score);
- }
- return 0;
- }
- /****************************************************************************
- *题目:
- *1.指向结构体的指针的定义
- *struct Student *p;
- *2.利用指针访问结构体的成员
- *1> (*p).成员名称
- *2> p->成员名称
- ****************************************************************************/
- #include <stdio.h>
- int main()
- {
- struct Student{
- int no;
- int age;
- };
- struct Student stu = {1,20};
- struct Student *p = &stu;
- p->no = 10;
- 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);
- printf("age=%d, no=%d\n",(*p).age,(*p).no);
- return 0;
- }
- /****************************************************************************
- *
- *题目:
- *结构体嵌套
- ****************************************************************************/
- #include <stdio.h>
- int main()
- {
- struct Date{
- int year;
- int month;
- int day;
- };
- // 这个要注意下
- struct Student {
- int no;
- struct Date birthday;
- struct Date ruxueday;
- };
- struct Student stu = {1,{2000,1,1},{2012,2,3}};
- printf("%d,(%d,%d,%d),(%d,%d,%d)\n", stu.no,
- stu.birthday.year, stu.birthday.month, stu.birthday.day,
- stu.ruxueday.year, stu.ruxueday.month, stu.ruxueday.day);
- return 0;
- }