你必须知道的495个C语言问题,学习体会二
这是本主题的第二篇文章,主要就结构体,枚举、联合体做一些解释
1.结构体
现代C语言编程 结构化的基石,diy时代的最好代言人,是面向对象编程中类的老祖宗。
我们很容易定义一个结构体,比如学生:
struct student
{
char * name;
int number;
};
在前文中,我们介绍了typedef 的用法,这里,我们可以使用该关键词声明一个学生结构体变量
typedef struct student stu_st;
在使用该结构体的地方都可以使用stu_st 代替:
struct student Stultz;
---> stu_st Stultz
以下是一些需要注意的位置:
- sizeof 某个结构体时 ,会涉及到字节对齐,这里的原因与硬件有关,一般来说,结构体都是4字对齐的,所以,结构体不同的成员的先后顺序会影响结构体的大小,这一点,如果有不清楚的,可以自行百度下。
- 结构体长度计算 sizeof(sts)/sizeof(sts[0])//sts为一个结构体数组
2.联合
这是个很尬尴的存在,可能是我做的工作比较低端,我使用联合很少,最多是在判断大小端时使用了联合的。但是,我知道,在嵌入式领域,对于空间敏感的地方会使用较多的联合,但是现在手机都快8G运存了,哎!
以下是书中归纳的联合与结构体的区别:
联合本质上是一个成员相互重叠的结构,某一时刻 你只能使用一个成员(也可以从一个成员写入,然后从另一个成员读出,来检查某种类型的二进制模式,或者用不同的方法解释他们,但很明显,这样跟机器紧密相关)。联合的大小是他的最大成员的大小,二结构的大小是成员大小之和。
3.枚举
枚举和#define 只有很小的区别,C标准表明枚举是整形,枚举常量是int型的,因此他们都可以和其他整型类别自由混合而不会出错,
枚举的优点 :自动赋值。
一个例子,说明三者如何玩起来
#include <stdio.h>
#include <stdlib.h>
struct student;
struct action;
typedef void (*action_pf)();//函数指针类型声明
typedef struct student //学生结构体
{
char* name;
int num;
}stu_ST;
//枚举学生行为
typedef enum {UNKOWN,DOEXAM,DOSTUDY,ACTION_NULL} actionCode;
//行为枚举与行为函数的对应结构体
typedef struct type_2_action
{
actionCode actionType;
action_pf pf;
}typeAction_ST;
//行为函数
void do_exam(stu_ST* su)
{
printf("the No.%d student %s is examing\n",su->num,su->name);
}
void do_study(stu_ST* su )
{
printf("the No.%d student %s is studying\n",su->num,su->name);
}
//关联结构体初始化
typeAction_ST ac[] = {
{DOEXAM,do_exam},
{DOSTUDY,do_study}
};
int main()
{
stu_ST st = {"stultz Lee",1};//一个学生结构体的初始化
int i = 0;
//当行为类型为DOEXAM时,执行该函数
for (;i < sizeof(ac)/sizeof(ac[0]);++i)
{
if(ac[i].actionType == DOEXAM)
ac[i].pf(&st);
}
return 0;
}
输出结果:the No.1 student stultz Lee is examing
说明:以上代码 很刻意地使用了文中提到的所有内容,仅供参考。实际编码比这段代码要精炼些。有机会会列出来。
你必须知道的495个C语言问题,学习体会二的更多相关文章
- 你必须知道的495个C语言问题,学习体会一
C语言作为一门古老的语言,其灵活性和容易出错都让人 又爱又恨,书籍<你必须知道的495个C语言问题>,使用问答的形式,告诉读者 C语言使用的各个方面的知识,包括一些冷知识等.以下,我要摘录 ...
- C语言学习书籍推荐《你必须知道的495个C语言问题》
萨米特 (Steve summit) (作者), 孙云 (译者), 朱群英 (译者) 下载地址:点我 <你必须知道的495个C语言问题>以问答的形式组织内容,讨论了学习或使用C语言的过程中 ...
- 《你必须知道的495个C语言问题》知识笔记及补充
1. extern在函数声明中是什么意思? 它能够用作一种格式上的提示表明函数的定义可能在还有一个源文件里.但在 extern int f(); 和 int f(); 之间并没有实质的差别. 补充:e ...
- 你必须知道的495个C语言问题,学习体会四
本文,我们来学习下指针,这是个梦魇啊.无数次折磨着C语言学习者,无数次的内存泄露,无数次的访问失败,无数次的越界溢出, 这些错误造就的仅仅是一个 跟随者,真正的优秀者必须要正视语言的局限,同时在最大限 ...
- 你必须知道的495个C语言问题,学习体会三
本文是 本系列的第三篇,本文主要对C语言的表达式做个小结 先从两个坑爹的表达式说起:i++ 与++i 上大学的时候,学长告诉我,这两个表达式,意义是一样的,后来老师纠正说,还是有区别的,于是让我们记住 ...
- 你必须知道的495个c语言问题(笔记)
1.1我该如何决定使用哪种整数类型? 用到较大的数用long:空间很重要(例如有很大的数组或很多的结构)用short:此外用int. win32: int 32bit 4byte char 8b ...
- 《你必须知道的495个C语言问题》读书笔记之第11-14章:ANSI C标准、库函数、浮点数
一.ANSI C标准 1. ANSI向C语言预处理器引入了几项新的功能,包括“字符串化”操作符(#).“符号粘贴”操作符(##).#pragma指令. 2. Q:char a[3] = "a ...
- 《你必须知道的495个C语言问题》读书笔记之第8-10章:字符串、布尔类型和预处理器
一.字符和字符串 1. Q:为什么strcat(string, '!')不行? A:strcat()用于拼接字符串,所以应该写成strcat(string, "!")." ...
- 《你必须知道的495个C语言问题》读书笔记之第4-7章:指针
1. Q:为什么我不能对void *指针进行算术运算? A:因为编译器不知道所值对象的大小,而指针的算法运算总是基于所指对象的大小的. 2. Q:C语言可以“按引用传参”吗? A:不可以.严格来说,C ...
随机推荐
- 与进程相关的命令ps、kill
一.概述 Ubuntu中主要有如下操作进程的命令 二.进程查看命令 ps 2.1 ps –l PPID:父进程的 PID PID:进程的PID S:进程状态,S:是指sleep睡眠状态:T:是挂起状态 ...
- 单例模式及getInstance()的用法
一般在单例模式下使用.getInstance()创建对象:但并不是所有有私有构造方法,对外通过getInstance方法提供 实例的情况就是单例模式. 注:单例模式:一个类有且只有一个实例.1,一个私 ...
- 菩提树下的杨过.Net 的《hadoop 2.6全分布安装》补充版
对菩提树下的杨过.Net的这篇博客<hadoop 2.6全分布安装>,我真是佩服的五体投地,我第一次见过教程能写的这么言简意赅,但是又能比较准确表述每一步做法的,这篇博客主要就是在他的基础 ...
- git常用命令【转】
先上一个git常用命令图片 Git配置 1 2 3 4 5 6 7 8 9 git config --global user.name "robbin" git config ...
- MySQL性能优化之max_connections参数
很多开发人员都会遇见”MySQL: ERROR 1040: Too many connections”的异常情况,造成这种情况的一种原因是访问量过高,MySQL服务器抗不住,这个时候就要考虑增加从服务 ...
- 在 CentOS 7.0 上安装配置 Ceph 存储
来自: https://linux.cn/article-6624-1.html Ceph 是一个将数据存储在单一分布式计算机集群上的开源软件平台.当你计划构建一个云时,你首先需要决定如何实现你的存储 ...
- [Bzoj]5343: [Ctsc2018]混合果汁
5343: [Ctsc2018]混合果汁 题目描述 小 R 热衷于做黑暗料理,尤其是混合果汁. 商店里有 \(n\) 种果汁,编号为 \(0,1,\cdots,n-1\) .\(i\) 号果汁的美味度 ...
- Hive-行转列(explode)
场景:通过parseHtml UDF解析一串HTML,返回一以 @@ 分割的字符串,使用split分割字符串进数组中,然后将数组的元素转列. 开始的写法 SELECT id, legal_person ...
- Spring中Value注解的使用
Spring中Value注解的使用 分类: Spring2014-08-16 17:28 2985人阅读 评论(0) 收藏 举报 有的时候我们定义了Properties文件,并且使用Spring的Pr ...
- JQuery -- Validate, Jquery 表单校验
1. Jquery 表单验证需要插件 jQuery validation 1.7 ---验证插件需要:jQuery 1.3.2 或 1.4.2版本 http://jquery.bassistance ...