第11课 - enum, sizeof, typedef 分析

1. enum介绍

(1)enum是C语言中的一种自定义类型,和structunion地位相同,格式如下:

 // 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_SIZE; i++) {
array[i] = i + ;
}

【enum的用法】

 #include <stdio.h>

 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_SIZE; i++)
{
array[i] = i + ;
}
} void PrintArray(int array[])
{
int i = ; for(i=; i<ARRAY_SIZE; 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) 或 sizeof var     // 这里sizeof与var之间使用空格间隔,也证明了sizeof是关键字而不是函数,函数是没有这种语法的

 #include <stdio.h>

 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 <stdio.h>

 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 <stdio.h>

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

第11课 - enum, sizeof, typedef 分析的更多相关文章

  1. C语言进阶——enum, sizeof, typedef 分析11

    枚举类型的使用方法: enum是C语言的 一种自定义类型 enum值是可以根据需要自定义的整型值 第一个enum的值默认为0 默认情况下的enum值是在前一个定义值的基础上加 1 enum类型的变量只 ...

  2. enum sizeof typedef分析

    1.枚举类型的使用方法 enum是C语言中的一种自定义类型 enum值是可以根据需要自定义的整型值 第一个定义的enum值默认为0 默认情况下的enum值是在前一个定义值的基础上加1 enum类型的变 ...

  3. 第11课 enum、sizeof、typedef 分析

    1. enum枚举类型 1.1 使用方法 (1)enum是C语言中的一种自定义类型 (2)enum值是可以根据需要自定义的的整型值 (3)第一个定义的enum值默认为0. (4)默认情况下的enum值 ...

  4. 第11课 enum,sizeof,typedef分析

    枚举类型的使用方法: enum的地位和struct是相等的,enum主要用来根据需要定义一些离散的值. 枚举类型的特殊意义: 工程中常用无名枚举来定义常量. 程序示例: #include <st ...

  5. enum,sizeof,typedef

    枚举类型的使用方法 enum是C语言中的一种自定义类型 enum值可以根据需要自定义整形值 第一个定义的enum值默认为0 默认情况下的enum值是在前一个定义值得基础上加1 enum类型的变量只能去 ...

  6. C++11的enum class & enum struct和enum

    C++11的enum class & enum struct和enum C++标准文档--n2347(学习笔记) 链接:http://www.open-std.org/jtc1/sc22/wg ...

  7. enum与typedef enum

    enum与typedef enum的用法 在程序中,可能需要为某些整数定义一个别名,我们可以利用预处理指令#define来完成这项工作,您的代码可能是: #define MON  1#define T ...

  8. [转]C++11的enum class & enum struct和enum

    1. 旧版enum存在的问题 问题 描述 1 向整形的隐式转换(Implicit conversion to an integer) 2 无法指定底层所使用的数据类型(Inability to spe ...

  9. 【转】C++11的enum class & enum struct和enum

    转自:https://blog.csdn.net/sanoseiichirou/article/details/50180533 C++标准文档——n2347(学习笔记) 链接:http://www. ...

随机推荐

  1. Python定时任务轻量解决方案---Schedule

    写后端的同学们可能都知道,工作中可能需要周期性执行一些任务,俗称定时任务.Linux环境下,可以借助于系统自带的crontab完成定时任务.但是很多时候,开发的同学们可能并没有权限去操作crontab ...

  2. 隐藏jqgrid滚动条

    .ui-jqgrid .ui-jqgrid-bdiv{ overflow-x: hidden; } /* 隐藏jqgrid滚动条 */

  3. 更换IntelliJ Idea的Terminal为git_home/bin/sh.exe命令端程序

    idea中默认的terminal形式: 1.在IDEA中,打开settings,设置相应的bash路径 settings–>Tools–>Terminal–>Shell path:C ...

  4. 详解Python中的__init__和__new__

    转载:https://my.oschina.net/liuyuantao/blog/747164 1.__init__ 方法是什么? 使用Python写过面向对象的代码的同学,可能对 __init__ ...

  5. [PyTorch 学习笔记] 2.2 图片预处理 transforms 模块机制

    PyTorch 的数据增强 我们在安装PyTorch时,还安装了torchvision,这是一个计算机视觉工具包.有 3 个主要的模块: torchvision.transforms: 里面包括常用的 ...

  6. 数据处理 | pandas入门专题——离散化与one-hot

    今天是pandas数据处理专题第7篇文章,可以点击上方专辑查看往期文章. 在上一篇文章当中我们介绍了对dataframe进行排序以及计算排名的一些方法,在今天的文章当中我们来了解一下dataframe ...

  7. mysql再回首

    Mysql与Oracle的区别 1.实例区别 Mysql是一个轻量型数据库,开源免费.Oracle是收费的而且价格非常高. Mysql一个实例可以操作多个库,而Oracle一个实例只能对应一个库. M ...

  8. 使用BeetleX在Linux下部署.NET多站点服务

    ​      在windows下常用IIS来部署.NET的多站点服务,但在Linux下就没这么方便了:虽然可以使用一些代理服务器如nginx,jexus等来反代或部署应用,但nginx对.NET应用的 ...

  9. 网络请求以及网络请求下载图片的工具类 android开发java工具类

    package cc.jiusan.www.utils; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; ...

  10. spring cloud 路由

    Spring Cloud Feign:用于微服务之间,只映射内网ip Spring Cloud Gateway:用于服务端,对外开放的接口,对外统一访问gateway映射的ip 是这样吗? 但是这样权 ...