天天看點

10、enum、sizeof、typedef 分析

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;
}
           
10、enum、sizeof、typedef 分析

是以一般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;
}
           

繼續閱讀