一.概述:
当一个整体由多个数据构成时,我们可以用数组来表示这个整体,但数组有个特点:内部的每一个元素都必须是相同类型的数据。
在实际运用中,我们通常需要由不同类型的数据来构成一个整体,比如学生这个整体可以由姓名、年龄、身高等构成,这些数据由不同类型组成,姓名可以是字符串类型,年龄可以整型,身高可以是浮点型。
为了解决上述问题,C语言提供了一种构造类型来决解上述问题,那就是--结构体,它允许内部的元素是不同类型的。
二.结构体类型:
1.定义:结构体内部的元数,也就是组成部分,我们称为“成员”;
2.定义形式为:
struct 结构体名{
类型 成员名1;
类型 成员名2;
...
};
struct是关键字,是结构体类型的标志。
例如:
struct Student{
char *name;//姓名
int age;//年龄
float height;//身高
};
定义了叫student(学生)的结构体,供有name、age、height3个成员。(有点面向对象思想)
三.结构体变量的定义:
1.上面只是定义了名字为Student的结构体类型,并非定义了一个结构体的变量,就像int一样,只是一种类型.
2.定义变量的方式:
2.1. 方式1:(这个方式,我比较常用)
struct Student{
char *name;
int age;
};
struct Student stu;
先定义结构体类型,再定义变量.
2.2. 方式2:
struct Student{
char *name;
int age;
}stu;
定义结构体类型的同时定义变量。
结构体变量名为stu;
2.3. 方式3:
struct{
char *name;
int age;
}stu;
直接定义结构体类型变量,省略类型名。
结构体变量名为stu;
注意:
1.不允许对结构体本身递归定义.
struct Student{
int age;
struct Student stu;//错误.
}
2.结构体内可以包含别的结构体
struct Date{
int year;
int month;
int day;
};
struct Student{
char *name;
struct Date birthday;
}
3.定义结构体类型,只是说明了该类型的组成情况,并没有给它分配存储空间,就像系统不为int类型本身分配空间一样。
只要当定义属于结构体类型的变量时,系统才会分配存储空间给该变量
//以下
struct Student{
char *name;
int age;
};
//以上,并没有分配内存,只是定义类型
//声明类型变量,分配内存空间
struct Student stu;
4.结构体变量占用的内存空间是其成员所占内存之和,而且各成员在内存中按定义的顺序依次排序.
struct Student{
char *name;
int age;
float height;
};
(由于我的电脑是Mac,查看自己电脑是几位系统,在终端上:uname -a 查看:
x86_64 表示系统为64位
i686 表示系统32位的
)
char 占一个字节
int :4个字节
float:4个字节
所以一个Student变量一共占用 1 + 4 +4 =9个字节
除此之外还有个 “内存对齐”.这个先不说。
三.结构体初始化:
将各成员的初值,按顺序地放在一对大括号{ }中,并用逗号分隔,一一对应赋值
struct Student{
char *name;
int age;
};
int main(){
struct Student stu = {"xb",20};
return 0;
}
注意:只能在定义变量的同时,进行初始化赋值,初始化赋值和变量的定义不能分开!!!
struct Student stu;
stu = {"xb",20};
错误!!!
四.结构体的使用.
struct Student{
char *name;
int age;
}
int main(){
struct Student stu = {"xb",20};
printf("%d\n",stu.age); return 0;}
1.结构体的引用是通过 "结构体变量.成员名称" 。
" . " 称为成员运算符,它在所有运算符中优先级最高。
2.如果某个成员也是结构体变量,可以连续使用成员运算符 "." 访问最低一级成员。
stu.xxx(结构体变量成员).(结构体变量里面的成员);
3.类型相同的结构体变量直接可以进行整体赋值.
struct Student stu1 = {"xb",20};
struct Student stu2 = stu1;
注意:
它们是两个不同的内存空间,stu把内容给一份stu2,它们之间是相互独立,修改其中一个,不会影响各自。