1. 程式人生 > >c語言關鍵字-struct,union,enum及柔性數組

c語言關鍵字-struct,union,enum及柔性數組

alloc 圖片 union關鍵字 col != 這一 clu 多少 style

一、struct關鍵字與柔性數組

  • c語言中的struct可以看做變量的集合,struct中的每個數據成員都有獨立的存儲空間
  • 柔性數組:柔性數組在C99中也稱之為伸縮型數組,是C99的擴展,簡言之就是struct結構裏的標識占位符(不占用struct的空間),柔性數組的結構只能在堆上生成。
    • 聲明柔性數組的規則
      • 柔性數組成員必須為結構(struct)中的最後一個成員
      • 結構中至少有一個其他成員
      • 柔性數組就像普通數組一樣被聲明,除了它的方括號內為空
      •  1 struct softarry
         2 {
         3 int len;
         4 int arry[];
         5 };
         6 
         7 int main()
        
        8 { 9 printf("%d\n",sizeof(struct softarry)); 10 return 0; 11 } 12 13 輸出結果為4(默認在32位機器上)
        編譯器不為arry分配內存空間,因為也不知道arry有多大,只是用來當作一個標識符,以便以後可以通過這個標識符來訪問其中的內容。
    • 柔性數組的使用涉及到結構指針的使用,下邊以例子講解柔性指針的使用
      •  1 #include<stdio.h>
         2 #include<malloc.h>
         3 typedef struct softarry
         4 {
         5 int len;
         6 int arry;
        
        7 } my_softarry; 8 9 my_softarry* creat_softarry(int size) 10 { 11 my_softarry *ret=NULL; 12 if(size>0) 13 { 14 ret=(my_softarry*)malloc(sizeof(my_softarry)+sizeof(int)*size); 15 ret->len=size; 16 } 17 return ret; 18 } 19 20 void delete_softarry(my_softarry **sa) 21 { 22 free(*sa); 23 *sa=NULL;
        24 } 25 26 /*給柔性數組每個元素賦值*/ 27 void func(my_softarry *sa) 28 { 29 int i=0; 30 if(NULL!=sa) 31 { 32 for(i=0;i<sa->len;i++) 33 { 34 sa->arry[i]=i+1; 35 } 36 } 37 } 38 39 int main() 40 { 41 int i=0; 42 my_softarry*sa=creat_softarry(10);//初始化結構指針 43 fun(sa);//使用柔性數組 44 for(i=0;i<sa->len;i++) 45 { 46 printf("%d",sa->arry[i]); 47 delete_softarry(&sa);//釋放操作柔性數組的結構體指針 48 return 049 } 50 }

      • 這裏講解size=5的情況,malloc請求申請的堆空間應為sizeof(my_softarry)=4+sizeof(int)*size=4*5=20==>24
      • sizeof(my_sofyarry)得到的空間用於存放len,二sizeof(int)*size得到的空間用於存放柔性數組的內容,同時柔性數組的長度信息已由len指定。也就是說柔性數組在聲明時並不知道其具體大小,而是在使用時通過結構指針來動態指定的




二、union關鍵字

  1. union與struct比較
  • c語言中的union在語法上與struct相似。union是一種在同一存儲空間內存儲不同類型數據的數據類型。它主要被用來存儲某種既沒有規律事先也不知道順序的混合數據類型。
  • 不同的是union只分配最大成員的空間,所有成員共享這個空間
  •  1 struct A
     2 {
     3 int i;
     4 char c;
     5 }
     6  union B
     7 {
     8 int i;
     9 char c;
    10 }
    11 
    12 printf("%d%d",sizeof(struct A),sizeof(union B));
    13 
    14 輸出結果為:54

    因此union只分配最大成員空間,且所有成員共享這一空間。即共用同一個內存首地址,同時共用體的成員都可以對這份空間進行操作,操作也是共同生效。

  2.union系統大小端問題

  • 問題引出應用場景
    • 1 union C
      2 {
      3 int i;
      4 char c;
      5 }
      6 unio C c;
      7 c.i==1;
      8 printf("%d",c.c);
      9 此時輸出的值應該為多少
  • 大小端模式
    • 小端模式:低地址存儲低位數據
    • 大端模式:低地址存放高位數據
        • 技術分享圖片
        • 在上述程序中,已經將c.i=1;它在內存中的存儲方式有上述兩種方式
          • 小端模式:c.c=1;
          • 大端模式:c.c=0;
  • 如何檢測系統大小端,以下面程序為例
    •  1 #includ <stdio.h>
       2 /*檢測處理器大小端,大端模式返回0,小段模式返回1*/
       3 int checkcpu()
       4 {
       5 union w
       6 {
       7 int a;
       8 char b;
       9 } c;
      10 c.a=1;
      11 return(c.b==1);
      12 }
      13 
      14 int main()
      15 {
      16 printf("%d",checkcpu());
      17 return 0;
      18 }



三、enum枚舉類型關鍵字

  • enum 是c語言的一種自定義類型,將枚舉引入的目的是為了提高程序的可讀性
    • 1 enum color
      2 {
      3 RED;
      4 BLUE=2;
      5 GREEN;
      6 };
      7 
      8 其中RED=0;BLUE=2;GREEN=3

    • enum變量的類型實際上是int類型
    • 枚舉類型中第一個定義的值默認為0;(手動指定的除外)
    • 默認情況下後續定義的值為在前一個的基礎上+1

c語言關鍵字-struct,union,enum及柔性數組