当前位置: 首页 > news >正文

结构体——结构体基本用法,结构体初始化

存储数据时如果需要存储多个数据,我们可以使用数组。而如果同时需要存储多种数据,可以采用结构体的方式存储。

用结构体的方式定义的数据类型是一种构造数据类型(抽象数据类型),是由各种的基本数据类型组成的。结构体弥补了基本数据类型单一性的缺点。

下面的代码展示了声明结构体变量时的一些注意事项:

结构体基础

1. 结构体的基本定义方法

struct Student //结构体名首字母大写,区分变量 { string name; float score; int age; int level; }; //结构体结束,{}外有;表示结束定义

2. 空结构体

struct EmptyStruct //空结构体 { //TODO };

3. 匿名结构体

struct //匿名结构体,不指定结构体名,无法使用该结构体定义变量 { string name; float score; int age; int level; }stu1, stu2; //可以在结束前定义变量,这样的结构体是一次性的

4. 使用typedef

C语言常用typedef关键字定义新的类型名(这里是Student_C)以方便使用。

typedef struct // c语言中不能直接使用Student定义变量,需要使用struct Student表明类型 // 一般使用typedef关键字给struct Student定义一个新的类型名方便调用 { string name; float score; int age; int level; }Student_C;

C++无需typedef,可直接使用定义好的结构体命名来定义结构体变量。

5. 结构体可以多层嵌套

struct Location //嵌套结构体 { int x; int y; int z; }; struct Target //结构体可以多层嵌套 { int index; string name; Location location; }; int main() { Target target1; std::cout << "input a int for target1.location.x: "; std::cin >> target1.location.x; //访问嵌套结构体内容 std::cout << target1.location.x << std::endl; }

结构体初始化和使用

1. 给结构体赋初值

可以在创建结构体变量时用大括号赋值,内部把给变量赋的值按照顺序用逗号隔开。

下面的代码展示了如何创建一个有嵌套结构体的结构体变量并赋值,并且展示了其中内容:

#include <iostream> struct Birthday { int year; int month; int day; }; struct Student //结构体名首字母大写,区分变量 { std::string name; float score; int age; int grade; Birthday birthday; }; int main() { Student student = { "Li", 86.5, 21, 3, {2000, 10, 1} }; std::cout << "student info:" << std::endl << " name: " << student.name <<std::endl << " score: " << student.score << std::endl << " age: " << student.age << std::endl << " grade: " << student.grade << std::endl << " birthday: " << student.birthday.year << "," << student.birthday.month << "," << student.birthday.day << std::endl; }

2. c++中结构体的初始化方法

在定义时初始化:

#include <iostream> struct Data { int x = 1; int y = 1; int z = 1; }; int main() { Data data1{}; Data data2 = {}; Data data3 = { 0 }; std::cout << "data1: x: " << data1.x << " y: " << data1.y << " z: " << data1.z << std::endl; std::cout << "data2: x: " << data2.x << " y: " << data2.y << " z: " << data2.z << std::endl; std::cout << "data3: x: " << data3.x << " y: " << data3.y << " z: " << data3.z << std::endl; }

输出:

data1: x: 1 y: 1 z: 1
data2: x: 1 y: 1 z: 1
data3: x: 0 y: 1 z: 1

在定义结构体时,可以在结构体内直接初始化成员变量,来给结构体成员一个默认值。

在定义结构体时,使用data{}变量名+跟大括号方式初始化,或是使用data={}变量名 + 等于 + 大括号方式初始化,都是直接将结构体初始化为默认值。而使用data = {0}变量名 + 等于 + {0}只能将结构体中的第一个变量初始化为0。

手动初始化:

Data data3; data3 = { 0, 0, 0 };

定义后使用memset初始化:

Data data3; memset(&data3, 0, sizeof(data3));

memset用法:

C 库函数void *memset(void *str, int c, size_t n)用于将一段内存区域设置为指定的值。

其首个参数str为指向要清除内存区域的指针;

中间参数为要初始化的目标值,类型为int,在函数中会自动转化为目标类型;

最后一个参数是要清除区域的大小。

常用sizeof取变量的大小,用&标识符表示变量所在的地址。

给结构体添加一个初始化表或者构造函数:

