C/C++中的struct结构体详细解读

 更新时间:2023年10月31日 09:41:02   作者:大庆指针  
这篇文章主要介绍了C/C++中的struct结构体详细解读,结构体是由一批数据组合而成的结构型数据,组成结构型数据的每个数据称为结构型数据的“成员”,其描述了一块内存区间的大小及意义,需要的朋友可以参考下

struct(结构体)

结构体是由一批数据组合而成的结构型数据。组成结构型数据的每个数据称为结构型数据的“成员”,其描述了一块内存区间的大小及意义。

结构体的意义在于可以将一堆类型不一的数据打包在一块使用,例如学生成绩表有int类型的学号、班级还有string类型的名字、还有float类型的成绩,这个功能和class的作用类似,class是将数据、函数等等的东西经行封装。

struct Student_mark   //struct+结构体名字{ 数据成员 };
{
	//数据成员
	string name;
	int sno;
	int stuclass;
	float mark;
};

在这里A就是一个我们创建的类型名这个类型我们通常称之为结构标记符就类似int、char等等的类型名,使用这个类型也是和一般的类型差不多。

struct的定义有三种方式

struct的定义位置也是和普通类型是一样的,如果是在函数外面定义的那么所有函数都可以使用,如果是在函数里定义的那么就只能在该函数内使用了,类似于局部变量和全局变量。 class也有类似的性质,class也可以在函数中定义也是只能在函数中使用(但是不推荐没什么用)。 在初始化这一块我们需要注意的是在c语言中我们不能直接在结构体中初始化成员,而在c++中结构体可以直接初始化。

1. 创建结构和声明变量分开

struct Student_mark
{
	string name;
	int sno;
	int stuclass;
	float mark;
};
int main()
{
	//struct+结构体名 +变量名 这是常用的定义变量方法
	struct Student_mark a = {"xl",1,0101,100.00};
	cout << a.sno << " " << a.mark << " " << a.name[0] << a.name[1];
	return 0;
}

可以通过创建的变量来为其赋值,这种方法来创建结构体和该类型的变量是比较好的也是在后序的使用中也不会丢失。

2. 在创建结构后直接声明变量

struct Student_mark   //struct+结构体名字{ 数据成员 };
{
	//数据成员
	string name;
	int sno;
	int stuclass;
	float mark;
} s={"xl",1,0101,100.00};//可以像这样直接初始化

3. 创建结构时没有写结构体名(匿名创建)在结构体后面声明变量

struct 
{
	string name;
	int sno;
	float mear;
}s = {"xm",1,100.00};

这种声明比起前两种缺点是只能用一次,只有这一个变量可以用后序想要这个类型的其他变量就得再重新创建一个结构体再申请一个变量。这么做只会使得原本复杂的程序上更加繁琐,所以不是很推荐这么初始化结构体,除非有什么特殊要求例如不想要他人修改或者创建时。

struct访问结构成员的权限

在c语言和c++中struct的默认访问权限都是public,c语言中不可以改变就像是普通变量在作用域中的所有函数都可以使用,而在c++中struct的访问权限就可以像class一样可以改变的。 如何使用struct的结构成员,它的使用和class的使用是一样的通过点运算操作符来实现对成员的使用。

结构体对齐

在系统默认的对齐方式下:每个成员相对于这个结构体变量地址的偏移量正好是该成员类型所占字节的整数倍,且最终占用字节数为成员类型中最大占用字节数的整数倍。

struct Stuend_mark
{
	int sno;
	char name;
	float mark;
};
int main()
{
	cout << sizeof(p)<<endl;
	return 0;
}

sno的偏移量为0(0=40),name的偏移量为4(4=14),mark的偏移量为8(8=24),此时占用12字节,也同时满足12=34.所以sizeof(Stu)=12.

结构体继承

其实我们一直有在说C语言和C++中struct的一些区别,在继承这方面C语言和C++也有很大的区别,在C语言中结构体是不能被继承的也不能继承别人,而在c++中结构体不仅可以继承结构体还可以继承类。在继承是也要注意默认权限的问题。

