首页 > 其他分享 >自学嵌入式第十七天:共用体和位运算

自学嵌入式第十七天:共用体和位运算

时间:2024-08-12 22:24:32浏览次数:7  
标签:int void 第十七 --- 体和位 枚举 FIRE 类型 嵌入式

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]) //)
         }
    }

    //----------------------------------------------------------------------------
    
 
    int n;
    switch (n)
    {
       case 1:  
             //1 录入学生信息 
             break;
        ....     
    }
总结:
1.理解结构体概念及用途 
2.使用方法 
  a.自己构造出这个结构体类型
  b.有了类型
    定义变量
    定义数组
    定义指针
    做函数形参   //结构体类型指针 
    做函数返回值
3.考点 
  结构体类型的大小计算 
  1. 内存对齐 
  2. 为什么要内存对齐 
-------------------------------------------------
共用体:
   union  //
   
语法:
  union 共用体名
  {
     成员变量;
  };
   
   
eg:
  union demo
  {
     char a;
     short b;
     int c;
  };
  
  共用体:
       共用了一块内存空间 
       公用了最大成员的空间 
       
  注意:
  1.共用体初始化时,只能给一个值,默认时给到第一个成员的。
  2.共用体变量中的值,取决与最后一次给到的值,还要看能影响几个字节。
  
  对比 结构体
  1.结构体中各个成员 拥有自己独立空间
  2.共用体中,成员共用一块空间
  
  
  
  struct stu
  {
     ...
     float score;
  };
  
  struct teacher
  {
     ...
     float salary;
  };
  
  struct member
  {
     int no; 
     char name[]
     ...
     union
     {
       float score;
       float salary;       
     }d;
     
  };
  
  


枚举:
     枚举    //一个一个列举出来  
     "枚举" 是指将变量的值一一列举出来,变量的值只限于列举出来的值的范围内。
    
作用:
    1.为了提高代码可读性 
    2.提高代码的安全性 
    
    

    小火
    中火 
    大火 
    #define LITTLE_FIRE  1 
    #define MIDDILE_FIRE 2 
    #define LARGE_FIRE   3
    
    main()
    {
       //
       int n;
       scanf("%d",&n);
       switch(n)
       {
          //case 1:
          case LITTLE_FIRE: 
              printf("---little fire!---\n");
              break;
         // case 2:
         case MIDDILE_FIRE: 
              printf("---middile fire!---\n"); 
              break; 
         //case 3:
         case LARGE_FIRE:
              printf("---large fire!---\n"); 
              break;
        
       }
    }
    
    
    枚举类型:  //
    
    enum 枚举名
    {
       列举各种值  //枚举元素//枚举常量
    };
    
    注意:
        列举各种值,之间用逗号隔开,不需要写类型名 
    
    eg:
    enum fire 
    {
      LITTLE_FIRE,
      MIDDILE_FIRE, 
      LARGE_FIRE, 
    }; 
     
    
    注:
    1. 表示 定义了一种 枚举类型 
    2. 枚举中逐个列举的值,默认是从0开始  
       如果有给定的值,则后续没有给值的 枚举元素 依次 加1 
    3. 枚举类型的 本质 实际是一个int类型的数据 
    4. 枚举类型的变量 与 整型类型的变量通用的 
    5. 与 宏定义对比  
       区别:
           使用阶段不同 --- 宏定义 --- 预处理阶段 
                            枚举   --- 编译阶段 要检查语法 
                                       运行阶段 参与代码运行 
           可读性 
                 都提高了可读性 
                 枚举,更能说明有相关性的一些值间关系 
                 
 

   typedef  //type define  
            //本意 不是定义类型 
            //给类型起别名 
            
   
   int a; //定义了一个int型变量a 
   
   typedef int a; // 此时 a是 int类型的一个别名 
   
   
   
   struct stu 
   {
      
   };
   
   
   struct stu s;
   
   typedef struct stu stu_t; 
   
   
   stu_t s1; //
   
   //---------------------------------------- 
    typedef void (*sighandler_t)(int);
    //sighandler_t ==>void (*)(int)
    sighandler_t signal(int signum, sighandler_t handler);

    void (*)(int) signal(int signum, void (*)(int) handler);  
   void (*signal(int signum, void (*handler)(int) ))(int) ;
   
 ------------------------------------------------------------
 位运算:  //c语言特点 
       可以直接操作二进制位 
       
     
     
&  与运算  --- 位运算中    //清0  
   运算规则:
      一假则假    
  eg:
      0xaa 
      1010 1010 
      0011 0011 &
      ---------
      0010 0010 0x22 
|  或运算                 //置1 
    运算规则:
      一真则真 
         
   
      1010 1010   // 0xaa 
      0011 0011 & // 0x33 
      ---------
      1011 1011  //0xbb 
~ 取反
   运算规则:
     真假相对 
     
   ~0xaa 
     1010 1010   // 0xaa 
     0101 0101   //0x55
     
^ 异或 
  运算规则:
  相同为 0
  不同为 1 
  1010 1010   // 0xaa 
  0011 0011 ^ // 0x33 
  ---------
  1001 1001 //0x99
  
  
  加密 
  交换 
  
  
  
  int t;
  t = a;
  a = b;
  b = t;
  
  a = a + b; // 
  b = a - b; //b = a
  a = a - b; //
  
  a = a ^ b;
  b = a ^ b;
  a = a ^ b;
  
  
注意:
   1.浮点数不能做位运算
 
<<  左移 

写法:
  a<<n  //表示将 a这个数据 左移 n位 
        
        0000 0001 
        左移1位  相当于乘 2 
        0000 0001 
        0000 0010
        注:
           最低位 补0 
  
