结构体简介
前言
这篇文章呢就给大家简单讲解一下什么是结构体,也让大家对结构体有一个较为清晰的了解,从而帮助同学们更好的掌握结构体。
结构体类型的声明
结构的声明
在声明结构体的类型是,先给大家拓展两个重要的关键字 typedef 和 struct.
拓展
关键字 typedef
基本概念
typedef用于为已有数据类型创建类型别名(Type Alias),不创建新类型。
作用
1. 提高代码可读性
2. 简化复杂类型声明
3. 增强代码可维护性
用法
//关键字 typedef 的用法//基本类型重命名
typedef unsigned int uint; // 创建uint作为unsigned int的别名
uint num = 5; // 等价于unsigned int num = 5;//结构体简化
typedef struct {int x;int y;
} Point; // 创建Point作为结构体的别名Point p1; // 无需写成struct Point p1;//指针类型别名
typedef struct {int x;int y;
} Point; // 创建Point作为结构体的别名Point p1; // 无需写成struct Point p1;//数组类型别名
typedef int IntArray[5]; // 创建5个元素的int数组类型
IntArray arr = { 1,2,3,4,5 };//函数指针类型
typedef void (*Callback)(int); // 定义函数指针类型void myFunc(int x) { /*...*/ }
Callback cb = myFunc; // 使用类型别名
关键字 struct
基本概念
struct(结构体)是用于创建复合数据类型的关键字。
用法
//定义结构体struct Point { // 定义名为Point的结构体// 成员变量(默认public)int x; int y;// 成员函数(C++特有)void print() {cout << "(" << x << ", " << y << ")\n";}
};
意义
通过合理使用struct,可以创建高效、清晰的数据结构,平衡数据访问的便利性与安全性。理解其与class的区别以及现代C++特性对结构体的增强,是编写高质量C++代码的重要基础。
关于数据结构体的声明呢很简单,就是通过上面介绍的两个关键字来进行声明的。
其声明如下:(描述一个学生)
//结构体声明struct Students {char name[20]; //名字int age; //年龄char gender; //性别int Student_ID; //学号int grade; //成绩
};
结构体变量的创建和初始化
用法如下:
#include <stdio.h>
struct Stu
{char name[20];//名字int age;//年龄char sex[5];//性别char id[20];//学号
};int main() {//按照结构体的顺序初始化struct Stu s1 = { "张三",20,"男","234576892" };printf("name:%s\n", s.name);printf("name:%d\n", s.age);printf("name:%s\n", s.sex);printf("name:%s\n", s.id);//按照指定格式初始化struct Stu s2 = { .age=18,.name="张三",.id="234576892",.sex="女"};printf("name:%s\n", s.name);printf("name:%d\n", s.age);printf("name:%s\n", s.sex);printf("name:%s\n", s.id);return 0;
}
结构的特殊声明
有时候,我们在声明结构的时候,可以不完全声明。但是,有时候这样声明是非法的,匿名的结构体类型如果没有对结构题类型重命名的话,基本上只能使用一次。
//匿名结构体类型
struct{
int a;
char b;
float c;
}x;
结构体的声明就暂时讲到这里,除此之外关于结构体的对齐需要大家自己去了解哈。
结构体成员访问操作符
结构体成员访问操作符有两种,点操作符和箭头操作符。
点操作符( . )
作用:用于结构体/类实例的直接访问
用法:
//点操作符(.)
struct Student {string name;int age;void print() {cout << name << ": " << age << endl;}
};int main() {Student s;s.name = "Alice"; // 访问数据成员s.print(); // 调用成员函数Student& rs = s;rs.age = 20; // 通过引用访问
}
箭头操作符( -> )
作用:用于结构体/类指针的间接访问
用法:
//箭头操作符(->)
void processStudent(Student* ptr) {if (ptr != nullptr) {ptr->name = "Bob"; // 等价于 (*ptr).nameptr->print(); // 调用成员函数// 链式访问auto len = ptr->name.length();}
}
结构体传参
关于结构体传参这里就给大家讲一下值传递、常量引用传递、指针传递。
值传递
//值传递
struct Point { int x, y; };void printPoint(Point p) { // 产生拷贝cout << p.x << "," << p.y << endl;
}int main() {Point pt{ 10, 20 };printPoint(pt); // 传递副本
}
常量引用传递
//常量引用传递
double calcDistance(const Point& p1, const Point& p2) {// 无法修改p1/p2的成员return sqrt(pow(p1.x - p2.x, 2) + pow(p1.y - p2.y, 2));
}
指针传递
//指针传递
void initPoint(Point* p) {if (p) { // 必须检查空指针p->x = 0;p->y = 0;}
}
相关文章:
结构体简介
前言 这篇文章呢就给大家简单讲解一下什么是结构体,也让大家对结构体有一个较为清晰的了解,从而帮助同学们更好的掌握结构体。 结构体类型的声明 结构的声明 在声明结构体的类型是,先给大家拓展两个重要的关键字 typedef 和 struct. 拓展…...
家用路由器的WAN口和LAN口有什么区别
今时今日,移动终端盛行的时代,WIFI可以说是家家户户都有使用到的网络接入方式。那么路由器当然也就是家家户户都不可或缺的设备了。而路由器上的两个实现网络连接的基础接口 ——WAN 口和 LAN 口,到底有什么区别?它们的功能和作用…...
实操解决Navicat连接postgresql时出现‘datlastsysoid does not exist‘报错的问题
1 column “datlastsysoid“ does not exist2 Line1:SELECT DISTINCT datalastsysoid FROM pg_database问题分析 Postgres 15 从pg_database表中删除了 datlastsysoid 字段引发此错误。 决绝方案 解决方法1:升级navicat 解决方法2:降级pgsql 解决方…...
3分钟idea接入deepseek
DeepSeek简介 DeepSeek 是杭州深度求索人工智能基础技术研究有限公司开发的一系列大语言模型,背后是知名量化资管巨头幻方量化3。它专注于开发先进的大语言模型和相关技术,拥有多个版本的模型,如 DeepSeek-LLM、DeepSeek-V2、DeepSeek-V3 等&…...
树莓派理想二极管电路分析
如果 Vin Vout,比如说 5.0V,PNP 晶体管以当前的镜像配置偏置。晶体管 U14 的 Vb 将为 5-0.6 4.4V,镜像配置意味着 Vg 也将为 4.4V. Vgs 为4.4-5.0 -0.6V。mosfet 将处于关闭状态(几乎打开)。如果 Vout 略低于 Vin&a…...
关于在mac中配置Java系统环境变量
引言 在 macOS 上开发 Java 或 Flutter 应用时,正确配置环境变量是至关重要的。环境变量不仅能让系统找到开发工具的位置,还能简化命令行操作。本文将手把手教你从零开始安装 Java SDK,并详细配置环境变量,涵盖常见问题解决和优化…...
Unity贴图与模型相关知识
一、贴图 1.贴图的类型与形状 贴图类型 贴图形状 2.在Unity中可使用一张普通贴图来生成对应的法线贴图(但并不规范) 复制一张该贴图将复制后的贴图类型改为Normal Map 3.贴图的sRGB与Alpha sRGB:勾选此选项代表此贴图存储于Gamma空间中…...
Linux--进程(进程虚拟地址空间、页表、进程控制、实现简易shell)
一、进程虚拟地址空间 这里以kernel 2.6.32,32位平台为例。 1.空间布局 在 32 位系统中,虚拟地址空间大小为 4GB。其中: 内核空间:占据高地址的 1GB ,用于操作系统内核运行,包含内核代码、内核数据等&am…...
中间件专栏之redis篇——redis基本原理、概念及其相关命令介绍
一、redis是什么 redis是remote dictionary service的简称,中文翻译为远程字典服务; redis是一种数据库,若按照类型来归类,则其可以被归入三个类型数据库,分别为:内存数据库、KV数据库、数据结构数据库&a…...
python使用httpx_sse调用sse流式接口对响应格式为application/json的错误信息的处理
目录 问题描述方案 问题描述 调用sse流式接口使用httpx_sse的方式 import httpxfrom httpx_sse import connect_sse# 省略无关代码try:with httpx.Client() as client:with connect_sse(client, "GET", url, paramsparam) as event_source:clear_textbox(response_t…...
在列线图上标记做为线性模型的局部解释
改造列线图做为线性模型的解释 除了使用列线图算法产生的meta数据和score数据进行线性模型的解释(全局性解释和局部性解释),另外一种做法是改造列线图来作为线性模型的解释。这里尝试改造列线图来对线性模型进行全局性和局部性解释。 全局…...
KubeKey一键安装部署k8s集群和KubeSphere详细教程
目录 一、KubeKey简介 二、k8s集群KubeSphere安装 集群规划 硬件要求 Kubernetes支持版本 操作系统要求 SSH免密登录 配置集群时钟 所有节点安装依赖 安装docker DNS要求 存储要求 下载 KubeKey 验证KubeKey 配置集群文件 安装集群 验证命令 登录页面 一、Ku…...
CPU多级缓存与缓存一致性协议
CPU多级缓存与缓存一致性协议 CPU多级缓存和缓存一致性协议是计算机体系结构中优化性能与保证数据正确性的核心机制。以下从缓存层级设计、工作原理、一致性协议(如MESI)及其实现细节展开说明。 一、为什么需要多级缓存? CPU的计算速度远高…...
Docker用户的困境:免费项目的减少与成本的增加
摘要 在生产环境中,Docker用户正面临新的挑战:免费项目逐渐减少,收费服务成为主流趋势。表面上免费的选项,由于缺乏必要的支持和及时更新,反而可能导致更高的隐性成本。对于依赖Docker进行开发和部署的企业而言&#x…...
车载诊断数据库 --- AUTOSAR诊断文件DEXT简介
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活,除了生存温饱问题之外,没有什么过多的欲望,表面看起来很高冷,内心热情,如果你身…...
Linux lsblk 命令详解:查看磁盘和分区信息 (中英双语)
Linux lsblk 命令详解:查看磁盘和分区信息 在 Linux 系统中,管理磁盘设备和分区是日常运维工作的重要部分。而 lsblk 命令是一个强大的工具,它用于列出系统中的块设备(block devices)信息,可以帮助我们快速…...
庙算兵棋推演AI开发初探(5-数据处理)
碎碎念:这最近几个月过得那叫一个难受,研究生开题没过、需求评审会在4月和6月开了2次、7月紧接着软件设计评审会,加班干得都是文档的事情,还有开会前的会务和乱七八糟的琐事,我们干的还被规定弄的束手束脚,…...
【MyBatis】#{} 与 ${} 的区别(常见面试题)
目录 前言 预编译SQL和即时SQL 什么是预编译SQL? 什么是即时SQL? 区别 #{} 与 ${}的使用 防止SQL注入 什么是SQL注入? 原理 排序功能 模糊查询 总结#{}和${}的区别 前言 在前面的学习中,我们已经知道了如果SQL语句想…...
鸿蒙开发环境搭建-入门篇
本文章讲述如何搭建鸿蒙应用开发环境:新建工程、虚拟机运行、真机调试等。 开发工具: DevEco Studio 5.0.3.906 os系统: mac 参考文档:https://juejin.cn/post/7356143704699699227 官网鸿蒙应用开发学习文档:https://developer.huawei.com/c…...
力扣-贪心-53 最大子数组和
思路 先把每一个值都加到当前集合中,记录当前的和,直到当前记录和小于0了,再重置改记录,再次尝试累加 代码 class Solution { public:int maxSubArray(vector<int>& nums) {int res INT32_MIN;int curSum 0;for(in…...
iOS开发 网络安全
iOS开发中的网络安全 在当前的数字化时代,任何应用程序都需要重视网络安全。尤其是对于iOS应用开发者而言,确保应用与服务器之间的数据传输安全是至关重要的。接下来,我们将学习“iOS开发 网络安全”的实现过程。 流程步骤 以下是实现iOS网…...
MATLAB在投资组合优化中的应用:从基础理论到实践
引言 投资组合优化是现代金融理论中的核心问题之一,旨在通过合理配置资产,实现风险与收益的最佳平衡。MATLAB凭借其强大的数学计算能力和丰富的金融工具箱,成为投资组合优化的理想工具。本文将详细介绍如何使用MATLAB进行投资组合优化&#…...
银河麒麟系统安装mysql5.7【亲测可行】
一、安装环境 cpu:I5-10代; 主板:华硕; OS:银河麒麟V10(SP1)未激活 架构:Linux 5.10.0-9-generic x86_64 GNU/Linux mysql版本:mysql-5.7.34-linux-glibc2.12-x86_64.ta…...
自动创建spring boot应用(eclipse版本)
使用spring starter project创建项目 设置Service URL 把Service URL设置为 https://start.aliyun.com/ 如下图: 使用这个网址,创建项目更快。 选择Spring Web依赖 项目结构 mvnw和mvnw.cmd:这是maven包装器(wrapper)脚本&…...
基于Flask的第七次人口普查数据分析系统的设计与实现
【Flask】基于Flask的第七次人口普查数据分析系统的设计与实现(完整系统源码开发笔记详细部署教程)✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 基于Flask的人口普查可视化分析系统 二、项目界面展示 登录/注册 首页/详情 …...
DNS, domain name system
DNS 是一种应用层协议和http/https是同一等级的 其传输层主要用的是udp,也可能用tcp DNS协议完成的作用:查 域名对应的 ip DNS服务器完成的作用:存储 域名 -> ip 的映射 DNS服务器有三个等级:根DNS,顶级域DNS&…...
Linux:文件(三)
1. 磁盘 基本概念 机械磁盘在现在的计算机中基本是唯一的一个机械设备 速度较内存更慢,容量大价格便宜。 磁盘是永久性存储介质,断电后数据还在。 内存是易失性存储介质,断电后(未写入磁盘的)数据丢失。 物理存储结构 扇区:…...
DeepSeek 给我一个 DeepSeekUI 页面
接着上次分享内容 三步安装 DeepSeek 说,DeepSeek 下载好了,总不能是黑框框对话吧,总得找一个 UI 界面使用吧。 本地运行 DeepSeek 比安装 python、jdk 简单多了,本地还没装过的可以参考上次的文档安装。 于是找了几个开源的试了试…...
Java NIO与传统IO性能对比分析
Java NIO与传统IO性能对比分析 在Java中,I/O(输入输出)操作是开发中最常见的任务之一。传统的I/O方式基于阻塞模型,而Java NIO(New I/O)引入了非阻塞和基于通道(Channel)和缓冲区&a…...
054 redisson
文章目录 使用Redisson演示可重入锁读写锁信号量闭锁获取三级分类redisson分布式锁 package com.xd.cubemall.product.config;import org.redisson.Redisson; import org.redisson.api.RedissonClient; import org.redisson.config.Config; import org.springframework.context…...
