编程技术是改变世界的力量。
本站
当前位置:网站首页 > 后端语言 > 正文

C\C++语言9|复合(构造)数据类型:结构体和联合体

gowuye 2024-04-25 04:40 5 浏览 0 评论

数据类型包括基本数据类型和结构数据类型:

基本数据类型:其值不可以理解为其它类型,也就是说,它是自我说明的;

构造数据类型:由若干成员或元素(基本数据类型或构造数据类型)构成的复合数据类型,分为数组类型、结构体类型、联合类型;

对于批量数据,相同类型的数据可以使用数组,如一年12个月的天数,有存储的规律性或连续性,通过数组下标体现出来(通过数组名和下标访问)。不同基本类型的批量数据可以使用结构体或联合体。另一种批量数据处理的方式是链表,在结构体中包含数据域和指针域,通过指针将单个数据连续起来。

1 结构体struct

结构体,可以将多个数据集中到同一个对象,当然也是集中存储,但数据的访问通过属性(成员)名体现出来(通过结构体实例名+属性名访问)。

当我们考虑怎么逻辑地组织数据时,应该将一个人的所有信息项放在一起,即保持相关性。

一旦定义了一个结构体类型的变量,系统在分配内存时就会分配一块连续的空间,依次存放它的每一个分量。这块空间总的名字就是结构体变量的名字,内部还有各自的名字。

引入结构体可以将一组逻辑上相关的变量组合成一个有机的整体,表达更复杂的对象。

结构体类型定义是告诉C或C++这种类型的变量是如何组成的,需要多少空间。结构体变量的定义是告诉C++程序中需要存储和处理一个某结构体类型的变量,这时C++根据结构体类型的定义为这个变量分配空间。

结构体类型允许程序员把一些分量聚合成一个整体,用一个变量表示。
一个结构体的各个分量都有名字,把这些分量称为成员(member)。
由于结构体的成员可以是各种类型的,程序员能创建适合于问题的数据聚合。

可以在定义结构体类型的同时定义指向结构体的指针或变量。

结构体类型是存储空间尺寸的描述,不会预先分配内存空间。
结构体实例化的元素与对象的属性其实质也是变量,只是其隶属于某个集合而已。
结构体变量名是大内存空间的地址,而元素是其中小内存空间的地址。
结构是一个或多个变量的集合,该集合有一个单独的名称,便于操作。与数组不同,结构可以储存不同类型(C语言的任意数据类型,包括数组和其他结构)的变量。结构中的变量被称为结构的成员(member)。

C遵循的基本的内存布局假设:通过对象的基地址和数据成员的偏移量获取数据成员的地址

编译器会自动对齐结构体数据成员以提高运行效率。结构体的字节对齐是指编译器在为结构体变量分配内存时,保证下一个成员的偏移量为成员类型的整数倍。因此,对于一些结构体变量来说,其大小并不等于结构体中每一个成员大小的总和。

第一个成员的地址与整个结构的地址相同。

结构体中也使用构造函数:

如果不使用构造函数也是可以的,只定义一般的结构体,里面包含两个参数:

struct Node{
int u,step; // u为顶点,step为源点到顶点u的最短路径
};

那么在变量参数赋值时,需要这样赋值:

Node vs ; //先定义一个Node结点类型变量
vs.u =3 ,vs.step = 5; //分别对该变量的两个成员进行赋值

采用构造函数的形式定义结构体:

struct Node{
 int u,step;
 Node(){};
 Node(int a,int sp){
 u = a; //参数传递u为顶点
 step = sp; //参数传递step为源点到顶点u的最短路径
 }
};

则变量参数赋值就可以直接通过参数传递:

Node vs(3,5)

上面语句等价于:

vs.v =3 ,vs.step = 5;

C11允许采用(type_name){xx,xx,xx} 类似于 C++ 的构造函数的形式构造匿名的结构体。

struct test1
{
	int a[3],b;
} foo[] = { [0].a = {1}, [1].a = 2 };