struct A
{
	int a;
	float b;
	char c;
};
struct B :A {};
class C:B {};
struct D:C{};//这些都是允许的

结构体成员的使用

在使用结构体中的成员是我们知道了可以通过点运算符来实现,除了这个方法外还有一种就是结构体指针的方式来访问。 结构体指针就是使用一个结构体类型的指针变量来指向结构体变量。注意这里是结构体变量。

    A a = {1,1,1};
	A *p = &a;
	cout << (*p).sno << p->mark;

在这里为什么加上()是因为点运算符的优先级是高于*的所有这里不加括号代表的含义是先(p.sno)后解引用,所以不能这么使用,为了使用方便和直观可以直接使用p->sno。

到此这篇关于C/C++中的struct结构体详细解读的文章就介绍到这了,更多相关C/C++中的struct结构体内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • springboot导入多个配置文件的方法实践

    springboot导入多个配置文件的方法实践

    Spring Boot 2.4.x引入了新的配置导入方式,通过spring.config.import属性可以灵活地导入多种类型的配置文件,本文就来介绍一下,感兴趣的可以了解一下
    2024-11-11
  • 详解如何使用tldb数据库的java客户端

    详解如何使用tldb数据库的java客户端

    这篇文章主要为大家介绍了如何使用tldb数据库的java客户端过程示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • SpringBoot解决数据库时间和返回时间格式不一致的问题

    SpringBoot解决数据库时间和返回时间格式不一致的问题

    这篇文章主要介绍了SpringBoot解决数据库时间和返回时间格式不一致的问题,文章通过代码示例和图文结合的方式讲解的非常详细,对大家的学习和工作有一定的帮助,需要的朋友可以参考下
    2024-03-03
  • Java利用VLC开发简易视屏播放器功能

    Java利用VLC开发简易视屏播放器功能

    这篇文章主要介绍了Java利用VLC开发简易视屏播放器,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-08-08
  • spring cloud服务之间的调用之ribbon详解

    spring cloud服务之间的调用之ribbon详解

    关于spring-cloud的服务调用,我们首先需要了解它的两个核心组件Ribbon和Feign。接下来通过本文给大家详细介绍spring-cloud服务之间的调用之ribbon,感兴趣的朋友一起看看吧
    2021-08-08
  • 关于Java float和double精度范围大小

    关于Java float和double精度范围大小

    这篇文章主要介绍了关于Java float和double精度范围大小,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • SpringBoot +MybatisPlus集成多数据源的使用案例

    SpringBoot +MybatisPlus集成多数据源的使用案例

    这篇文章主要介绍了SpringBoot +MybatisPlus集成多数据源的使用案例,本文分步骤结合实例代码给大家讲解的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2025-05-05
  • Spring实战之Bean的作用域request用法分析

    Spring实战之Bean的作用域request用法分析

    这篇文章主要介绍了Spring实战之Bean的作用域request用法,结合实例形式分析了spring中Bean的request作用域相关使用技巧与操作注意事项,需要的朋友可以参考下
    2019-11-11
  • 使用Java和Redis实现高效的短信防轰炸方案

    使用Java和Redis实现高效的短信防轰炸方案

    在当今互联网应用中,短信验证码已成为身份验证的重要手段,然而,这也带来了"短信轰炸"的安全风险 - 恶意用户利用程序自动化发送大量短信请求,导致用户被骚扰和企业短信成本激增,本文将详细介绍如何使用Java和Redis实现高效的短信防轰炸解决方案,需要的朋友可以参考下
    2025-04-04
  • 使用Swagger2实现自动生成RESTful API文档

    使用Swagger2实现自动生成RESTful API文档

    在开发 RESTful API 的过程中,文档是非常重要的一部分,可以帮助开发者了解 API 的功能和使用方法,本文将使用Swagger2 实现自动生成 RESTful API 文档,需要的可以参考一下
    2023-06-06

最新评论