C语言详细分析讲解关键字enum与sizeof及typedef的用法

目录
  • 一、枚举类型的使用方法
  • 二、sizeof 关键字的用法
  • 三、typedef 的意义
  • 四、小结

一、枚举类型的使用方法

  • enum 是 C 语言中的一种自定义类型
  • enum 值是可以根据需要自定义的整型值
  • 第一个定义的 enum 值默认为 0
  • 默认情况下的 enum 值是在前一个定义值的基础上加 1
  • enum 类型的变量只能取定义时的离散值
  • enum 中定义的值是C语言中真正意义上的常量
  • 在工程中 enum 多用于定义整型常量

下面看一段 enum 的使用代码吧:

#include<stdio.h>

enum
{
    ARRAY_SIZE = 10
};

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 = 0;

    for (i = 0; i < ARRAY_SIZE; i++)
    {
        array[i] = i + 1;
    }
}

void PrintArray(int array[])
{
    int i = 0;

    for (i = 0; i < ARRAY_SIZE; i++)
    {
        printf("%d\n", array[i]);
    }
}

int main()
{
    enum Color c = GREEN;

    int array[ARRAY_SIZE] = {0};

    PrintColor(c);

    InitArray(array);

    PrintArray(array);

    return 0;
}

下面为输出结果:

这段程序说明enum 中定义的值是C语言中真正意义上的常量。

二、sizeof 关键字的用法

  • sizeof 是编译器的内置指示符
  • sizeof 用于计算类型或变量所占的内存大小
  • sizeof 的值在编译期就已经确定

sizeof 可以采用以下的用法:

sizeof 是 C 语言的内置关键字而不是函数

  • 在编译过程中所有的 sizeof 将被具体的数值所替换
  • 程序的执行过程与 sizeof 没有任何关系

下面看一段 sizeof 的本质的代码:

#include<stdio.h>

int f()
{
    printf("Autumn Ze");

    return 0;
}

int main()
{
    int var = 0;

    int size = sizeof(var++);

    printf("var = %d, size = %d\n", var, size);

    size = sizeof(f());

    printf("size = %d\n", size);

    return 0;
}

下面为输出结果:

为什么 var 不等于 1 呢?这是因为在编译过程中所有的 sizeof 将被具体的数值所替换,var++ 这条语句根本得不到执行。同样,f() 函数也不会得到执行,所以不会输出 Autumn Ze,只会输出返回值类型 int 的字节数。

三、typedef 的意义

typedef 用于给一个已经存在的数据类型重命名

typedef 本质上不能产生新的类型

typedef 重命名的类型:

  • 可以在 typedef 语句之后定义
  • 不能被 unsigned 和 signed 修饰

用法:typedef type new_name;

下面看一段 typedef 使用的代码:

#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 ListNode;
struct _tag_list_node
{
    ListNode* next;
};

int main()
{
    Int32 i = -100;
    //unsigned Int32 ii = 0;
    Point p;
    SoftArray* sa = NULL;
    ListNode* node = NULL;

    return 0;
}

这段代码主要就是说明typedef 重命名的类型可以在 typedef 语句之后定义,不能被 unsigned 和 signed 修饰。

四、小结

  • enum 用于定义离散值类型
  • enum 定义的值是真正意义上的常量
  • sizeof 是编译器的内置指示符
  • sizeof 不参与程序的执行过程
  • typedef 用于给类型重命名
  • 重名的类型可以在 typedef 语句之后定义

