结构体 共用体 枚举 位运算

结构体类型 ---- 用来描述复杂数据的一种数据类型

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.共用体中,成员共用一块空间
 

考点:
   用共用体 判断大小端

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值