struct DataIniList { int num1; int num2; int num3; DataIniList() :num1(0), num2(0), num3(0) {} //给结构体添加初始化表 }; struct DataConst { int num1; int num2; int num3; DataConst() //给结构体添加构造函数,在构造函数中手动赋初值 { num1 = 0; num2 = 0; num3 = 0; } };

使用Static关键字:

使用Static关键字,未初始化的变量会被自动赋值0。但是使用static关键字会将变量声明为静态变量。

3. 将结构体作为函数参数

直接将结构体类型放在函数的参数表。

// 打印Student结构体内容的函数,将Student类型结构体作为参数 void printStudentInfo(Student student) { std::cout << "student info:" << std::endl << " name: " << student.name << std::endl << " score: " << student.score << std::endl << " age: " << student.age << std::endl << " grade: " << student.grade << std::endl << " birthday: " << student.birthday.year << "," << student.birthday.month << "," << student.birthday.day << std::endl; } int main() { Student student = { "Li", 86.5, 21, 3, {2000, 10, 1} }; //创建结构体Student类型变量student,并赋初值 Student student2 = { "Zhang", 79.0, 21, 3, {2000, 8, 10} }; printStudentInfo(student); printStudentInfo(student2); }
http://www.jsqmd.com/news/492855/

相关文章:

  • Wincc组态工业加热炉装置组态画面——探索自动化控制的精彩
  • 小学生文旅研学哪家强?4家优质机构盘点,避坑不踩雷 - 品牌测评鉴赏家
  • UEC++Part4--UObject、UgameInstance、actor组件、静态加载
  • 探索声子晶体线缺陷在压电能量收集中的奇妙世界
  • Kmeans算法、最佳聚类数的确定及散点图
  • 9元搞定!阿里云OSS+HTML搭建个人静态网站全流程(含域名备案避坑指南)
  • 咱们今天来盘一盘三相级联H桥的载波移相仿真。直接上硬菜,先看看A相三个H桥怎么玩载波错位。每个H桥的载波相位差120度,这招能把输出波形的纹波压得死死的
  • 信号与系统分析2026(春季)作业参考答案 - 第八次作业
  • 高压下的自我怀疑:当“我的实力配不上经历”成为内心独白,我们该如何理性应对与战略抉择?
  • GO学习日志07
  • 永磁同步电机FOC矢量控制仿真探索:从无感到闭环启动
  • 《QGIS快速入门与应用基础》221:项目面板:布局元素管理
  • deer-flow2本地启动(无make无nginx启动)
  • 滑模控制:解锁复杂系统控制的密码
  • SWD/JTAG Communication Failure的解决方法
  • MATLAB 分步傅里叶法仿真光纤激光器锁模脉冲产生:攻克脉冲漂移难题
  • 地下排水管道缺陷数据集 水下管道缺陷识别 智能识别之管道缺陷识别 管道油污碎屑 结垢沉积物识别 根系侵入数据集 表面损伤、破裂的管道、破裂图像数据集-目标检测图像数据集第10112期
  • YOLO系列算法改进 | 主干改进篇 | 替换MobileViGv2可缩放图卷积网络 | 助力模型复杂场景下精细区分目标和理解空间关系 | CVPR 2024
  • Prescan与Simulink联合仿真AEB模型:实现自动避撞停车
  • 泊车路径规划:几何方法实现的魅力
  • Deeplab - v3与ISIC皮肤病分割数据集实战
  • COMSOL:木材吸水(毛细效应)模型介绍
  • Android 硬件测试全流程方法论 —— 从性能、功耗到稳定性(测试工程师必看)
  • 多语言编程:Yi-Coder-1.5B支持52种语言实战演示
  • 探索一维光子晶体超窄带滤波器:从光学仿真到Matlab实现
  • 【RAG】【Data-Processor】【node_parsers04】SlideNodeParser文档解析示例
  • 挑选AI外包团队的“五看一评”标准,帮你避开90%的坑
  • 【RAG】【Data-Processor】【node_parsers05】TopicNodeParser主题解析示例
  • USB 5V电表设计:基于N32G430与INA199的嵌入式电源监测方案
  • AI投资回报率的“三维度”评估法:不只算钱,更要算清这些隐性价值