当前位置: 代码迷 >> 综合 >> 嵌入式开发第9天(结构体,枚举,共同体,typedef)
  详细解决方案

嵌入式开发第9天(结构体,枚举,共同体,typedef)

热度:91   发布时间:2023-12-12 13:08:19.0
复合数据类型
自定义类型,由基本的类型构成

结构体


结构体类型定义
struct 名字{
基本的类型;


};


结构体的大小是怎么算出来的?

struct student_info
{
char name[19]; //19       
char sex;       //1        
char number[21];//21  
short hight;  //高度2  
int age;        //4    
int  weight; //4     
};

以结构体内最大的数据类型为宽度(doble虽然是8但依旧以4位的宽度存储,要了两层)

所以先存19位

然后添加1位sex

补平  4*5的宽度再填21位

但空出3位才补平

因为short为2 所以填上

空一位,因为int的宽度为4,不可能塞进去,

所以另开一行。所以一共是 52~






结构体的使用
有这么一个结构体struct student_info类型


初始化方法1
struct student_info zhangsan = {"zhangsan",'m',"007",1.41,22,70};
struct student_info lisi     = {"lisi",'w',"008",180,22,50}; 


初始化方法2

struct student_info zhangsan = {

.name = "zhangsan",

.sex = 'm',.number = "007",

.hight = 1.41,

.age = 22,

.weight = 70};

struct student_info lisi   = {

.name="lisi",

.sex='w',

.number ="008",

.hight = 180,

.age = 22,

.weight = 50}; 


初始化方法3


逐个赋值
zhangsan.age = 22;
zhangsan.sex = 'm';
strcpy(zhangsan.name,"zhangsan");  //对于字符串,同仁方法要为strcpy方法


赋值方法4

从输入端获取信息。

char[20={0};

printf("please input student name:\n");
bzero(array,20);
fgets(array,20,stdin);
        
strcpy(wangwu.name,array);




1、初始化学生信息(四个同学),信息包括(姓名,年龄,学号,性别,身高,体重,高数成绩math,C语言成绩,物理成绩phy。要求至少两种方法,至少有两个同学信息手动输入




struct student_info *wan
定义指针对象里,切记用malloc分配空间
wan = malloc(sizeof(struct student_info));
指向对象的成员 
指针->成员    wan->age;




2、枚举(据说是阉割过的东西,本义是限制范围,但我现在还不知他该用在什么地方

enum 名字(可自己定义)

成员;


举个粟子:

enum week
{
Monday,      //默认是0
Tuesday,      //1
Wednesday,//2
Thursday,//3
Friday,//4
Saturda,//5
Sunday//6
};

枚举变量的默认值从0开始,往后第一个成员逐个加1


int main(void)
{
enum week week_day;

week_day = 0;


switch(week_day)
{


case 0:


printf("Today is Monday!\n");

break;



case 1:

printf("Today is Tuesday!\n");

break
;

case 2:

printf("Today is Wednesday!\n");

break;



case 3:

printf("Today is Thursday!\n");

break;


case 4:

printf("Today is Friday!\n");


break;



case 5:

printf("Today is Saturday!\n");


break;




case 6:

printf("Today is Sunday!\n");


break;

default:
printf("can't find the day!\n");
break;


}


}

联合体
union 名字(可以自定义)

成员;
int a;
double b;
char c;
};


联合体所占的字节数为字节数最大的那个值,赋值的变量值会覆盖之前变量的值




===============================================================================
如判断当前系统处理器是大端还是小端
所谓大小端
指的是CPU本身对数据的存储方式
大端:高位数据放在低位地址
小端:高位数据放在高位地址

采用0x12345678来验证当前系统是大端还是小端

思路:
在一个int 地址里传入一个数据0x1234678
读该基地址上的一个字节。  char
如果值是12,就是大端。
如果值是78,就是小端。

使用union,里面定义一个int 一个char ,对int赋值,,获取char的值,12 就是大端

int main(int argc,char **argv)
{
 int i;
i=1;
char *p=(char *)&i;
if(*p==1)
printf("small")
return 0;
}

==========================================================


typedef  取别字的关键字


typedef 已知类型(系统定义) 自定义类型
typedef int  my_int;//my_int 代替了int 类型
typedef char* char_p; 
typedef struct student
{




}*people;


可移植


typedef int   u32;
typedef short u16;
typedef char  u8;




1、建立一个包含有10同学基本信息的“列表”,采用指针方式去完成
基本信息包括:学号(1~99),姓名,性别,电话,QQ
要求:学号是随机数 []





2、输入一个日期(年,月,日),使用结构体,判断是在本年的哪一天(注意闰年)




3、选作:把1中的列表,按学号从大到小排列