zoukankan      html  css  js  c++  java
  • 结构体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

    枚举,就先到这里。

  • 相关阅读:
    day1 UnicodeEncodeError: 'gbk' codec can't encode character 'xa0' in position 2490: illegal multibyte sequence 错误提示
    day2 Opencv + image
    day1 Opencv安装 python 2.7 (32位)
    2 oracle 实现上下键翻历史命令 rlwrap
    Windows下安装RaibbitMQ
    1. oracle12C的安装
    《万达哲学》------王健林
    MongoDB常用命令
    MongoDB让人恶心的配置
    MongoDB介绍及下载与安装
  • 原文地址:https://www.cnblogs.com/lixuejian/p/13150731.html
Copyright © 2011-2022 走看看