C语言-结构体struct-联合体union-枚举enum
结构体
在Java中,我们要表示一个复合的数据类型就会使用对象去封装。而C就有结构体。
结构体是C语言中自定义的数据类型,是一组变量的集合,有别于数组,数组仅限于同一种数据类型,而结构体可以是任何数据类型,包括数组。结构体里面的每一个变量或者数组都是结构体的成员。
下面来看看结构体的基本使用
14-18行,定义了一个名称为Person的结构体,结构体里面有 age,money,sex 三种数据类型;
20-24行,是结构体的声明一个名为 P 的 Person 变量,并赋值;
25-27行,是结构体的基本使用,从中可以看出的是,结构体取值的时候和Java中极为相似,都是中间 . 的形式进行取其中某个变量的值。
下面来看一下结构体指针的使用。
29-30行,定义了一个结构体指针,名为 pi,并将结构体变量 p 的地址赋值给 pi 。
32行,结构体指针的使用,既然 pi 是结构体 p 的指针,那么,取结构体那就是前面加个 * 咯,就这么简单,照葫芦画瓢嘛,现在取到了结构体 p,那么去 p 里面的就简单了,直接使用前面的方式中间加个 . 即可;
33行,则是指针结构体的另一种使用方式,直接使用 -> 就可以取里面相应的值了,比32行的方式是不是假单很多呢?
结构体的长度
结构体和结构体指针都说完了,最后来看一下结构体的长度。
长度简单嘛,直接把里面的累加不就得了,int 和 float 都是占 4 个字节,而 char 占 1 个字节,那么就直接加起来就是 9 不就得了。
到底是不是,验证一下就知道咯。
看,打印出来的结果是12,咦,怎么那么奇怪,难道 char 也占 4 个字节?
没错,就是这样,char 也是占 4 个字节,为什么呢?因为里面的其他两个变量的长度都是 4,那么把里面的 char 也定义成 4 个字节,这样可以方便的指针偏移。
但这不是绝对的,同样的代码,执行的结果也不一样,这和编译器以及运行环境的不一样,哈哈。
这里需要注意的是,虽然都是4个字节,前面也说了这样是为了方便指针的偏移,那么自然的就想到指针的加减操作,那么我们就这样使用行不行?
如果我要取它的money字段,那么我就这样:printf("%f",*(p+1)); 行不行呢?不行,自己可以去尝试一下!
最后附上结构体的三种写法:
代码里面注释写的也比较清楚了,这里就不再多说了,结构体的介绍到此结束,下面来看联合体
联合体:
结构体搞懂了,联合体就简单了。
联合体和结构体很相似,结构体的关键字是 struct 而联合体的关键字是 union 。看代码:
这看起来和结构体没什么差别嘛。没差别就不会出现联合体咯。所以再看下面的代码:
接上面的代码,第一行的打印结果是12,这个不用过多的解释,然后当你去给联合体中的 money 去赋值之后,你再打印一下 age 的值,你就会发现,age 的值已经完全不对了,而你再去打印一下 money 的值,你就会发现 money 的值是对的。
所以,这就是两者的区别,结构体里面的数据是会不断的覆盖的,而结构体里面的数据是相互独立的。
现在问题来了,联合体的长度是多少呢?还是累加?累加就没有意义了,占那么大的内存存那么少的数据是得不偿失的,所以,联合体的长度就是取该联合体中最长的一个变量的长度。
联合体的介绍也就到这里。
结构体和联合体都介绍完了,最后来介绍一个枚举,枚举就是穷举,也就是说,只能是这里面的值中的某一个,不可能是其他。
看看代码:
14-17行是枚举类型的声明;
19行是定义并赋值;
20行是打印结果,打印的结果为什么会是int 类型的值呢?又为什么是 1 呢?
这很简单,枚举是穷举,那么就是有限的,而不是无限的,既然是有限的,那么里面就会对枚举的每一个值进行编号,像数组一样,从0开始 编号,这就是为什么打印出来的值是int,为什么是1呢?因为Monday在枚举中的排行是第2啊,就这么简单。
当然,如果你不喜欢从0开始编号,也可以自定义一个初始值:
从代码上可以看到,枚举不仅可以自己自定义起始的值,中间也可以重新自定义,并且后面的也会依次的+1
枚举,就先到这里。
C语言-结构体struct-联合体union-枚举enum的更多相关文章
- Android For JNI(五)——C语言多级指针,结构体,联合体,枚举,自定义类型
Android For JNI(五)--C语言多级指针,结构体,联合体,枚举,自定义类型 我们的C已经渐渐的步入正轨了,基础过去之后,就是我们的NDK和JNI实战了 一.多级指针 指针的概念我们在前面 ...
- 漫谈C语言结构体struct、公用体union空间占用
先用代码说话: #include<stdio.h> union union_data0{ int a ;//本身占用4个字节 char b ;//本身占用1个字节 int c ; }; u ...
- Go语言结构体(struct)
Go 语言结构体 Go 语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型. 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合. 结构体表示一项记录,比如保存图 ...
- C语言结构体-struct
知识点: 1)结构体的定义. 2)结构体的sizeof. 3) 结构体的指针. 1) 结构体的定义: 在逻辑上有一定关联的多个数据类型做为一整体进行操作的数据结构,它的关键字是struct.下面我将 ...
- C语言 - 结构体(struct)比特字段(:) 详细解释
结构体(struct)比特字段(:) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26722511 结构体(struc ...
- android109 结构体,联合体,枚举,自定义
#include <stdio.h> #include <stdlib.h> void study(){ printf("吃饭睡觉打李志\n"); } // ...
- C++-结构体,联合体,枚举,的区别
结构体: struct NUM { int number; }a; 结构体是声明只是一个模型,没有分配内存空间.当进行定义结构体变量后才分配内存空间 联合体: union data { int a ...
- C 语言结构体 struct 及内存对齐
struct 结构体 对于复杂的数据类型(例如学生.汽车等),C 语言允许我们将多种数据封装到一起,构成新类型. 跟面向对象语言中的对象相比,结构体只能包含成员变量,不支持操作. #include & ...
- c 语言结构体struct的三种定义方式 及 typedef
struct 结构体名{ 成员列表: ..... }结构体变量: 结构体类型变量的定义 结构体类型变量的定义与其它类型的变量的定义是一样的,但由于结构体类型需要针对问题事先自行定义,所以结构体类型变量 ...
随机推荐
- Sublime Text 3 快捷键
选择类Ctrl+D 选中光标所占的文本,继续操作则会选中下一个相同的文本.Alt+F3 选中文本按下快捷键,即可一次性选择全部的相同文本进行同时编辑.举个栗子:快速选中并更改所有相同的变量名.函数名等 ...
- junit的学习
junit 是一种单元检测的工具包,他能解决的问题主要是有两点 : 1. 不用将方法都调到main方法去执行一次来看结果 2. 测试的结果可以不用我们人工去对比,这里主要使用的是junit的断言类 ...
- iframe中positioin:fixed失效问题
页面中嵌套的iframe 内的 position:fixed元素定位失效fixed正常页面 此时position:fixed是根据浏览器窗口定位的,下拉一直位于左上角:以iframe形式嵌入后 此时p ...
- [转]oracle 分析函数over
oracle 分析函数over 分析函数(OVER) 目录: =============================================== 1.Oracle分析函数简介 2. O ...
- SilverLight抛出 System.InvalidOperationException: 超出了2083 的最大URI
在SilverLight中对于抛出 System.InvalidOperationException: 超出了 2083 的最大 URI 长度 的异常 处理 其实很简单 在 EntityFramewo ...
- Nginx 正向代理
目前现状:只有1个机器能上网(web),其他机器不能 方法:能上网的做一个代理web服务器中转,其他机器连接它即可.采用nginx Nginx配置如下: server{ resolve ...
- 浅谈ajax
Ajax 回顾 最本质的 ajax 其实是这样的: function Ajax(){ var xmlHttpReq = null; if (window.ActiveXObject){//IE5 IE ...
- LintCode 78:Longest Common Prefix
public class Solution { /** * @param strs: A list of strings * @return: The longest common prefix ...
- AngularJS中的route可以控制页面元素的改变,使多页面变成一个单页面。。。
SPA(Single Page Application)指的是通单一页面展示所有功能,通过Ajax动态获取数据然后进行实时渲染,结合CSS3动画模仿原生App交互,然后再进行打包(使用工具把Web应用 ...
- 通过arcgis在PostgreSQL中创建企业级地理数据库
部署环境: Win7 64位旗舰版 软件版本: PostgreSQL-9.1.3-2-windows-x64 Postgis-pg91x64-setup-2.0.6-1 Arcgis 10.1 SP1 ...