结构体
1.语法
struct 结构体名
{
成员列表;
} ;
(1)struct关键字,表示构造一个结构体类型
(2)结构体名,名称,描述这个结构体
(3)成员列表,表示具体成员变量,定义的方式,与之前变量的方式相同,多个成员变量之间,用分号隔开
(4)最后要有分号表示结束。
举例
struct student
{
int sno;
char name[30];
char sex;
float score;
};
2.使用过程
1. 定义出类型
2.定义变量:struct 结构体名,变量名
struct student s;
3.结构体初始化
struct student s = {110,"Tom",1,59.9};
初始化要看每个成员变量,具体是什么数据类型,根据 各个成员变量 自身的数据类型,进行初始化。初始化的顺序,按照定义的顺序,依次初始。
4.结构体变量的引用
结构体数据 引用时,一般是引用到具体的成员数据,引用到成员。
运算符 . 结构体成员运算符使用:结构体变量名.成员名
运算符 -> 指向结构体成员运算符,使用: 结构体指针->成员名
练习:
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);
}
4.结构体类型的定义形式:
形式1 先定义类型,然后定义变量
struct demo
{};
struct demo d;
形式2 定义类型的同时,定义变量
struct demo
{
}d; //
形式3 定义类型的同时,定义变量,可以省略 结构体名
struct
{
}d; //如果,结构体类型只用一次
5.结构体类型的大小:
内存对齐
结构体对齐规则:内存地址的对齐
1.在32位的平台上,默认都是按4字节对齐的。
2.对于成员变量,
各自在自己的自然边界上对齐。
char -- 1字节
short -- 2字节
int -- 4字节
3.如果 成员变量中有比4字节大。
此时 整个结构体 按照4字节对齐。 //32位的平台
4.如果 成员变量中没有有比4字节大。
此时 整个结构体 按照最大的那个成员对齐。
//32位的平台
//如果有超过4字节 ,按照4字节对齐
//如果没有超过4字节的,则按成员变量中最大对齐
//64位的平台
//如果超过4字节的,按超过的最大的成员变量对齐
//如果没有超过4字节的,则按成员变量中最大对齐
注: 同类型的结构体变量之间 ,可以相互赋值
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 用来接收 要比较的两个数组元素
}
for ()
{
for ()
{
if (compar(a[i],a[j]) //)
}
}
练习:使用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
1.语法:
union 共用体名
{
成员变量;
};
eg:
union demo
{
char a;
short b;
int c;
};
共用体:
共用了一块内存空间
公用了最大成员的空间
注意:
1.共用体初始化时,只能给一个值,默认时给到第一个成员的。
2.共用体变量中的值,取决与最后一次给到的值,还要看能影响几个字节
对比 结构体
1.结构体中各个成员 拥有自己独立空间
2.共用体中,成员共用一块空间