文章目录

  • 1 enum 枚举类型的使用方法
    • 1.1 enum枚举类型的特殊意义
    • 1.2 代码分析:enum的使用
  • 2 sizeof 关键字的用法
    • 2.1 代码案例分析:sizeof的本质
  • 3 typedef的意义
    • 3.1 代码案例:typedef 的使用案例
  • 4 总结

1 enum 枚举类型的使用方法

  • enum是C语言中的一种自定义类型
  • enum是可以根据需要自定义的整形值
  • 第一个自定义的enum值默认为0
  • 默认情况下,enum值是在前一个定义值的基础上加1
  • enum类型的变量只能取定义时的离散值,如:

  • 上面的代码打印结果是0。所以说enum的变量大小是enum这个结构里面存的值的某一个。如上。

注意:enum中的各个变量之间是逗号隔开的。

1.1 enum枚举类型的特殊意义

  • enum定义的值是C语言中真正意义上的常量,且是整型常量

具体如何定义常量,使用无名枚举,如下图所示:

  • 使用上述无名枚举,可以定义真正意义上的常量。所以上述定义数组时可以直接用ARRAY_SIZE作为数组的大小。

1.2 代码分析:enum的使用

  • 代码11-1-lyy.c:
#include <stdio.h>enum {ARRAY_SIZE = 5
};enum Color {RED   = 0x00FF0000,GREEN = 0x0000FF00,BLUE  = 0x000000FF,
};void PrintColor(enum Color c){switch(c){case RED:printf("Color : (0x%08x)\n", c);break;case GREEN:printf("Color : (0x%08x)\n", c);break;case BLUE:printf("Color : (0x%08x)\n", c);break;default:printf("Error!\n");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("array[%d] = %d\n", i,array[i]);}
}
int main(){enum Color c = BLUE;PrintColor(c);int array[ARRAY_SIZE] = {0};InitArray(array);PrintArray(array);    return 0;
}
  • 上述代码编译运行结果为(gcc 4.4.5编译器):

可以看出,无名enum确实可以定义真正的常量。且使用enum类型,可以定义一组离散数据,该enum变量是这一组离散数据中的一个

2 sizeof 关键字的用法

注意;sizeof是C语言中的关键字,并不是函数。就像new/delete是C++的关键字而非函数一样

  • sizeof是C元编译器的内置指示符
  • sizeof用于计算 类型 或者 变量 所占用内存的大小
  • sizeof 的值在编译期就已经确定大小。之前学过的const也是在编译期间有效,运行期间无效。后面还有解释
  • sizeof 用于类型时是这样表述的:sizeof(type);
  • sizeof 用于变量时可以有两种表述方法:sizeof(var) ; 或者 sizeof var ;

如下图:

注意:

  • sizeof 在编译期间,将被具体的数值替换,程序执行过程中与sizeof没有任何关系
  • 比如下面的代码,执行后打印什么?

上述代码执行后,var的值依然是0 。因为sizeof在编译期间就确定了具体的数值。而var++ 是需要在程序运行时计算的,所以实际上var++ 在程序运行期间就没有被执行,因为在编译期间sizeof(var++)已经确定了值为4.

2.1 代码案例分析:sizeof的本质

  • 代码:11-2-lyy.c
#include <stdio.h>int f(){printf("Lyy_Leran_C\n");return 0;
}
int main(){int var = 0;int size = sizeof(var++);printf("size = %d, var = %d\n",size,var);size = sizeof(f());//这之间并不打印 "Lyy_Leran_C"printf("size = %d\n",size);return 0;
}
  • 上述代码编译运行结果为:

可以看出,上述代码中,var变量的值依然是0,没有变化,而且并没有打印出字符串“Lyy_Leran_C” ,说明函数f() 也并没有被执行。
以上充分说明了,sizeof在编译期间就已经确定了值的大小。运行期间就与sizeof没有任何关系了

3 typedef的意义

有一种说法是错误的:typedef 是用于定义一种新的的类型。。。。。

注意,typedef不是用来定义新类型的,而是给已经存在的数据类型取一个别名(或者叫重命名)!!!

  • typedef用于给一个已经存在的数据类型重命名
  • typedef 本质上是不能产生新类型的
  • typedef 不能被 unsigned 或者signed 修饰 。这在下面的代码案例中可以看到
  • typedef 的用法:typedef type new_name ;
  • 可以在typedef 语句之后定义类型 。后面的代码示例会解释这句话的含义

3.1 代码案例:typedef 的使用案例

  • 代码:11-3-lyy.c
#include <stdio.h>typedef int Int32;struct _tag_point{int x;int y;
};typedef struct _tag_point Point;typedef struct {int len;int array[];
} SoftArray;typedef struct _tag_list_node ListNode;
struct _tag_list_node{ListNode* next;
};int main(){Int32 i = -100;  //int  //unsigned Int32 ii = 0;  //errorPoint p;      //struct _tag_point;SoftArray* sa = NULL; ListNode* node = NULL;   //struct _tag_list_node*return 0;
}
  • 上述代码中的第25行如果不注释掉的话,程序编译错误。这就是之前提到过的typedef 不能被 unsigned 或者signed 修饰
  • 将25行注释掉后,程序编译通过。没有具体输出,知道如何使用即可
  • 并且上述代码中第17行使用的struct _tag_list_node 类型是在后面定义的。 这是允许的

4 总结

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

