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