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

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 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值