到此这篇关于C语言详细分析讲解关键字enum与sizeof及typedef的用法的文章就介绍到这了,更多相关C语言 enum sizeof typedef内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C语言入门学习笔记之typedef简介

    在单片机和操作系统中 typedef 会经常用到,它可以为某一个类型自定义名称.和#define比较类似.但是又有不同的地方. typedef 创建的符号只能用于数据类型,不能用于值.而#define 创建的符号可以用于值. typedef 是由编译器来解释,而不是预处理器. typedef 使用起来更加灵活. 下面使用typedef定义一个数据类型 int main() { typedef unsigned char BYTE; BYTE c = 10; printf("%d \r\n&quo

  • C语言中typedef的用法以及#define区别详解

    目录 1.简洁定义 2.为已有类型起别名 为字符数组起别名 为指针起别名 3.typedef 和 #define 的区别 总结 1.简洁定义 C语言允许为一个数据类型起一个新的别名,就像给人起"绰号"一样.而编程中起别名,是为了编程人员编程方便,例如: 定义如下结构体 struct stu { int ID; char name[20]; float score[3]; char *data; }; 要想定义一个结构体变量就得这样写: struct stu Marry://Marry是

  • C语言数据类型与sizeof关键字

    目录 一.前言 二.数据类型 1.数据类型有哪些 2.为什么要有数据类型 3.如何看待数据类型 三.sizeof – 计算不同类型变量开辟空间的大小 1.内置类型开辟的空间大小 2.自定义类型开辟的空间大小 3.指针类型开辟的空间大小 4.空类型开辟的空间大小 四.对sizeof 的进一步理解 1.sizeof 为什么不是函数 2.sizeof 的其他使用 一.前言 大家好,欢迎来到C语言深度解析专栏—C语言关键字详解第三篇,在本篇中我们将会介绍C语言当中的数据类型,并由此引出C语言当中的另外一

  • c语言枚举类型enum的用法及应用实例

    目录 前言 一.枚举的概念 二.枚举的几种用法 1.直接定义枚举值,然后给普通变量赋值. 2.定义带名称的枚举 三.定义枚举别名 四.枚举有什么用,用在哪里? 最后总结: 前言 今天跟大家讲一下我在产品开发时,用枚举(enum)的一些骚操作. 我跟你保证,今天的内容绝对是你在书本和视频学不到的. 为什么要讲枚举呢? 因为我发现它是一个容易被遗忘,同时又非常重要的关键词,大家如果看那些大佬写的程序,真的会发现有非常非常多enum的应用. 让我惊奇的是市面上的一些C语言书籍以及视频课程并没有重视去讲

  • C语言 sizeof 函数详情

    目录 一.sizeof 函数简介 二.sizeof 函数实战 一.sizeof 函数简介 在 C 语言中,char 字符串也是一种非常重要的数据类型,我们除了使用 sizeof 函数获取字符串长度之外,使用 sizeof 函数同样也可以完成字符串长度的获取: 字符串:一般用一对双引号" "括起的一串字符来表示字符串常量,字符串默认以转义字符'\0'结尾,字符串常量是不可被修改的: sizeof 函数会扫描整个字符串,直到碰到第一个字符串结束符 '\0'为止,然后返回计数器值(长度包含'

  • C语言中sizeof函数踩过的坑总结

    sizeof很简单,但是却很容易令人踩坑. 正文 先来看这样一段代码 int main() { int i=2; printf("%d\n",sizeof(i++)); printf("%d\n",i); return 0; } 非常简单的一段代码 当时我认为答案应该是 4 3 可是结果却是出乎我的意料了 这是为什么呢? 下面来仔细说一下 通过调试观察虽然确实有i++这么一句代码,但是却没有实现.说到这里很多人可能犯了和我一样的错误,认为sizeof是一个函数. 其

  • c语言中enum类型的用法案例讲解

    11.10 枚举类型 在实际问题中,有些变量的取值被限定在一个有限的范围内.例如,一个星期内只有七天,一年只有十二个月,一个班每周有六门课程等等.如果把这些量说明为整型,字符型或其它类型显然是不妥当的.为此,C语言提供了一种称为"枚举"的类型.在"枚举"类型的定义中列举出所有可能的取值,被说明为该"枚举"类型的变量取值不能超过定义的范围. 应该说明的是,枚举类型是一种基本数据类型,而不是一种构造类型,因为它不能再分解为任何基本类型. 11.10.

  • C语言入门篇--注释,关键字typedef及转义字符详解

    目录 注释 1.注释意义 2.两种注释风格 2.1 C语言注释风格 2.2 C++注释风格 关键字typedef 1.注意 2.用法 语法结构 转义字符 1.转义字符及其含义 2.字面 转 特殊 3.特殊 转 字面 注释 1.注释意义 (1)代码中有不需要的代码可以直接删除,也可以注释掉. (2)有些代码比较难懂可以注释一下. 2.两种注释风格 2.1 C语言注释风格 /*xxxxxx*/ 一次可以注释一行或多行,但不能嵌套注释. eg: #include <stdio.h> int main

  • C语言数据类型枚举enum全面详解示例教程

    目录 一.枚举类型的定义 二.枚举类型的使用 2.1创建变量 2.2一些优点 总结 一.枚举类型的定义 enum Day//enum Day是一种类型 { Mon,//周一到周日这些叫枚举的可能取值,也叫枚举常量 Tue, Wed, Thur, Fri, Sat, Sun, }; 上述代码定义的enum Day是一种枚举类型,{}中内容是枚举类型的可能取值,也可叫作枚举常量. 这些枚举常量都是有值的,默认从0开始,依次往后递增1,如果你愿意赋值也是可以的. 代码如下: #include<stdi

  • C语言详细分析讲解关键字enum与sizeof及typedef的用法

    目录 一.枚举类型的使用方法 二.sizeof 关键字的用法 三.typedef 的意义 四.小结 一.枚举类型的使用方法 enum 是 C 语言中的一种自定义类型 enum 值是可以根据需要自定义的整型值 第一个定义的 enum 值默认为 0 默认情况下的 enum 值是在前一个定义值的基础上加 1 enum 类型的变量只能取定义时的离散值 enum 中定义的值是C语言中真正意义上的常量 在工程中 enum 多用于定义整型常量 下面看一段 enum 的使用代码吧: #include<stdio

  • C语言详细分析讲解关键字const与volatile的用法

    目录 一.const 只读变量 二.const 全局变量的分歧 三.const 的本质 四.const 修饰函数参数和返回值 五.volatile 解析 六.小结 一.const 只读变量 const 修饰的变量是只读的,本质还是变量 const 修饰的局部变量在栈上分配空间 const 修饰的全局变量在全局数据区分配空间 const 只在编译期有用,在运行期无用 const 修饰的变量不是真的常量,它只是告诉编译器该变量不能出现在赋值符号的左边. 二.const 全局变量的分歧 在现代C语言编

  • C语言详细分析讲解关键字goto与void的作用

    目录 一.关于goto 二.void 的意义 三.小结 一.关于goto 高手潜规则:禁用 goto 项目经验:程序质量与 goto 的出现次数成反比 最后的判决:将 goto 打入冷宫 下面看一段 goto 副作用分析的代码: #include <stdio.h> #include <malloc.h> void func(int n) { int* p = NULL; if( n < 0 ) { goto STATUS; } p = (int*)malloc(sizeof

  • C语言详细分析讲解多文件的程序设计

    目录 一.多文件与编译器链接 二.多文件之间的相互访问 三.关于#include 四.头文件使用的一些原则 五.再论全局变量 六.注意事项 七.实验程序 八.小结 一.多文件与编译器链接 如下图所示,.o 为目标文件,链接器将不同的目标文件装配组合在一起形成一个可执行文件. 二.多文件之间的相互访问 每个文件可以定义功能接口(可被其它文件访问的函数或数据) 源文件:代码实现文件,后缀为.c 头文件:源文件的接口定义文件,后缀为.h 当需要使用其它文件提供的功能时,包含对应的头文件 语法: #in

  • C语言详细分析讲解流程控制语句用法

    目录 一.分支语句 1.if语句 2.switch语句 二.循环语句 1.for语句 2.break和continue语句 3.循环嵌套 4.while和do…while语句 一.分支语句 1.if语句 流程控制语句可以让程序中的语句不再从上到下逐条执行 分支是一种流程控制语句,可以把程序中某些语句忽略掉不去执行 if关键字可以用来编写分支语句,只有当表达式为真时,才会执行对应语句 如果多个分支的逻辑表达式之间存在互斥关系,则可以采用else关键字把他们合并成一个分支语句 一个分支语句中的多个逻

  • C语言详细分析讲解struct与union使用方法

    目录 一.struct 的小秘密 二.结构体与柔性数组 三.C语言中的 union 四.小结 一.struct 的小秘密 C语言中的 struct 可以看作变量的集合 struct 的问题:空结构体占用多大内存?下面编写程序看一下吧: #include <stdio.h> struct TS { }; int main() { struct TS t1; struct TS t2; printf("sizeof(struct TS) = %d\n", sizeof(stru

  • C语言详细分析讲解内存管理malloc realloc free calloc函数的使用

    目录 C语言内存管理 一.动态空间申请 二.动态空间的扩容 三.释放内存 C语言内存管理 malloc && realloc && free && calloc c语言中为了进行动态内存管理,<stdlib.h>中提供了几个函数帮助进行内存管理. 我们知道,C语言中是没有C++中的容器或者说是python中list,set这些高级的数据结构的,我们一旦申请了一段内存空间以后这一段空间就归你了,比如我们举个例子,我们申请一个数组 int nums[

  • Java超详细分析讲解final关键字的用法

    目录 基本介绍 final细节01 final细节02 基本介绍 final 可以修饰类.属性.方法和局部变量. 在某些情况下,程序员可能有以下需求,就会使用到final: Base Sub 类 1)当不希望类被继承时,可以用final修饰. 2)当不希望父类的某个方法被子类覆盖/重写(override)时,可以用final关键字 修饰.[案例演示:访问修饰符 final 返回类型方法名] 3)当不希望类的的某个属性的值被修改,可以用final修饰.[案例演示: public final dou

  • C++详细分析讲解函数参数的扩展

    目录 一.函数参数的默认值 二.函数占位参数 三.小结 一.函数参数的默认值 C++ 中可以在函数声明时为参数提供一个默认值 当函数调用时没有提供参数的值,则使用默认值 参数的默认值必须在函数声明中指定 下面看一段代码: #include <stdio.h> int mul(int x = 0); int main(int argc, char *argv[]) { printf("%d\n", mul()); printf("%d\n", mul(-1

  • Java超详细分析讲解哈希表

    目录 哈希表概念 哈希函数的构造 平均数取中法 折叠法 保留余数法 哈希冲突问题以及解决方法 开放地址法 再哈希函数法 公共溢出区法 链式地址法 哈希表的填充因子 代码实现 哈希函数 添加数据 删除数据 判断哈希表是否为空 遍历哈希表 获得哈希表已存键值对个数 哈希表概念 散列表,又称为哈希表(Hash table),采用散列技术将记录存储在一块连续的存储空间中. 在散列表中,我们通过某个函数f,使得存储位置 = f(关键字),这样我们可以不需要比较关键字就可获得需要的记录的存储位置. 散列技术

随机推荐