结构体类型 ---- 用来描述复杂数据的一种数据类型
struct
语法:
struct 结构体名
{
成员列表;
} ;
(1) struct 关键字
表示 是在构造一个结构体的类型
(2) 结构体名
用来 描述 结构体这个类型 一个名称
(3) 成员列表
表示 要描述的复杂数据 中用到的 具体的成员变量
定义的方式,与之前变量的方式相同
多个成员变量之间,用分号隔开。
(4) 最后 有一个 分号 表示 结束
struct student
{
char name[30]; //
int sno;
float score;
char sex;
}; //表示 定义出 一个 数据类型
注意:
1.结构体类型的使用的过程
a.先定义出类型
b.定义变量:struct 结构体名 变量名;
结构体初始化
初始化
看每个成员变量,具体是什么数据类型。
根据 各个成员变量 自身的数据类型,进行初始化。
初始化的顺序,按照定义的顺序,依次初始化
struct student s = {2021,"tom",1,59};
结构体变量的引用:
//结构体数据 引用时,一般是引用到具体的成员数据
运算符 . //结构体成员运算符
使用:
结构体变量名.成员名 //表示 访问 某个结构体 的成员
struct student s = {2021,"tom",1,59.5};
printf("sno = %d\n",s.sno);
printf("name = %s\n",s.name);
printf("sex = %d\n",s.sex);
printf("score = %.2f\n",s.score);
运算符:-> 指向结构体成员
结构体指针->成员名
练习:
1. 要求,可以输入 3个学生的信息
2.输出
3. 打印出 成绩最高的学生的信息
void inputStuInfo(struct student *s,int n)
{
int i = 0;
for (i = 0;i < n;++i)
{
printf("Input a sno:");
scanf("%d",&s[i].sno);
printf("Input a name:");
scanf("%s",s[i].name);
printf("Input a sex:");
scanf("%hhd",&s[i].sex);
printf("Input a score:");
scanf("%f",&s[i].score);
}
}
void printStu(struct student *s,int n)
{
int i = 0;
printf("")
for (i = 0; i < n; ++i)
{
printf("no = %d ",i,(s+i)->sno);
printf("name = %s ",i,(s+i)->name);
printf("sex = %d ",i,(s+i)->sex);
printf("score = %.2f",i,(s+i)->score);
putchar('\n');
}
}
void printTopOne(struct student *s,int len)
{
int i = 0;
float max = s[0].score;
int f = 0;
for (i = 1;i < len;++i)
{
if(s[i].score >max)
{
max = s[i].score;
f = i;
}
}
printStu(&s[f],1);
}
结构体类型的定义形式:
形式1 先定义类型,然后定义变量
struct demo
{ };
struct demo d;
形式2 定义类型的同时,定义变量
struct demo
{
}d;
形式3 定义类型的同时,定义变量,可以省略 结构体名
struct
{
}d; //如果,结构体类型只用一次
结构体类型的大小
结构体类型的大小:
内存对齐
结构体对齐规则
结构体的对齐:
结构体的对齐规则: //内存地址的对齐
1.在32位的平台上,默认都是按4字节对齐的。
2.对于成员变量,
各自在自己的自然边界上对齐。
char -- 1字节
short -- 2字节
int -- 4字节
3.如果 成员变量中有比4字节大。
此时 整个结构体 按照4字节对齐。 //32位的平台
4.如果 成员变量中没有有比4字节大。
此时 整个结构体 按照最大的那个成员对齐。
//32位的平台
//如果有超过4字节 ,按照4字节对齐
//如果没有超过4字节的,则按成员变量中最大对齐
----------------------------------------------
//64位的平台
//如果超过4字节的,按超过的最大的成员变量对齐
//如果没有超过4字节的,则按成员变量中最大对齐
-----------------------------------------------
2.同类型的结构体变量之间 ,可以相互赋值
struct student s1;
struct student s2;
s2 = s1;
qsort函数
void qsort(
void *base, //要排序的数组的首地址
size_t nmemb, //数组元素的个数
size_t size, //单个元素的大小
int (*compar)(const void *, const void *) //比较函数 --- 提供比较依据
);
功能:
排序数组
int compar(const void *a, const void *b)
{ //比较函数
//形参 a 和 b 用来接收 要比较的两个数组元素
}
练习:使用qsort 按分数 进行排序
#include <stdio.h>
#include <stdlib.h>
int compar(const void *a,const void *b)
{
const int *p = a;
const int *q = b;
return *p-*q;
}
int main(void)
{
int a[]= {1,2,3,7,8,5,6,4,9,0};
qsort(a,10,sizeof(a[0]),compar);
int i = 0;
for (i = 0;i < 10; ++i)
{
printf("%d\n",a[i]);
}
return 0;
}
共用体
共用体:union
语法:
union 共用体名
{
成员变量;
};
union demo
{
char a;
short b;
int c;
};
共用体:
共用了一块内存空间
公用了最大成员的空间
注意:
1.共用体初始化时,只能给一个值,默认时给到第一个成员的。
2.共用体变量中的值,取决与最后一次给到的值,还要看能影响几个字节。
对比结构体
1.结构体中各个成员 拥有自己独立空间
2.共用体中,成员共用一块空间
考点:
用共用体 判断大小端