>>  右移
  
  a>>n   //表示将 a这个数据 右移 n位 
          0000 0001 
        右移1位  相当于除 2    
  1000     
  1100    
  
  算术右移 
          //看符号位 看数据类型 
          如果是有符号类型的数据,右移时,最高位补的是符号位 
         
           如果是无符号类型的数据,右移时,最高位补的0 
          
       

函数指针 指向函数类型的指针  //基类型为函数类型的指针 
指针函数 返回值为指针类型的函数    
  char *strcpy(char *dest,const char *src);
 
堆上的空间: 
   void *malloc(size_t size); 
   功能: 
       在堆上开辟一块空间 
   参数:
       size //表示申请的空间的大小,单位字节 
  返回值:
      成功 返回 申请到内存空间的地址
      失败 返回 NULL
   
   //释放函数 
   void free(void *ptr);
   释放之前申请的堆上的空间 
   参数:
       ptr 一定是之前申请到堆上空间的地址 
     
     free释放后的空间 
     1.一般不再使用 
     2.指向这块空间的指针 --- 是个野指针 
     3.free之后对应空间上的内容 ---也不要使用 
     
  注意:
     1. 成对出现 
     2. free只是释放了空间 --- 表示这块空间 又自由了 
        但是 这块空间上的数据 并不会清零
     3. 不要多次free 

标签:int,void,第十七,---,体和位,枚举,FIRE,类型,嵌入式
From: https://blog.csdn.net/2302_78620228/article/details/141143228

相关文章

  • 重头开始嵌入式第十八天(Linux系统编程 文件IO)
    Linux系统编程内容Linux系统编程涵盖了众多方面的知识和技术: 1. 文件I/O操作:包括打开、读取、写入、关闭文件,以及处理文件的权限、属性等。2. 进程管理:创建新进程、进程的终止、等待进程结束、进程的执行状态控制等。3. 信号处理:接收和处理系统发送的各种信号,以响......
  • 【嵌入式linux开发】旭日x3派部署自己训练的yolov5模型(安全帽识别、视频流推理、yolov
    旭日x3派部署自己训练的模型(安全帽识别、视频流推理、yolov5-6.2)windows,框架pytorch,python3.7效果模型训练模型转换1、pt模型文件转onnx2、检查onnx模型3、准备校准数据4、onnx转bin上板视频流推理1、图片推理2、视频流推理效果模型训练进官网可克隆yolov5......
  • 嵌入式人工智能ESP32(4-PWM呼吸灯)
    1、PWM基本原理PWM(Pulse-widthmodulation)是脉冲宽度调制的缩写。脉冲宽度调制是一种模拟信号电平数字编码方法。脉冲宽度调制PWM是通过将有效的电信号分散成离散形式从而来降低电信号所传递的平均功率的一种方式。所以根据面积等效法则,可以通过对改变脉冲的时间宽度,来等效的......
  • 痞子衡嵌入式:探析i.MXRT1050在GPIO上增加RC延时电路后导致边沿中断误触发问题(上篇)
    大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是i.MXRT1050在GPIO上增加RC延时电路后导致边沿中断误触发问题探析。前段时间有一个RT1052客户反馈了一个有趣的问题,他们设计得是一个带LCD屏交互的应用,应用以官方SDK里的lvgl_demo_widgets_bm例程......
  • 【嵌入式DIY实例-ESP32篇】-物联网实时电池电流和功率监控
    物联网实时电池电流和功率监控文章目录物联网实时电池电流和功率监控1、硬件准备与接线:2、代码实现3、运行结果锂离子电池是消费电子产品中最受欢迎的电池。然而,无论是新手还是经验丰富的工程师和爱好者,在选择适合他们项目的电池时都会面临问题。一个主要问......
  • 嵌入式初学-C语言-二十
    通过指针引用数组数组元素的指针数组指针:        数组中第一个元素的地址,也就是数组的首地址指针数组:        用来存放数组元素地址的数组,称之为指针数组//定义一个一般数组inta[]={1,4,9};//使用指针变量存储数组的第一个元素的首地址,也就是......
  • 嵌入式硬件操作接口实现分享
    一、前言以STM32为例,打开网络上下载的例程或者是购买开发板自带的例程,都会发现应用层中会有stm32f10x.h或者stm32f10x_gpio.h,这些文件严格来时属于硬件层的,如果软件层出现这些文件会显得很乱。使用过Linux的童鞋们肯定知道linux系统无法直接操作硬件层,打开linux或者rt_threa......
  • 嵌入式初学-C语言-十九
    指针的引入为函数修改实参提供支持为动态内存管理提供支持为动态数据及结构提供支持为内存访问提供另一种途径指针的概述内存地址:系统为了内存管理的方便将内存划分为一个个内存单元(一个内存单元占一个字节),并为每一个内存单元进行了编号,内存单元的编号称为该内存单元的地址......
  • 【迅为电子】IMX6ULL开发板嵌入式linux开发指南第七章 Linux 常用命令第一部分
        物联网时代,各种传感器的采集和处理技术是需要我们掌握的,迅为IMX6ULL开发板标配了各种传感器设备,包括陀螺仪、重力加速度计和光传感器、红外接收、EEPROM存储,也可以选配温湿度传感器,其他如摄像头(含CMOS和USB两种)、VGA显示、GPS定位功能、RFID门禁、继电器输出、步进电......
  • 嵌入式初学-C语言-十八
    #接嵌入式初学-C语言-十七#变量的生命周期1.概念:变量在程序运行中存在的时间2.根据变量存在的时间不同,变量可分为静态存储和动态存储 3. 变量的存储类型变量的完整定义格式:[存储类型]数据类型变量列表;  4.存储类型auto:存储类型只能修饰局部变量,被修饰的局......