复合字面量:初始化结构的时候允许对特定的元素赋值,形式为:

struct test2{int a, b, c, d;} 
foo2 = { .a = 1, .c = 3, 4, .b = 5 }; // 3,4 是对 .c,.d 赋值的

储存一年来看过的所有电影的信息,应该用什么样的数据结构:用一个结构体存储一部电影的所有信息,用一个数组来存储看过的电影。也就是数组元素是结构体,表示电影信息。如果想储存不同用户的数据呢?数组表示用户,用数组的数组存储,最后的元素是结构体。

在C++中,结构体是纯数据的定义,如果还涉及到这些数据的操作,则更建议考虑类类型;

在结构体中使用函数指针,相当于在结构体中加入了类的成员函数。
结构体和类都是对基本类型的扩展,用于提高编程的颗粒度。

2 联合体Union

共用体类型提供了一种机制,使得多个变量(共用体中的成员)可以共享同一个内存地址。

当定义一个共用体变量时,编译器会根据共用体成员中占用最多内存空间的变量分配空间,这样使得共用体中所有成员的都能够获得足够的空间。

联合体是一种数据格式,可以同时保存不同的数据类型,但一次只能保存一种类型,也就是保存了一种数据类型之后,对之前保存的数据类型会自动丢弃掉。也可以理解为对一块数据内存针对不同的类型进行不同的解码。

union one4all
{
 int int_val;
 long long_val;
 double double_val; //整个共用体根据成员中占用最多内存空间的变量分配空间
};
one4all pail;
pail.int_val = 15; // store an int
cout << pail.int_val;
pail.double_val = 1.38; // store a double, int value is lost
cout << pail.double_val;

联合可以保存单个值,但它可以是多种类型,成员名称指示正在使用的模式。

共用体类型数据的特点:

(1) 同一个内存段可以用来存放几种不同类型的成员,但在每一瞬时只能存放其中一种,而不是同时存放几种。

(2) 共用体变量中起作用的成员是最后一次存放的成员,在存入一个新的成员后原有的成员就失去作用。

(3) 共用体变量的地址和它的各成员的地址都是同一地址。

例如,设有若干个人员的数据,其中有学生和教师。

学生:姓名、号码、性别、职业、班级。

教师:姓名、号码、性别、职业、职务。

学生和教师的数据分量只有班级和职务的差别,为此可以定义一个相同的结构体,其中用一个共用体来表示班级和职务的差别:

struct
 {
 int num;
 char name[10];
 char sex;
 char job;
 union
 {
 int banji;
 char position[10];
 }category;
 }person[2];/*先设人数为2*/

-End-

相关推荐

Nginx 响应提速10倍,你需要知道的缓存性能优化——FastCGI调优
Nginx 响应提速10倍,你需要知道的缓存性能优化——FastCGI调优

Nginx缓存优化是帮助大家提升网站性能的重要操作之一,proxy_cache主要用于反向代理时,对后端内容源服务器进行缓存;fastcgi_cache主要用于...

2024-05-20 14:44 gowuye

王者荣耀天魔缭乱和逐梦之音返场活动地址 3月22日开启返场活动
王者荣耀天魔缭乱和逐梦之音返场活动地址 3月22日开启返场活动

王者荣耀官方终于确定了天魔缭乱和逐梦之音的返场活动,这让不少小伙伴乐开了花,返场活动将会在3月22日开启,下面就带来王者荣耀天魔缭乱和逐梦之音返场活动地址!王者...

2024-05-20 14:44 gowuye

常见的嵌入式web服务器有哪些?

嵌入式WEB服务器常见的有:Lighttpd,Shttpd,Thttpd,Boa,Mini_httpd,Appweb,Goahead。Lighttpd地址:http://www.light...

简述几款常见的嵌入式web服务器
简述几款常见的嵌入式web服务器

嵌入式web服务器,是web服务器当中的一种,是基于嵌入式系统而实现的web服务器。指的是在嵌入式系统(通俗点就是单片机系统)上实现的一个web服务器,可以通过...

