第11课 - enum, sizeof, typedef 分析
1. enum介绍
(1)enum是C语言中的一种自定义类型,和struct、union地位相同,格式如下:
// enum每个值的最后以逗号结尾
enum Color {
GREEN,
RED,
BLUE
};
// printf("%zu\n", sizeof(enum Color)); ==> 输出的结果为4,表明enum类型的变量占用4字节
(2)enum定义的第一个值默认情况下为0,后一个的值在前一个值的基础上加1
(3)enum在程序中有两种用法: ① 定义常量 ② 定义离散的整型值类型
(4)enum中定义的值是C语言中真正意义的常量,在工程中enum多用于定义整型常量。下面的enum没有名字,不能用来定义枚举变量,仅仅用来定义常量。
enum { // 无名枚举,用于定义常量
ARRAY_SIZE =
};
int array[ARRAY_SIZE] = {}; // 使用ARRAY_SIZE定义数组大小
int i = ;
for (i=; i
array[i] = i + ;
}
【enum的用法】
#include
enum
{
ARRAY_SIZE = //定义数组大小,ARRAY_SIZE是常量运行时无法改变
};
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 = ;
for(i=; i
{
array[i] = i + ;
}
}
void PrintArray(int array[])
{
int i = ;
for(i=; i
{
printf("%d\n", array[i]);
}
}
int main()
{
enum Color c = GREEN; //定义变量c并初始化为GREEN
int array[ARRAY_SIZE] = {};
PrintColor(c);
InitArray(array);
PrintArray(array);
return ;
}
执行结果:
2. sizeof关键字的用法
(1)sizeof是C语言的一个内置关键字而不是函数,初学者往往因为sizeof后面的一对括号将其误认为是函数
(2)sizeof 用于计算 类型或 变量所占的内存大小
sizeof 用于类型:
sizeof(type)
sizeof 用于变量:
sizeof(var) 或 sizeofvar //这里sizeof与var之间使用空格间隔,也证明了sizeof是关键字而不是函数,函数是没有这种语法的
#include
int main()
{
int var = ;
printf("%zu\n", sizeof(int)); //
printf("%zu\n", sizeof(var)); //
printf("%zu\n", sizeof var); //
return ;
}
(3)sizeof的值在编译期就已经确定。在编译过程中所有的sizeof将被具体的数值所替换,程序的执行过程与sizeof没有任何关系。看下面这段程序会输出什么?
#include
int func() {
printf("This is test!\n");
return ;
}
int main()
{
int var = ;
int size = sizeof(var++); // 在编译期直接替换为4
printf("var = %d, size = %d\n", var, size); // var = 0, size = 4
size = sizeof(func()); // 因为func()的返回值类型为int,这里直接替换为4,func()并不会被执行
printf("size = %d\n", size);
return ;
}
执行结果:
3. typedef的意义
(1)typedef 用于给一个已经存在的数据类型重命名,typedef 不能产生新的类型
(2)不能使用unsigned和signed修饰 typedef 重命名的类型
(3)typedef用法:
typedef type new_name;
其中type的定义可以在这条语句的后面出现,不必非要在这条语句的前面出现。编译器在处理这条语句时,只是将new_name认为是type的新名称,并不关心new_name的具体定义。
#include
typedef int Int32;
struct _tag_point
{
int x;
int y;
};
typedef struct _tag_point Point; // 前面先定义了类型,然后再重命名
typedef struct // struct没有名字,使用typedef重命名,这种用法很常见
{
int length;
int array[];
} SoftArray;
// 这里先重命名,定义放在了后面,这样也是允许的
// 编译器在处理typedef时仅仅是给一个类型重命名,并不关心这个类型具体是什么样的
// 以后在程序中碰到ListNode就当做struct _tag_list_node
typedef struct _tag_list_node ListNode; //先重命名
struct _tag_list_node //再定义类型
{
ListNode* next; // 在链表中常看到这种写法
};
int main()
{
Int32 i = -; // int
// unsigned Int32 ii = 0; //不能使用signed、unsigned修饰
Point p; // struct _tag_point
SoftArray* sa = NULL;
ListNode* node = NULL; // struct _tag_list_node*
return ;
}
C语言进阶——enum, sizeof, typedef 分析11
枚举类型的使用方法: enum是C语言的 一种自定义类型 enum值是可以根据需要自定义的整型值 第一个enum的值默认为0 默认情况下的enum值是在前一个定义值的基础上加 1 enum类型的变量只 ...
enum sizeof typedef分析
1.枚举类型的使用方法 enum是C语言中的一种自定义类型 enum值是可以根据需要自定义的整型值 第一个定义的enum值默认为0 默认情况下的enum值是在前一个定义值的基础上加1 enum类型的变 ...
第11课 enum、sizeof、typedef 分析
1. enum枚举类型 1.1 使用方法 (1)enum是C语言中的一种自定义类型 (2)enum值是可以根据需要自定义的的整型值 (3)第一个定义的enum值默认为0. (4)默认情况下的enum值 ...
第11课 enum,sizeof,typedef分析
枚举类型的使用方法: enum的地位和struct是相等的,enum主要用来根据需要定义一些离散的值. 枚举类型的特殊意义: 工程中常用无名枚举来定义常量. 程序示例: #include
enum,sizeof,typedef
枚举类型的使用方法 enum是C语言中的一种自定义类型 enum值可以根据需要自定义整形值 第一个定义的enum值默认为0 默认情况下的enum值是在前一个定义值得基础上加1 enum类型的变量只能去 ...
C++11的enum class &; enum struct和enum
C++11的enum class & enum struct和enum C++标准文档--n2347(学习笔记) 链接:http://www.open-std.org/jtc1/sc22/wg ...
enum与typedef enum
enum与typedef enum的用法 在程序中,可能需要为某些整数定义一个别名,我们可以利用预处理指令#define来完成这项工作,您的代码可能是: #define MON 1#define T ...
[转]C++11的enum class &; enum struct和enum
1. 旧版enum存在的问题 问题 描述 1 向整形的隐式转换(Implicit conversion to an integer) 2 无法指定底层所使用的数据类型(Inability to spe ...
【转】C++11的enum class &; enum struct和enum
转自:https://blog.csdn.net/sanoseiichirou/article/details/50180533 C++标准文档——n2347(学习笔记) 链接:http://www. ...
随机推荐
MySQLdb的一些经验
遇到过的几类问题: 如果保持长连接,即使在mysql数据库默认的connection timeout内,也有可能出现"mysql server has gone away".还有另 ...
zoj3231 Apple Transportation(最大流)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud Apple Transportation Time Limit: 1 Second ...
纯js客服插件集qq、旺旺、skype、百度hi、msn
原文 纯js客服插件集qq.旺旺.skype.百度hi.msn 客服插件,集qq.旺旺.skype.百度hi.msn 等 即时通讯工具,并可自己添加支持的通讯工具,极简主义,用法自己琢磨.我的博客 h ...
Apicloud学习第四天
apicloud存储机制,添加和获取存储的数据 $api.setStorage('currentCity', cityList[i_]); $api.getStorage('currentCity') ...
win 10 亮度调节不能使用了
我的解决办法的前提:装过teamviewer ,然后每次系统推送大升级似乎都会无法调节亮度,如果不是这个前提自己找别的办法吧 teamviewer 就是一个流氓软件. 每次更新之后都末名奇妙的不能调节 ...
含有package关键字的java文件在命令行运行报错
程序中含有package关键字,使用命令行运行程序时出现"找不到或无法加载主类",而使用Eclipse软件可以正常运行程序的可能解决办法. 在包下的类,在Java源文件的地方编译后 ...
dos2章
讲FOR之前呢,咋先告诉各位新手朋友,如果你有什么命令不懂,直接在CMD下面输入: name /? 这样的格式来看系统给出的帮助文件,比如for /? 就会把FOR命令的帮助全部显示出来!当然许多菜鸟 ...
as3 AIR 添加或删除ApplicationDirectory目录下文件
AIR的文件目录静态类型有五种: File.userDirectory //指向用户文件夹 File.documentsDirectory //指向用户文档文件夹 File.desktopDirect ...
VCL编写笔记整理
unit hzqEdit1; interface uses SysUtils, Classes, Controls, StdCtrls; type TEditDataType = (dtpStri ...