1、enum分析(枚舉)
— enum 是C語言中的一種自定義類型(類似于 struct 和 union)
— enum 值是可以自定義的整型值
— 第一個定義的 enum 預設為0
— 預設情況下的 enum 值是在前一個定義值的基礎上加1
— enum 類型的變量隻能取定義時的離散值
#include <stdio.h>
enum color
{
red,
green = 2, //注意這裡的标點為逗号
blue //這裡後面不要加分号,就類似于把它們寫在一行
};
enum color c = blue; //enum類型的變量 c 隻能取定義時大括号裡面的離散值
int main()
{
printf("c = %d\n", c);
return 0;
}
特殊意義:
— enum中定義的值是C語言中真正意義上的常量
— 工程中enum多用于定義整型常量
#include <stdio.h>
enum //無名枚舉,用于定義常量
{
ARRAY_size = 10 //定義數組長度
};
int main()
{
int ARRAY[ARRAY_size] = { 0 };
for (int i = 0; i < ARRAY_size; i++)
{
ARRAY[i] = i + 1;
}
for (int i = 0; i < ARRAY_size; i++)
{
printf("ARRAY[%d] = %d\n", i, ARRAY[i]);
}
return 0;
}
綜合程式:
#include <stdio.h>
enum
{
ARRAY_size = 10
};
enum color
{
red = 0x00FF0000,
green = 0x0000FF00,
blue = 0x000000FF
};
void print_color(enum color c)
{
switch (c)
{
case red:
printf("color:red(0x%08X)\n",c); // %x:以16進制小寫輸出,%X:以16進制大寫輸出
break;
case green:
printf("color:green(0x%08x)\n",c);
break;
case blue:
printf("color:blue(0x%08x)\n",c);
break;
}
}
void init_ARRAY(int ARRAY[])
{
for (int i = 0; i < ARRAY_size; i++)
{
ARRAY[i] = i + 1;
}
}
void print_ARRAY(int ARRAY[])
{
for (int i = 0; i < ARRAY_size; i++)
{
printf("ARRAY[%d] = %d\n", i,ARRAY[i]);
}
}
int main()
{
enum color c = red;
int ARRAY[ARRAY_size] = { 0 };
print_color(c);
init_ARRAY(ARRAY);
print_ARRAY(ARRAY);
return 0;
}
是以一般enum有兩種用法:1、定義常量 2、定義離散值
2、sizeof 關鍵字的用法 (sizeof是編譯器的内置訓示符)
- 注: sizeof 是 C語言内置關鍵字而不是函數,在編譯過程中所有的 sizeof 将被具體數值所替代,程式執行過程與 sizeof 沒有任何關系。
#include <stdio.h>
int main()
{
int var = 1;
int size = sizeof(var++);
printf("var = %d\n", var); //答案依舊是 1
return 0;
}
— sizeof 用于計算類型或變量所占的位元組大小
— sizeof 的值在編譯期就已經确定
傳回類型或對象占的位元組大小:sizeof(var)、sizeof(type)
3、typedef 分析
- typedef 用于給一個已經存在的資料類型重命名
-
typedef 本質上不能産生新的類型
注意點:
1、首先已經被 typedef 的類型不能被 signed 和 unsigned 修飾,
2、其次 typedef 的類型可以在 typedef 之後定義
用法:typedef type new_name;
#include <stdio.h>
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 Node;
struct tag_list_node
{
Node* p; //此處沒有問題,詳見上面注意點2,結構體可以在typedef之後定義,意為結構體類型的别名
};
int main()
{
INT32 i = 0;
unsigned INT32 ii = 2; //error,詳見注意點1,被typedef的變量不能被signed或unsigned修飾
Point p;
SoftArray* sa = NULL;
Node* n = NULL;
return 0;
}