目录
结构体
类型:
用来描述复杂数据的一种数据类型
构造类型(用户自定义)
定义:
struct 结构体类型名
{
成员列表
};
①struct关键字,表示是在构造一个结构体类型。
②结构体名:用来描述结构体这个类型(即一个名称)
③成员列表:表示描述的复杂数据中用到的及具体成员变量
eg:构造一个学生类型的结构体,用来存放学生信息
struct student
{
char name[20];
float score;
char sex[10];
int sno;
};//(别忘了要写分号)
完成以上步骤,表示构造出了一个结构体类型(struct student整体为一个类型(与int)相当)
可以用来定义变量和初始化:
结构体定义变量:
struct student 名字
初始化:
struct student s = {};
①看每个成员变量具体是什么数据类型
②根据每个成员变量自身的数据类型,进行初始化
③初始化的顺序是按照定义的顺序,一次进行初始化。
根据以上步骤,以下我们就成功定义并初始化了一个结构体类型。
struct student
{
char name[20];
float score;
char sex[10];
int sno;
};
int main()
{
struct student s = {"tom",100,"男",2024};
return 0;
}
结构体的定义形式:
1.
struct demo
{
};
struct demo s = {};//可以多次定义并使用的结构体定义方式。
2.
struct demo
{
}s;//直接定义一个结构体变量
3.struct
{
}s;//省略名字定义变量,只能使用一次这种结构体
相同类型的结构体变量之间可以互相赋值:
struct student s1;
struct student s2;
s1 = s2;
qsort排序函数:
void qsort(void *base,//表示要排序的数组首地址
size_t nmemb//数组元素的个数
size_t size//数组单个元素的大小
int(*compar)(const void *a,const void *b)//比较函数
)
int compar(const void *a,const void *b)
{
const struct student *q = a;
const struct student *p = b;//看数组存放的时什么类型就写什么类型
return *q - *p;
}
结构体字节对齐规则:
32位平台:
1.如果成员变量中有比4字节还大的,此时整个结构体按4字节对齐
2.如果成员变量中没有比四字节大的,此时整个结构体按照最大的那个字节对齐。
64位平台:
1.如果超过4字节的,按超过的最大的成员变量对齐
2.如果没有超过4字节的,按照成员变量中最大的对齐
共用体定义(与结构体定义一样):
union demo
{
int a;
float b;
char c;
short d;
};
共用体含义:
共用一块内存空间,共用了最大字节成员的空间
注意点:
①共用体初始化时,只能给一个值,默认给到第一个成员
②共用体变量中的值,取决于最后一次给到的值,还要看能影响几个字节
对比结构体:
1.结构体中各个成员拥有自己独立的内存空间
2.共用体中,各个成员共用一块成语最大字节的内存空间。
共用体判断电脑大小端存储方式:
int isLittlePc()
{
union demo
{
int a;
char b;
}d = {1};
return d.b;//如果b返回1则表明pc为小端存储
}
结构体实现学生管理系统:
#include <stdio.h>
#include <stdlib.h>
struct student
{
char name[30];
char sex;
char sno[20];
float score;
};
void inputStuinfo(struct student *s,int len)
{
for (int i = 0; i < len; i++)
{
printf("input s->name: ");
scanf("%s",(s+i)->name);
printf("input s->sex: ");
scanf("%hhd",&(s+i)->sex);
printf("input s->sno: ");
scanf("%s",(s+i)->sno);
printf("input s->score: ");
scanf("%f",&(s+i)->score);
}
}
void outputStuinfo(struct student *s,int len)
{
printf("%6s %4s %6s %7s\n","name|","sex|","sno|","score|");
printf("%6s %2s %5s %7s\n","----|","---|","-----|","----|");
for (int i = 0; i < len; i++)
{
printf("%5s|",s[i].name);
printf("%4d|",s[i].sex);
printf("%6s|",s[i].sno);
printf(" %6.2f|\n",s[i].score);
}
}
void printfTopOne(struct student *s,int len)
{
int i = 0;
int k = 0;
float max = s->score;
for (i = 0; i < len; i++)
{
if ((s+i)->score > max)
{
max = (s+i)->score;
k = i;
}
}
outputStuinfo(s+k,1);
}
int compar2(const void *a,const void *b)
{
const struct student *q = a;
const struct student *p = b;
return q->score*100 - p->score*100;
}
int compar1(const void *a,const void *b)
{
const struct student *q = a;
const struct student *p = b;
return p->score*100 - q->score*100;
}
int comparsno(const void *a,const void *b)
{
const struct student *q = a;
const struct student *p = b;
return p->sno - q->sno;
}
int main()
{
printf("1.----------录入学生信息------------------------\n");
printf("2.----------打印学生信息------------------------\n");
printf("3.----------查看分数最高的学生信息--------------\n");
printf("4.----------以分数从高到低查看学生信息----------\n");
printf("5.----------以分数从低到高查看学生信息----------\n");
printf("6.----------以学号从高到低查看学生信息----------\n");
printf("7.----------退出--------------------------------\n");
struct student s[3];
int n;
printf("input a num:");
scanf("%d",&n);
while(n != 7)
{
printf("1.----------录入学生信息------------------------\n");
printf("2.----------打印学生信息------------------------\n");
printf("3.----------查看分数最高的学生信息--------------\n");
printf("4.----------以分数从高到低查看学生信息----------\n");
printf("5.----------以分数从低到高查看学生信息----------\n");
printf("6.----------以学号从高到低查看学生信息----------\n");
printf("7.----------退出--------------------------------\n");
printf("input a num:");
scanf("%d",&n);
switch(n)
{
case 1:
inputStuinfo(s,3);
break;
case 2:
outputStuinfo(s,3);
break;
case 3:
printfTopOne(s,3);
break;
case 4:
{
qsort(s,3,sizeof(struct student),compar2);
outputStuinfo(s,3);
}
break;
case 5:
{
qsort(s,3,sizeof(struct student),compar1);
outputStuinfo(s,3);
}
break;
case 6:
{
qsort(s,3,sizeof(struct student),comparsno);
outputStuinfo(s,3);
}
break;
case 7:
goto quit;
}
}
quit:
return 0;
}
标签:const,struct,int,void,student,printf,共用,结构
From: https://blog.csdn.net/m0_73777617/article/details/141071117