嵌入式学习笔记十六——C语言结构体

结构体

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值