2024-05-20 14:44 gowuye

教你如何利用fastcgi_cache缓存加速WordPress

在使用nginx缓存之前,必须在nginx里面加载专门的模块,这个模块叫做ngx_cache_purge。添加ngx_cache_purge模块下载ngx_cache_purge模块ngx_cache...

扫描WordPress漏洞

检测已知漏洞WPScan是一款广泛使用的WordPress安全扫描工具,它的一项重要功能是检测已知漏洞。在这篇文章中,我们将深入探讨WPScan如何检测已知漏洞,并结合实际示例,帮助读者更好地理解和应...

消灭 Bug!推荐几个给力的开源 Bug 跟踪工具
消灭 Bug!推荐几个给力的开源 Bug 跟踪工具

在这个充满bug的世界里,最遥远的距离不是生与死,而是你亲手制造的bug就在你眼前,你却怎么都找不到它。因此本文准备了7款优秀的开源bug跟踪系...

2024-05-20 14:43 gowuye

生物信息分析入门全攻略

生物信息学是生命科学研究的重大前沿领域,未来将占据生命科学研究的半壁江山。已经有越来越多的小伙伴投入到生物信息的学习中,但是入门难、深入慢、摸不到方向等都成为持续学习的拦路虎。本文根据生物信息技术大牛...

elkb实践经验,再赠送一套复杂的配置文件
elkb实践经验,再赠送一套复杂的配置文件

原创:小姐姐味道(微信公众号ID:xjjdog),欢迎分享,转载请保留出处。宝剑锋从磨砺出,梅花香自苦寒来。诗人白居易,三月下江南,看到沿路开放的桃花,心潮澎湃...

2024-05-20 14:43 gowuye

超详细从0到1 搭建ELK监控
超详细从0到1 搭建ELK监控

监控分类?Metrics用于记录可聚合的数据。例如,1、队列的当前深度可被定义为一个度量值,在元素入队或出队时被更新;HTTP请求个数可被定义为一个计数器,...

2024-05-20 14:42 gowuye

嵌入式开发 之Web配置页面开发
嵌入式开发 之Web配置页面开发

1.PHP是最好的语言??开发动态页面首选的语言是PHP,村村不能在这里忽悠人,如果你的硬件性能允许切略懂PHP,看到这里就可以退出了。本文面向的受众是Linu...

2024-05-20 14:42 gowuye

Python开发一个网站目录扫描工具用来检测网站是否有漏洞?
Python开发一个网站目录扫描工具用来检测网站是否有漏洞?

开发一个网站目录扫描工具是用来检测网站是否有非法目录请求的一个常见需求之一,我们要通过这个扫描工具来找到通过某个域名可以访问到的网站路径,可能对于有些系统来讲,...

2024-05-20 14:42 gowuye

创建一个类似Youtube的Id——使用PHP/Python/JS/Java/SQL

id通常都是用数字,不巧的是只有10个数字来使用,所以如果你有很多的记录,id往往变得非常冗长。当然对于计算机来说无所谓,但我们更希望id尽可能短。所以我们如何能使id变短?我们可以利用字母让它们附加...

快速云:有助于移动应用安全开发的五条妙计
快速云:有助于移动应用安全开发的五条妙计

许多企业不断地向其开发团队提供培训。但是某些漏洞,如早在十多年前就发现的SQL注入,如今仍广泛存在于各种应用中。因而,安全培训永不过时。在开发移动应用时,开发者...

2024-05-20 14:41 gowuye

洛杉矶国际电影节最佳动画短片奖影片《G’DAY》正式全网上映
洛杉矶国际电影节最佳动画短片奖影片《G’DAY》正式全网上映

7月2日,由M&CSaatchi创作,由深受好评的澳大利亚导演迈克尔·格雷西执导的动画短片《G’day》,正式在全网上映。该影片因其出色的创意赢得了洛...

2024-05-20 14:41 gowuye

取消回复欢迎 发表评论: