C語言學習第11篇---union enum, sizeof, typedef 分析

      網友投稿 1071 2022-05-30

      知識來源主要是陳正沖老師的《C語言深度解剖》及Delphi Tang老師的《C語言剖析》,有興趣的朋友可以看我置頂文章獲取

      union相關總結

      定義聯合體

      uniontest

      {

      intoffice;

      charteacher[5];

      };

      uniontestb;

      從這可以看出來,聯合體內存是共享的,也就是只看那部分占用內存最大則聯合體占用就是該內存

      相應的缺點就是操作office就會改變teacher的前四個字節的值

      根據這個特性,可以有一個妙用!

      uniontest

      {

      unsignedcharODR;

      struct

      {

      unsignedcharbit0:1,

      bit1:1,

      bit2:1,

      bit3:1,

      bit4:1,

      bit5:1,

      C語言學習第11篇---union enum, sizeof, typedef 分析

      bit6:1,

      bit7:1;

      };

      };

      uniontestc;

      這里聯合體有兩個成員,一個char ODR,還有一個8位的結構體,因為內存共享,這么著操作后邊的結構體就可以改變ODR

      例如c.ODR = 0XFF,或者c.bit0 = 1:

      這就可以對ODR進行每一位進行賦值了

      第二個作用就是節約內存,在內存比較小的單片機內經常使用

      在STM8里定義

      uint8_t flag1=0;

      uint8_t flag2=0;

      uint8_t flag3=0;

      …………

      這么每一個flag會占用一個字節的ram空間

      要是使用union會節約空間

      union uflag

      {

      unsignedcharflag;

      struct

      {

      unsignedcharflag0:1,

      flag1:1,

      flag2:1,

      flag3:1,

      flag4:1,

      flag5:1,

      flag6:1,

      flag7:1;

      };

      };

      union uflag flg;

      這么每個flag占用1bit,8個才占一個字節

      union的三種說明方式,基本與結構體一樣

      1、

      uniontest

      {

      intnum;

      charstudent[4];

      };

      union?testa,b;? ? //

      2、

      uniontest

      {

      intnum;

      charstudent[4];

      }a,b;? ? ? ? ? ? ? ? //

      3、

      union

      {

      intnum;

      charstudent[4];

      }a,b;? ? ? ? ? ? ? ?//

      enum : 枚舉

      是C語言中的一種自定義類型

      值是可以根據需要自己定義的整型值

      第一個定義的enum值默認是0

      默認情況下的enum值是在前一個定義值得基礎上加1

      enum類型的變量只能取定義時的離散值

      enum中定義的值是C語言中真正意義上的常量

      在工程中enum多用于定義整型常量

      實驗一:enum的使用

      #include

      enum

      {

      ARRAY_SIZE = 10

      };

      enum Color

      {

      RED = 0x00FF0000,

      GREEN = 0x0000FF00,

      BLUE = 0x000000FF

      };

      void PrintColor(enum Color c)

      {

      switch( c )

      {

      case RED:

      printf("Color: RED (0x%08X)\n", c);

      break;

      case GREEN:

      printf("Color: GREEN (0x%08X)\n", c);

      break;

      case BLUE:

      printf("Color: BLUE(0x%08X)\n", c);

      break;

      }

      }

      void InitArray(int array[])

      {

      int i = 0;

      for(i=0; i

      {

      array[i] = i + 1;

      }

      }

      void PrintArray(int array[])

      {

      int i = 0;

      for(i=0; i

      {

      printf("%d\n", array[i]);

      }

      }

      int main()

      {

      enum Color c = GREEN;

      int array[ARRAY_SIZE] = {0};

      PrintColor(c);

      InitArray(array);

      PrintArray(array);

      return 0;

      }

      sizeof :

      sizeof是編譯器的內置指示符

      sizeof用于計算類型或變量所占的內存大小

      sizeof的值在編譯器就已經確定

      用于類型:? sizeof(type)

      用于變量: sizeof(var)或sizeof var

      注意:

      sizeof 是C語言的內置關鍵字而不是函數

      - 在編譯過程中所有的sizeof將被具有的數值所替換

      - 程序的執行過程與sizeof沒有任何關系

      實驗2:sizeof的本質

      #include

      int f()

      {

      printf("Delphi Tang\n");

      return 0;

      }

      int main()

      {

      int var = 0;

      int size = sizeof(var++);

      printf("var = %d, size = %d\n", var, size);

      size = sizeof(f());

      printf("size = %d\n", size);

      return 0;

      }

      typedef:面試的時候可能被問到哦

      用于給一個已經存在的數據類型重命名

      本質上不能產生新的類型

      重命名的類型:

      - 可以在type語句之后定義

      - 不能被unsigned 和 signed 修飾

      typedef type new_name

      實驗3:typedef使用實例

      #include

      typedef int Int32;

      struct _tag_point

      {

      int x;

      int y;

      };

      typedef struct _tag_point Point;

      typedef struct

      {

      int length;

      int array[];

      } SoftArray;

      typedef struct _tag_list_node ListNode;

      struct _tag_list_node

      {

      ListNode* next;

      };

      int main()

      {

      Int32 i = -100; // int

      //unsigned Int32 ii = 0;

      Point p; // struct _tag_point

      SoftArray* sa = NULL;

      ListNode* node = NULL; // struct _tag_list_node*

      return 0;

      }

      小結:

      enum用于定義離散值類型

      enum定義的值是真正意義上的常量

      sizeof是編譯器的內置指示符

      sizeof不參與程序的執行過程

      typedef用于給類型重命名

      - 重命名的類型可以在typedef語句之后定義

      C 語言

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:交換機的堆疊技術
      下一篇:Verilog初級教程(18)Verilog中的函數與任務
      相關文章
      亚洲综合久久成人69| 久久影视国产亚洲| 亚洲成a人片77777kkkk| 国产亚洲精品美女| 亚洲成?Ⅴ人在线观看无码| MM1313亚洲国产精品| 亚洲精品精华液一区二区| 亚洲JIZZJIZZ妇女| 亚洲日本VA午夜在线电影| 中文字幕乱码亚洲无线三区| 亚洲伊人久久大香线蕉AV| 国产精品亚洲精品观看不卡| 亚洲熟女乱色一区二区三区 | 亚洲色大网站WWW永久网站| 亚洲国产成人综合| 亚洲国产系列一区二区三区| 亚洲日韩精品国产3区| 亚洲av日韩专区在线观看| 亚洲AV蜜桃永久无码精品| 中文字幕第13亚洲另类| 亚洲精品夜夜夜妓女网| 亚洲va中文字幕无码久久不卡| 亚洲国产精品自在在线观看| 久久亚洲私人国产精品vA| 亚洲日韩在线视频| 亚洲午夜理论片在线观看| 久久精品国产亚洲AV| 亚洲日韩在线中文字幕第一页| 久久亚洲av无码精品浪潮| 亚洲成亚洲乱码一二三四区软件| 亚洲人成电影福利在线播放| 亚洲成人黄色在线观看| 亚洲性色精品一区二区在线| 国产亚洲福利一区二区免费看| 精品国产香蕉伊思人在线在线亚洲一区二区 | 久久夜色精品国产噜噜亚洲AV| 亚洲成人福利网站| 亚洲国产精品无码中文lv| 亚洲国产av无码精品| 精品国产综合成人亚洲区| 亚洲精品91在线|