C語言學習第11篇---union enum, sizeof, typedef 分析
知識來源主要是陳正沖老師的《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,
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小時內刪除侵權內容。