第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. C#,js和sql实用技巧选2

    1.为什么"foo".Equals()不是好做法?因为当正确的写法是"foo".Equals(obj.value),却写成了"foo".Eq ...

  2. 如何校验内存数据的一致性,DynamicExpresso 算是帮上大忙了

    一:背景 1. 讲故事 记的在上一家公司做全内存项目的时候,因为一些关键表会在程序 startup 的时候全量灌入到内存中,但随着时间的推移,内存和数据库的同步偶尔会出现数据差异的情况,伴随着就是运营 ...

  3. Project ACRN documentation

    Project ACRN documentation https://projectacrn.github.io/latest/index.html Virtio devices high-level ...

  4. 2020.5.26 第六篇 Scrum冲刺博客

    Team:银河超级无敌舰队 Project:招新通 项目冲刺集合贴:链接 目录 一.每日站立会议 1.1 会议照片 1.2 项目完成情况 二.项目燃尽图 三.签入记录 3.1 代码/文档签入记录 3. ...

  5. ARM开发板挂载Ubuntu18.04主机的NFS共享文件夹

    环境 ubuntu主机环境:Window10 下装VMWare下装的 ubuntu18.04LTS x64 IP 192.168.10.119 Window10下配置192.168.10该网段 开发板 ...

  6. DAO层,Service层,Controller层、View层、entity层

    1.DAO(mapper)层:DAO层主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此,DAO层的设计首先是设计DAO的接口,然后在Spring的配置文件中定义此接口的实现类,然后就 ...

  7. Java中的判断实例

    .getClass().getName() 这是最常见的一种判断类型的方法 instanceof 用于判断 对象 是否为某个类的实例 Boolean值 各种is方法 isAnnotationPrese ...

  8. Git的详细使用

    关于Git的详细使用,下面博主的博客写的非常的详细! 可以参考一下. https://blog.csdn.net/qq_19835247/article/details/104620042 人生需要准 ...

  9. node_第三方包下载文件package.jon详解

    配置原因第三方包的体积过大,不方便团队成员之间共享项目源代码共享时剔除node_modules 快速创建 package.json(只能在英文的目录下成功运行) npm init -y npm i 一 ...

  10. ssm-springboot实现修排名再顺序排的主要代码

    排序改为2,结果如下: package com.zhetang.controller; import com.core.vo.JsonResult; import com.utils.PageResu ...