首页 > 其他分享 >结构体与共用体

结构体与共用体

时间:2024-08-09 23:28:32浏览次数:12  
标签:const struct int void student printf 共用 结构

目录

结构体

类型:

定义:

初始化:

结构体的定义形式:

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

标签:const,struct,int,void,student,printf,共用,结构
From: https://blog.csdn.net/m0_73777617/article/details/141071117

相关文章

  • 自定义类型:结构体
    文章目录结构体结构体定义和声明结构体的初始化和赋值对结构体类型名的优化结构体的自引用与嵌套结构体访问与操作匿名结构体结构体中的内存对齐(面试常考)计算结构体字节大小对齐规则为什么存在内存对齐?修改默认对齐数结构体传参结构体实现位段位段的内存分配位段跨平......
  • java流程控制之顺序结构
    java的基本结构就是顺序结构,除非特别指明,否则就按照顺序一句一句执行。顺序结构是最简单的算法结构。语句与语句之间,框与框之间是按照从上到下的顺序进行的,它是由若干个依次执行的处理步骤组成的,它是任何一种算法都离不开的一种基本算法结构由于我idea使用过期,目前还没......
  • C语言(五)-结构体
    C语言(五)-结构体1.结构体定义在编程的时候需要将不同的类型的数据组合成为一个整体,以便于引用。例如,一名学生有学号、姓名、性别、年龄、地址等属性,如果针对学生的学号、姓名、年龄等都单独定义一个变量,那么在有多名学生时,变量就难以分清。为此,C语言提供结构体来管理不同类......
  • 模板 - 数据结构
    链表定义structPeter{ intval; intnxt,pre;}node[M];intidx=0;初始化inlinevoidInit()//head:0;tail:n+1{ node[0]={0,n+1,0}; node[n+1]={0,n+1,0}; return;}在p后插入valinlinevoidinsert(intp,intval){ node[++idx]={val,node[p].nxt,p}; ......
  • 【数据结构】关于栈你必须知道的内部原理!!!
    前言:......
  • redis数据结构
    redis数据类型 stringlisthashsetzsetHyperLogLogGEOBloomFilter(布隆过滤器)HyperLogLog基本概念:Redis在2.8.9版本添加了HyperLogLog结构。RedisHyperLogLog是用来做基数统计的算法,所谓基数,也就是不重复的元素。优点在输入元素的数量或者体积非常......
  • 数据结构之二叉树的顺序存储结构与链式存储结构
    一、顺序存储结构1.定义与特点顺序存储结构是指用一组地址连续的存储单元依次自上而下、自左至右存储完全二叉树上的结点元素。完全二叉树和满二叉树采用顺序存储比较合适,因为它们的结点序号可以唯一地反映结点之间的逻辑关系,从而既能最大地节省存储空间,又能利用数组元......
  • 问题 K: 数据结构基础11-图的深度优先遍历
    题目描述读入一个邻接矩阵存储的无向图,输出它的深度优先遍历序列。  输入第1行1个整数n,表示图中的顶点数,2<=n<=100接下来的n行是一个n*n的邻接矩阵,a[i][j]=1表示顶点i和顶点j之间有直接边相连,a[i][j]=0表示没有直接边相连,保证i=k时a[i][j]=0,且a[i,j]=a[j,i].输出输......
  • 25版王道数据结构课后习题详细分析 第三章栈、队列和数组 3.1 栈 选择题部分
    一、单项选择题————————————————————————————————————————解析:栈和队列的逻辑结构都是相同的,都属于线性结构,只是它们对数据的运算不同。正确答案:B————————————————————————————————————......
  • 浙大数据结构慕课课后题(03-树2 List Leaves)
    题目要求:给定一棵树,您应该按照从上到下、从左到右的顺序列出所有叶子。输入规格: 每个输入文件都包含一个测试用例。对于每种情况,第一行都给出一个正整数N(<=10),这是树中节点的总数--因此节点的编号从0到N-1.然后N行紧随其后,每行对应一个节点,并给出节点的左右子节点......