C语言-结构体-联合体

结构体

在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

枚举,就先到这里。

时间: 2024-10-11 23:13:03

C语言-结构体-联合体的相关文章

C语言 结构体(联合体)对齐规则

/* 结构体(联合体)对齐规则 */ #include <stdio.h> #include <stdlib.h> #include <string.h> /* * 原则1.第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储). * 原则2.结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最宽基本类型大小的整数倍地址开始存储. *原则3.结构

不可或缺 Windows Native (8) - C 语言: 结构体,共用体,枚举,类型定义符

[源码下载] 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 结构体 共用体 枚举 类型定义符 示例cStruct.h #ifndef _MYHEAD_STRUCT_ #define _MYHEAD_STRUCT_ #ifdef __cplusplus extern "C" #endif char *demo_cStruct(); #endif cStruct.c /* * 结构体,共用体,枚举,类型定义符 * * 注:结构体变量在做参数传递时,其内每个

C语言 结构体指针赋值 incompatible types when assigning to type &#39;char[20]&#39; from type &#39;char *&#39;

strcpy(pstudent->name, "guo zhao wei "); 为什么错误,该怎么写,(红色行) 追问 为什么不能直接赋值啊, 追答 用char nnnn[20]定义的,用strcpy 用char *ppp定义的,用=来赋值 C语言 结构体指针赋值 incompatible types when assigning to type 'char[20]' from type 'char *'

漫谈C语言结构体struct、公用体union空间占用

先用代码说话: #include<stdio.h> union union_data0{ int a ;//本身占用4个字节 char b ;//本身占用1个字节 int c ; }; union union_data1{ short a;//本身占用2个字节 char b[13];//本身占用13个字节 int c ;//本身占用4个字节 }; struct struct_data{ int a ;//int本身占用4个字节,偏移量为0 char b ;//char本身占用1个字节,偏移量为

C语言结构体,C语言结构体指针,java对象引用,传值,传地址,传引用

C语言结构体,C语言结构体指针,java对象引用,传值,传地址,传引用 传值 把实参的值赋值给行参 那么对行参的修改,不会影响实参的值 传地址 传值的一种特殊方式,只是他传递的是地址,不是普通的如int 那么传地址以后,实参和行参都指向同一个对象 传引用 真正的以地址的方式传递参数 传递以后,行参和实参都是同一个对象,只是他们名字不同而已 对行参的修改将影响实参的值 所谓变量是内存地址的一个抽象名字,在静态编译的程序中,所有变量名都会在编译时转换成内存地址,机器不知道变量名,只知道地址. C 语

C语言结构体(struct)常见使用方法(转)

本文转自 CSDN huqinweI987 基本定义:结构体,通俗讲就像是打包封装,把一些有共同特征(比如同属于某一类事物的属性,往往是某种业务相关属性的聚合)的变量封装在内部,通过一定方法访问修改内部变量. 结构体定义: 第一种:只有结构体定义 [cpp] view plaincopy struct stuff{ char job[20]; int age; float height; }; 第二种:附加该结构体类型的“结构体变量”的初始化的结构体定义 [cpp] view plaincopy

C语言结构体赋初值

C语言结构体赋初值,特别是结构体中含有数组成员是,最后一个逗号最好是不要多写.因为有些时候可能会出错.图中,红色的框框处.

读陈浩的《C语言结构体里的成员数组和指针》总结,零长度数组

原文链接:C语言结构体里的成员数组和指针 复制如下: 单看这文章的标题,你可能会觉得好像没什么意思.你先别下这个结论,相信这篇文章会对你理解C语言有帮助.这篇文章产生的背景是在微博上,看到@Laruence同学出了一个关于C语言的题,微博链接.微博截图如下.我觉得好多人对这段代码的理解还不够深入,所以写下了这篇文章. 为了方便你把代码copy过去编译和调试,我把代码列在下面: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #include <stdio.h>

c 语言 结构体

结构体初学者都有点小怕其实思维清晰之后你会发现结构体是个非常好的东西,嘿嘿. 第一,结构体的定义和初始化.别被书上大量的描述吓到 1.怎么定义结构体了例子如下,我们以构建一个包含学生姓名,年龄,Email为例子 1 struct 2 { 3 char name; 4 int age; 5 char Email; 6 }person; 现在我们定义就已经完成了,当然这是我最喜欢的范式,你们也可以在书上找到自己喜欢的. 2.怎么初始化了?结构体一般初始化都是以结构体数组的形式来的所以我们只说这个 t