【C语言进阶深度学习记录】十一 C语言中enum,sizeof,typedef分析相关推荐

  1. 【C语言进阶深度学习记录】十七 宏定义的使用与分析

    文章目录 1 C语言中的宏定义 1.1 定义宏常量 1.2 宏定义表达式 1.3 宏表达式与函数的对比 1.4 宏表达式的作用域 2 C语言中的内置宏 3 宏定义的代码综合示例 4 总结 1 C语言中 ...

  2. 【C语言进阶深度学习记录】二十二 指针的本质分析

    在C语言中,最难的也就是指针了.如果我们了解了指针的本质,它就会变得简单 文章目录 1 回顾:什么是变量? 1.1 *号的意义 1.2 指针使用示例 2 传值调用与传址调用 2.1 利用指针交换两个变 ...

  3. 【C语言进阶深度学习记录】十八 条件编译的使用与分析

    文章目录 1 基本概念 1.1 代码分析 1.2 通过命令行定义宏 2 #include 的本质 2.1 解决重复包含头文件的问题 3 条件编译的应用 4 总结 1 基本概念 条件编译的行为类似于C语 ...

  4. 【C语言进阶深度学习记录】十九 #pragma使用与分析

    文章目录 1 #pragma 概念简介 1.1 #pragma message 的用法 1.2 #pragma once 的用法 1.3 #pragma pack 的用法 1.31 struct占用的 ...

  5. 【C语言进阶深度学习记录】三十八 C/C++语言中的函数声明与函数定义

    文章目录 1 函数的声明和定义 1.1 代码分析 2 总结 1 函数的声明和定义 声明的意义在于告诉编译器程序单元的存在.只是告诉编译器它存在但是不在声明这里定义,有可能在当前文件中的其他地方或者其他 ...

  6. 【C语言进阶深度学习记录】三十五 程序中的堆、栈以及静态存储区(数据区)

    学习交流加 个人qq: 1126137994 个人微信: liu1126137994 学习交流资源分享qq群: 962535112 在我之前学习底层的知识的时候,也写过相关的内容.可以对比的学习:[软 ...

  7. 【C语言进阶深度学习记录】二十六 C语言中的字符串与字符数组的详细分析

    之前有一篇文章是学习了字符和字符串的,可以与之结合学习:[C语言进阶深度学习记录]十二 C语言中的:字符和字符串 文章目录 1 字符串的概念 1.1 字符串与字符数组 1.2 字符数组与字符串代码分析 ...

  8. 【C语言进阶深度学习记录】十六 静态库与动态库的创建与使用

    上一篇文章学习了编译的过程,点击链接查看:[C语言进阶深度学习记录]十五 编译过程简介,每一个C源文件编译后将会生成目标文件,那么这些目标文件,还需要链接起来,生成可执行文件. 文章目录 1 链接的意 ...

  9. 【C语言进阶深度学习记录】八 C语言中void的分析

    文章目录 1 void的意义 1.1 不存在void变量 1.2 C标准 1.3 void指针的意义 1.4 通过void* 实现memset函数 2 总结 1 void的意义 void修饰函数的参数 ...

  10. 【C语言进阶深度学习记录】五 C语言中变量的属性

    上一篇文章学习了C语言中的类型转换,点击链接查看:[C语言进阶深度学习记录]四 C语言中的类型转换. 文章目录 1 C语言的变量属性 1.1 auto关键字 1.2 register关键字 1.3 s ...

最新文章

  1. 详细说明Spring--AOP
  2. SpringCloud服务组合
  3. php 判断时间超过5分钟_小学音乐20分钟试讲面试,只有5天复习时间可以逆袭吗?...
  4. 腾讯2009年笔试题
  5. “新视野”和“最远点”的约会
  6. php给html传值,PHP传值到不同页面的三种常见方式及php和html之间传值问题_PHP
  7. (转)Spring Boot 2 (四):使用 Docker 部署 Spring Boot
  8. 知道草根如何逆袭吗?
  9. mysql数据控制语言_Mysql数据控制语言DCL(Data Control Language)
  10. 解决vue axios跨域请求发送两次问题
  11. 一个很好的开源图像处理软件--imageJ (2
  12. WebRTC收集网卡地址信息 源码剖析
  13. 关于SX1308升压芯片的使用说明
  14. HoloLens初入——研究模式
  15. spring cloud系列eureka
  16. Java+spring+vue基于ssm的农家乐预定管理系统
  17. 荣品RK3288开发板 怎么接23.5寸,BOA屏?
  18. 图像质量评价及率失真性能曲线绘制
  19. win7计算机无法拖到任务栏,win7系统程序图标无法拖动至任务栏的解决方法
  20. 电路基本原理那些事儿之 能量守恒定律

热门文章

  1. 第十三题:子类要调用继承自父类的方法,必须使用super关键字。
  2. spring mvc学习(14) the superclass “javax.servlet.http.HttpServlet” was not found
  3. 第四十七期:毕业3年Java程序员,年薪20W,他是如何达到的?
  4. slide简介(大数据技术)
  5. Qt 生成bin文件
  6. JS之字符串连接方法join
  7. CSS之容器按比例缩放
  8. 直接拿来用!10款实用Android UI工具
  9. linux perl telnet安装,51CTO博客-专业IT技术博客创作平台-技术成就梦想
  10. 中boxplot函数的参数设置_如何在Python中生成图形和图表