天天看点

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;
}
           

继续阅读