玳瑁的嵌入式日记D15-0808(C语言)

结构体

int score[30];
char name[30][20];
float height[30];
... 

结构体:
   提供给用户(程序员)
   自定义一种数据类型 --程序员根据问题的需要,自己来组织一种数据类型 
   可以描述现实生活中一些 用基本数据类型不好描述的 场景 
   结构体,可以把不同类型的数据集合在一起 


语法:
struct 结构体名
{
  //成员变量 --- 各个成员变量之间用; 隔开 
}; //有 分号 

   

eg.//定义了一个学生的结构体类型    
struct student 
{
    int sno;
    char name[20];
    float score; 
    char sex;
};   //这表示构造一个 数据类型 

int 
float 
short 


//使用结构体的思路:
                            int --定义--->变量/指针/数组/函数形参/函数返回值类型 
自己先构造出结构体类型 --->有了类型--->变量/指针/数组/函数形参/函数返回值类型

结构体变量的使用

.  //结构体成员运算符 
用法:
    结构体变量名.结构体成员变量名 
                        //表示访问到结构体的成员 
    
注意:
  1.结构体初始化 
    按照成员变量顺序依次初始化 
     成员变量 本身的方式初始化
  2.赋值 
    相同类型的结构体变量 之间可以相互赋值 
    给结构体成员变量赋值 ,按照成员变量本身的方式赋值 
    输入也是 员变量本身的方式输入 
       
结构体可以做函数的形参
                          //结构体类型的变量 (不推荐)
                          //结构体类型的指针 (推荐)

-> 指向结构体成员运算符 
用法:
     结构体指针->结构体成员变量名 
  
.  //结构体成员运算符 
用法:
    结构体变量名.结构体成员变量名 
    //表示访问到结构体的成员 
练习:
   封装要给输入函数,实现对结构体数组的输入 


练习:
   找出成绩最高的学生 打印他的信息 


练习:
   qsort
    void qsort(void *base, size_t nmemb, size_t size,int (*compar)(const void *, const void *));

功能:
        排序一个数组 
    参数:
      @base    数组起始位置
      @nmemb   数组中元素的个数 
      @size    单个元素的大小
      @compar  表示排序的依据 
                                          反应数组中两个元素之间大小关系     

//比较规则的回调函数 
 int compar(const void *a, const void *b)
 {
    ....
    说明这两个元素之间的大小关系 
    >
    <
    ==
    
    return  >0 ==0 <0
 }
 
 a 和 b 表示 是某两个数组元素的地址 

结构体对齐

问题:
  你知道结构体对齐吗?
  计算结构体大小吗? 
  为什么要对齐?
  
  内存对齐 


考点:
           32位 --- 数据总线 和 地址总线 

要求:
    内存对齐 
      1. 对于基本类型的数据 
                                               尽可能把数据放自然边界对齐

 结构体对齐:
    1. 成员变量,都放在自然边界对齐  
    2. 整个结构体,按照成员变量中最大来对齐
    补充:
       共用体的大小 得是 被最大的成员变量大小整除 

判断小端

上图结构体所占字节为12字节

1.共用体中最长str[6],为6字节,但要满足int 类型(4字节)的整除边界条件,则共用体占8字节;

2.结构体中int占4字节;

所以整体占12字节;

结构体定义形式


//形式1 
struct demo
{  
  .... 
}; //1.定义结构体类型

struct demo d; //2.定义变量 

//形式2 
struct demo
{  
  .... 
}d={初始化}; //1.定义结构体类型  //2.定义变量 

//形式3  ----如果你的结构体类型只用一次 
struct 
{  
  .... 
}d={初始化}; //1.定义结构体类型  //2.定义变量                    
struct ????   

union

union demo
{
  char  a;
  short b;
  int   c;
};  


//共用体
共用体 a b c 公用同一块空间 

注意:
  1. 共用体 本身 使用的空间 只要得能放得下最大成员 
    共用体的大小?
  2. 共用体变量初始化,值默认给到第一个成员变量 
  3. 用共用体 检测电脑大小端 
  4. 共用体中 各个成员变量 起始地址相同 
  5. 共用体空间的数据,最终结果
     取决 一开始有什么 
     以及 最后一次给的是什么 

枚举

如果一个变量只有几种可能的值,则可以定义为枚举类型。
所谓"枚举"是指将变量的值一一列举出来,变量的值只限于列举出来的值的范围内。   

语法:
enum 枚举类型名
{
   枚举常量名1,
   枚举常量名2,
   枚举常量名3,
};

C语言中实现的时候,枚举按照int型处理的 --- 本质上看,就是一个int型数据 

//提高代码可读性 
//有类型 提高代码的语法检查

对比:
  #define  //预处理 -- 
           //文本原样替换  --- 不存在类型 
           //枚举有类型 -- 有更严格语法检测 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值