结构体与共用体

目录

结构体

类型:

定义:

初始化:

结构体的定义形式:

qsort排序函数:

共用体定义(与结构体定义一样):

共用体含义:

对比结构体:

结构体实现学生管理系统:


结构体

类型:

用来描述复杂数据的一种数据类型

构造类型(用户自定义)

定义:

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;
}

  • 11
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值