【C语言进阶深度学习记录】十一 C语言中enum,sizeof,typedef分析
文章目录
- 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分析相关推荐
- 【C语言进阶深度学习记录】十七 宏定义的使用与分析
文章目录 1 C语言中的宏定义 1.1 定义宏常量 1.2 宏定义表达式 1.3 宏表达式与函数的对比 1.4 宏表达式的作用域 2 C语言中的内置宏 3 宏定义的代码综合示例 4 总结 1 C语言中 ...
- 【C语言进阶深度学习记录】二十二 指针的本质分析
在C语言中,最难的也就是指针了.如果我们了解了指针的本质,它就会变得简单 文章目录 1 回顾:什么是变量? 1.1 *号的意义 1.2 指针使用示例 2 传值调用与传址调用 2.1 利用指针交换两个变 ...
- 【C语言进阶深度学习记录】十八 条件编译的使用与分析
文章目录 1 基本概念 1.1 代码分析 1.2 通过命令行定义宏 2 #include 的本质 2.1 解决重复包含头文件的问题 3 条件编译的应用 4 总结 1 基本概念 条件编译的行为类似于C语 ...
- 【C语言进阶深度学习记录】十九 #pragma使用与分析
文章目录 1 #pragma 概念简介 1.1 #pragma message 的用法 1.2 #pragma once 的用法 1.3 #pragma pack 的用法 1.31 struct占用的 ...
- 【C语言进阶深度学习记录】三十八 C/C++语言中的函数声明与函数定义
文章目录 1 函数的声明和定义 1.1 代码分析 2 总结 1 函数的声明和定义 声明的意义在于告诉编译器程序单元的存在.只是告诉编译器它存在但是不在声明这里定义,有可能在当前文件中的其他地方或者其他 ...
- 【C语言进阶深度学习记录】三十五 程序中的堆、栈以及静态存储区(数据区)
学习交流加 个人qq: 1126137994 个人微信: liu1126137994 学习交流资源分享qq群: 962535112 在我之前学习底层的知识的时候,也写过相关的内容.可以对比的学习:[软 ...
- 【C语言进阶深度学习记录】二十六 C语言中的字符串与字符数组的详细分析
之前有一篇文章是学习了字符和字符串的,可以与之结合学习:[C语言进阶深度学习记录]十二 C语言中的:字符和字符串 文章目录 1 字符串的概念 1.1 字符串与字符数组 1.2 字符数组与字符串代码分析 ...
- 【C语言进阶深度学习记录】十六 静态库与动态库的创建与使用
上一篇文章学习了编译的过程,点击链接查看:[C语言进阶深度学习记录]十五 编译过程简介,每一个C源文件编译后将会生成目标文件,那么这些目标文件,还需要链接起来,生成可执行文件. 文章目录 1 链接的意 ...
- 【C语言进阶深度学习记录】八 C语言中void的分析
文章目录 1 void的意义 1.1 不存在void变量 1.2 C标准 1.3 void指针的意义 1.4 通过void* 实现memset函数 2 总结 1 void的意义 void修饰函数的参数 ...
- 【C语言进阶深度学习记录】五 C语言中变量的属性
上一篇文章学习了C语言中的类型转换,点击链接查看:[C语言进阶深度学习记录]四 C语言中的类型转换. 文章目录 1 C语言的变量属性 1.1 auto关键字 1.2 register关键字 1.3 s ...
最新文章
- 详细说明Spring--AOP
- SpringCloud服务组合
- php 判断时间超过5分钟_小学音乐20分钟试讲面试,只有5天复习时间可以逆袭吗?...
- 腾讯2009年笔试题
- “新视野”和“最远点”的约会
- php给html传值,PHP传值到不同页面的三种常见方式及php和html之间传值问题_PHP
- (转)Spring Boot 2 (四):使用 Docker 部署 Spring Boot
- 知道草根如何逆袭吗?
- mysql数据控制语言_Mysql数据控制语言DCL(Data Control Language)
- 解决vue axios跨域请求发送两次问题
- 一个很好的开源图像处理软件--imageJ (2
- WebRTC收集网卡地址信息 源码剖析
- 关于SX1308升压芯片的使用说明
- HoloLens初入——研究模式
- spring cloud系列eureka
- Java+spring+vue基于ssm的农家乐预定管理系统
- 荣品RK3288开发板 怎么接23.5寸,BOA屏?
- 图像质量评价及率失真性能曲线绘制
- win7计算机无法拖到任务栏,win7系统程序图标无法拖动至任务栏的解决方法
- 电路基本原理那些事儿之 能量守恒定律
热门文章
- 第十三题:子类要调用继承自父类的方法,必须使用super关键字。
- spring mvc学习(14) the superclass “javax.servlet.http.HttpServlet” was not found
- 第四十七期:毕业3年Java程序员,年薪20W,他是如何达到的?
- slide简介(大数据技术)
- Qt 生成bin文件
- JS之字符串连接方法join
- CSS之容器按比例缩放
- 直接拿来用!10款实用Android UI工具
- linux perl telnet安装,51CTO博客-专业IT技术博客创作平台-技术成就梦想
- 中boxplot函数的参数设置_如何在Python中生成图形和图表