• 学习C语言 8.10 枚举、位运算、指针函数


    目录

    一、枚举

    1.枚举

    2.语法

     3.typedef

    二、位运算

    1.与运算    

    2.或运算

    3.取反

    4.异或

    5.<<  左移 

    6.>>  右移

    三、指针函数

    1.指针函数

    2.堆 


    一、枚举

    1.枚举

    "枚举" 是指将变量的值一一列举出来,变量的值只限于列举出来的值的范围内。

    作用:
        1.为了提高代码可读性 
        2.提高代码的安全性

    2.语法

    枚举类型:
        enum 枚举名
        {
           列举各种值  //枚举元素//枚举常量
        };
        
        注意:
            列举各种值,之间用逗号隔开,不需要写类型名 
        eg:
        enum fire 
        {
          LITTLE_FIRE,
          MIDDILE_FIRE, 
          LARGE_FIRE, 
        }; //表示 定义了一种 枚举类型 


        注意:
        (1). 枚举中逐个列举的值,默认是从0开始  
           如果有给定的值,则后续没有给值的 枚举元素 依次 加1 
        (2). 枚举类型的 本质 实际是一个int类型的数据 
        (3). 枚举类型的变量 与 整型类型的变量通用的 
        (4). 与 宏定义对比  
           区别:
               使用阶段不同 --- 宏定义 --- 预处理阶段 
                                枚举   --- 编译阶段 要检查语法 
                                           运行阶段 参与代码运行 
               可读性 
                     都提高了可读性 
                     枚举,更能说明有相关性的一些值间关系

    从键盘输入 1~7打印对应的星期英文

    1. #include
    2. enum week
    3. {
    4. MON = 1,
    5. TUE,
    6. WED,
    7. THU,
    8. FIR,
    9. SAT,
    10. SUN,
    11. };
    12. int main(void)
    13. {
    14. int n=0;
    15. scanf("%d",&n);
    16. switch(n)
    17. {
    18. case MON:
    19. printf("Monday\n");
    20. break;
    21. case TUE:
    22. printf("Tuesday\n");
    23. break;
    24. case WED:
    25. printf("Wednesday\n");
    26. break;
    27. case THU:
    28. printf("Thursday\n");
    29. break;
    30. case FIR:
    31. printf("Firday\n");
    32. break;
    33. case SAT:
    34. printf("Saturday\n");
    35. break;
    36. case SUN:
    37. printf("Sunday\n");
    38. break;
    39. }
    40. return 0;
    41. }

     3.typedef

    typedef  //type define  
                 //本意 不是定义类型 
                //给类型起别名(是已有的类型)

    struct student 
    {
    };//结构体类型

    typedef struct student stu_t;

    //此时stu_t相当于struct student这个结构体类型的别名,可以用它来定义变量

    stu_t s1;

    二、位运算

    位运算:  可以直接操作二进制位

    注意:浮点数不能做位运算

    1.与运算    

    &  与运算(之前的&&与运算是逻辑运算,这个&与运算是位运算)  
        运算规则:一假则假    
      eg:
          1010 1010     // 0xaa 
          0011 0011 &  // 0x33 
          -----------------
          0010 0010     //0x22

    应用:清零

    最高位清零

    1. #include
    2. int main(int argc, const char *argv[])
    3. {
    4. unsigned char ch1=0xff;
    5. //printf("ch1 & 0x7f = %#x\n", ch1&0x7f);
    6. printf("ch1 = %#x\n",ch1&~(1<<7));//清零
    7. return 0;
    8. }

    通过左移可以避免想一个数来进行&运算

    2.或运算

    |  或运算                
       运算规则:一真则真 
    eg:
          1010 1010     // 0xaa 
          0011 0011  |   // 0x33 
          ------------------
          1011 1011      //0xbb 

    应用:置1

    最高位置1

    1. #include
    2. int main(int argc, const char *argv[])
    3. {
    4. unsigned char ch2=0x00;
    5. //printf("ch2 | 0x80 = %#x\n",ch2 |0x80);
    6. printf("ch2 = %#x\n",ch2 | 1<<7);//置1
    7. return 0;
    8. }

    3.取反

    ~ 取反
       运算规则:真假相对 
    eg:  
       ~0xaa 
         1010 1010   // 0xaa 
         0101 0101   //0x55

    4.异或

    ^ 异或 
      运算规则:相同为 0,不同为 1

    eg: 
      1010 1010     // 0xaa 
      0011 0011 ^   // 0x33 
      ----------------
      1001 1001     //0x99

    应用:加密,交换 

    使用中间量交换两个数:
      int temp;
      temp = a;
      a = b;
      b = temp;

    不使用中间量交换两个数
      a = a + b; // 
      b = a - b; //b = a(原来的a)
      a = a - b; //
      
      a = a ^ b;
      b = a ^ b;
      a = a ^ b;

    5.<<  左移 

    写法:
      a<


            左移1位  相当于乘 2 
            0000 0001 //1
            0000 0010 //2
            注:
               最低位 补0 

    6.>>  右移

    写法:
      a>>n   //表示将 a这个数据 右移 n位 

            右移1位  相当于除 2    

      算术右移 
              //看符号位 看数据类型 
              如果是有符号类型的数据,右移时,最高位补的是符号位 
              如果是无符号类型的数据,右移时,最高位补的0 

    1. #include
    2. int main(int argc, const char *argv[])
    3. {
    4. int b=0xffffffff;
    5. int i=0;
    6. for(i=0;i<16;++i)
    7. {
    8. b=b&~(1<<(2*i));//偶数位清零
    9. }
    10. printf("b=%#x\n",b);
    11. return 0;
    12. }
    1. #include
    2. int main(int argc, const char *argv[])
    3. {
    4. int m=0x00;
    5. int i=0;
    6. for(i=1;i<17;++i)
    7. {
    8. m=m | (1<<(2*i-1));//奇数位置1
    9. }
    10. printf("m=%#x\n",m);
    11. return 0;
    12. }

    统计int类型数据中1的个数

    1. #include
    2. int main(int argc, const char *argv[])
    3. {
    4. int n=121314;
    5. printf("n=%#x\n",n);
    6. int i=0
    7. int flag=0;
    8. for(i=0;i<32;++i)
    9. {
    10. if(n & (1<//非0即为真
    11. {
    12. flag++;
    13. }
    14. }
    15. printf("flag = %d\n",flag);
    16. return 0;
    17. }

    实现一个循环左移,将移出去的数补到最后。

    思路:判断最高位是否为1,如果为1,左移之后在最低位置1;如果为0,直接左移即可,因为最低位本身就补0。

    1. #include
    2. int main(void)
    3. {
    4. int n=0xf0000001;
    5. printf("before n=%#x\n",n);
    6. int i=0;
    7. for(i=0;i<1;++i)
    8. {
    9. if((n&0x80000000)!=0)
    10. {
    11. n=n<<1;
    12. n=n|1;
    13. }
    14. else
    15. {
    16. n=n<<1;
    17. }
    18. }
    19. printf("after n=%#x\n",n);
    20. return 0;
    21. }

    三、指针函数

    1.指针函数

    指针函数:返回值为指针类型的函数    
      eg:char *strcpy(char *dest,const char *src);

    函数指针:指向函数类型的指针  //基类型为函数类型的指针 

    2.堆 

    堆的特点是手动申请,手动释放。

    堆上的空间用malloc开辟: 
       void *malloc(size_t size); 
       
       参数:
           size //表示申请的空间的大小,单位字节 
      返回值:
          成功 返回 申请到内存空间的地址
          失败 返回 NULL

    //释放函数 
       void free(void *ptr);
       释放之前申请的堆上的空间 
       参数:
           ptr 一定是之前申请到堆上空间的地址 
         
         free释放后的空间 
         1.一般不再使用 
         2.指向这块空间的指针变成野指针 
         3.free之后对应空间上的内容也不要使用 
         
      注意:
         1. malloc和free成对出现 
         2. free只是释放了空间 --- 表示这块空间 又自由了 
            但是 这块空间上的数据 并不会清零
         3. 不要多次free

    定义整型一维数组 5个元素,数组放在堆上,给5个值,打印输出 

    1. #include
    2. #include //使用malloc注意加上此头文件
    3. int main(int argc, const char *argv[])
    4. {
    5. int *p=malloc(20);
    6. int i=0;
    7. for(i=0;i<5;++i)
    8. {
    9. *(p+i)=i+1;
    10. }
    11. for(i=0;i<5;++i)
    12. {
    13. printf("%d ",*(p+i));
    14. }
    15. putchar('\n');
    16. free(p);
    17. return 0;
    18. }
  • 相关阅读:
    HyperLynx(十八)DDR(一)DDR简介和DDR的数据仿真
    STL中sort 用的是快排吗? - 快排、堆排(heap sort)、插入排序
    c++ primer中文版第五版作业第十一章
    ODrive移植keil(七)—— 插值算法和偏置校准
    superset连接Apache Spark SQL(hive)过程中的各种报错解决
    [oeasy]python0019_ 打包和解包_struct_pack_unpack
    【31】c++设计模式——>模板方法模式
    gorm中的关联操作详解
    使用Barrier共享鼠标键盘,通过macos控制ubuntu系统
    Word控件Spire.Doc 【加密解密】教程(四):在 C# 中为 Word 添加数字签名
  • 原文地址:https://blog.csdn.net/Ld1626162003/article/details/141097600