结构体是一种数据类型-----构造类型
struct 结构体名
{
成员列表
};
1、struct //结构体 类型 关键字
2、结构体名 //表明这个结构体类型的名称
3、成员列表 //来描述结构体类型中具体的一些数据
//成员变量
注意结束的}后面要有一个分号!!
声明结构体类型
struct studet
{
char name[20];
char sex;
int sno;
float core;
}
int main(void)
{
int a;
//初始化方式:按照成员列表的对应方式依次初始化
struct student s = {“xiaoming”,0,1110,99.5};
结构体变量的引用:
方法:
结构体变量名.成员名 (这个.是结构体成员运算符)
eg:s.name //访问s中的name
//打印
printf("name = %s\n",s.name); //访问s中的name
}
结构体变量不能整体的输入值
eg: scanf(“%d”,&s.sno); 因为.运算符的优先级高于&。所以不需要加括号
注意: 在输入字符型数据的时候结尾的回车哟啊通过getchar()来吃掉它
eg: scanf(“%s”,&s.name);
getchar();
scanf(“%c”,&s.sex);
定义的方式:
1、 先声明变量 再定义变量
//如上面的例子
但不能再main中声明会出现错误
2、 声明类型的同时定义变量:
struct student
{
...
}s;
3、 声明类型的同时定义变量 但是省略结构体的名
suruct
{
。。。
}s;
0.两个结构体运算符:
. //成员运算符
方法:
结构体变量名 . 成员变量名
-> // 指向结构体成员运算符
方法:
结构体类型的指针 -> 成员变量名
同一类型的结构体变量之间是可以相互赋值的
通过结构体类ing的指针 也可以访问到结构体成员
结构体类型既可以做函数形参,也可以做为返回值
qsort(起始地址,元素个数,单个元素大小,排序规则)
考点:
结构体实际的大小并不等于结构体里数据类型大小的简单相加
!注意!
计算机存在效率问题
内存对齐:
结构体对齐规则: //内存地址的对齐
结构体对齐:
1、在32位的平台上,默认都是按照4字节对齐的。
在64位的平台上,默认都是按照8字节对齐的
2、对于成员变量,
各自在自己的自然边界上对齐。
char --1字节
short--2字节
int --4字节
3、如果 成员变量中有比4字节大。此时整个结构体按照4字节对齐。
4、如果 成员变量中没有比4字节大的,此时整个结构体按照最大的那个成员对齐。