结构体简介

news2025/2/24 5:38:51

前言

这篇文章呢就给大家简单讲解一下什么是结构体,也让大家对结构体有一个较为清晰的了解,从而帮助同学们更好的掌握结构体。

结构体类型的声明

结构的声明

在声明结构体的类型是,先给大家拓展两个重要的关键字 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).name
        ptr->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;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2304212.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

家用路由器的WAN口和LAN口有什么区别

今时今日&#xff0c;移动终端盛行的时代&#xff0c;WIFI可以说是家家户户都有使用到的网络接入方式。那么路由器当然也就是家家户户都不可或缺的设备了。而路由器上的两个实现网络连接的基础接口 ——WAN 口和 LAN 口&#xff0c;到底有什么区别&#xff1f;它们的功能和作用…

实操解决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&#xff1a;升级navicat 解决方法2&#xff1a;降级pgsql 解决方…

3分钟idea接入deepseek

DeepSeek简介 DeepSeek 是杭州深度求索人工智能基础技术研究有限公司开发的一系列大语言模型&#xff0c;背后是知名量化资管巨头幻方量化3。它专注于开发先进的大语言模型和相关技术&#xff0c;拥有多个版本的模型&#xff0c;如 DeepSeek-LLM、DeepSeek-V2、DeepSeek-V3 等&…

树莓派理想二极管电路分析

如果 Vin Vout&#xff0c;比如说 5.0V&#xff0c;PNP 晶体管以当前的镜像配置偏置。晶体管 U14 的 Vb 将为 5-0.6 4.4V&#xff0c;镜像配置意味着 Vg 也将为 4.4V. Vgs 为4.4-5.0 -0.6V。mosfet 将处于关闭状态&#xff08;几乎打开&#xff09;。如果 Vout 略低于 Vin&a…

Unity贴图与模型相关知识

一、贴图 1.贴图的类型与形状 贴图类型 贴图形状 2.在Unity中可使用一张普通贴图来生成对应的法线贴图&#xff08;但并不规范&#xff09; 复制一张该贴图将复制后的贴图类型改为Normal Map 3.贴图的sRGB与Alpha sRGB&#xff1a;勾选此选项代表此贴图存储于Gamma空间中…

Linux--进程(进程虚拟地址空间、页表、进程控制、实现简易shell)

一、进程虚拟地址空间 这里以kernel 2.6.32&#xff0c;32位平台为例。 1.空间布局 在 32 位系统中&#xff0c;虚拟地址空间大小为 4GB。其中&#xff1a; 内核空间&#xff1a;占据高地址的 1GB &#xff0c;用于操作系统内核运行&#xff0c;包含内核代码、内核数据等&am…

中间件专栏之redis篇——redis基本原理、概念及其相关命令介绍

一、redis是什么 redis是remote dictionary service的简称&#xff0c;中文翻译为远程字典服务&#xff1b; redis是一种数据库&#xff0c;若按照类型来归类&#xff0c;则其可以被归入三个类型数据库&#xff0c;分别为&#xff1a;内存数据库、KV数据库、数据结构数据库&a…

在列线图上标记做为线性模型的局部解释

改造列线图做为线性模型的解释 除了使用列线图算法产生的meta数据和score数据进行线性模型的解释&#xff08;全局性解释和局部性解释&#xff09;&#xff0c;另外一种做法是改造列线图来作为线性模型的解释。这里尝试改造列线图来对线性模型进行全局性和局部性解释。 全局…

KubeKey一键安装部署k8s集群和KubeSphere详细教程

目录 一、KubeKey简介 二、k8s集群KubeSphere安装 集群规划 硬件要求 Kubernetes支持版本 操作系统要求 SSH免密登录 配置集群时钟 所有节点安装依赖 安装docker DNS要求 存储要求 下载 KubeKey 验证KubeKey 配置集群文件 安装集群 验证命令 登录页面 一、Ku…

车载诊断数据库 --- AUTOSAR诊断文件DEXT简介

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活,除了生存温饱问题之外,没有什么过多的欲望,表面看起来很高冷,内心热情,如果你身…

庙算兵棋推演AI开发初探(5-数据处理)

碎碎念&#xff1a;这最近几个月过得那叫一个难受&#xff0c;研究生开题没过、需求评审会在4月和6月开了2次、7月紧接着软件设计评审会&#xff0c;加班干得都是文档的事情&#xff0c;还有开会前的会务和乱七八糟的琐事&#xff0c;我们干的还被规定弄的束手束脚&#xff0c;…

【MyBatis】#{} 与 ${} 的区别(常见面试题)

目录 前言 预编译SQL和即时SQL 什么是预编译SQL&#xff1f; 什么是即时SQL&#xff1f; 区别 #{} 与 ${}的使用 防止SQL注入 什么是SQL注入&#xff1f; 原理 排序功能 模糊查询 总结#{}和${}的区别 前言 在前面的学习中&#xff0c;我们已经知道了如果SQL语句想…

鸿蒙开发环境搭建-入门篇

本文章讲述如何搭建鸿蒙应用开发环境&#xff1a;新建工程、虚拟机运行、真机调试等。 开发工具: DevEco Studio 5.0.3.906 os系统: mac 参考文档&#xff1a;https://juejin.cn/post/7356143704699699227 官网鸿蒙应用开发学习文档&#xff1a;https://developer.huawei.com/c…

iOS开发 网络安全

iOS开发中的网络安全 在当前的数字化时代&#xff0c;任何应用程序都需要重视网络安全。尤其是对于iOS应用开发者而言&#xff0c;确保应用与服务器之间的数据传输安全是至关重要的。接下来&#xff0c;我们将学习“iOS开发 网络安全”的实现过程。 流程步骤 以下是实现iOS网…

MATLAB在投资组合优化中的应用:从基础理论到实践

引言 投资组合优化是现代金融理论中的核心问题之一&#xff0c;旨在通过合理配置资产&#xff0c;实现风险与收益的最佳平衡。MATLAB凭借其强大的数学计算能力和丰富的金融工具箱&#xff0c;成为投资组合优化的理想工具。本文将详细介绍如何使用MATLAB进行投资组合优化&#…

银河麒麟系统安装mysql5.7【亲测可行】

一、安装环境 cpu&#xff1a;I5-10代&#xff1b; 主板&#xff1a;华硕&#xff1b; OS&#xff1a;银河麒麟V10&#xff08;SP1&#xff09;未激活 架构&#xff1a;Linux 5.10.0-9-generic x86_64 GNU/Linux mysql版本&#xff1a;mysql-5.7.34-linux-glibc2.12-x86_64.ta…

自动创建spring boot应用(eclipse版本)

使用spring starter project创建项目 设置Service URL 把Service URL设置为 https://start.aliyun.com/ 如下图&#xff1a; 使用这个网址&#xff0c;创建项目更快。 选择Spring Web依赖 项目结构 mvnw和mvnw.cmd:这是maven包装器&#xff08;wrapper&#xff09;脚本&…

基于Flask的第七次人口普查数据分析系统的设计与实现

【Flask】基于Flask的第七次人口普查数据分析系统的设计与实现&#xff08;完整系统源码开发笔记详细部署教程&#xff09;✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 基于Flask的人口普查可视化分析系统 二、项目界面展示 登录/注册 首页/详情 …

Linux:文件(三)

1. 磁盘 基本概念 机械磁盘在现在的计算机中基本是唯一的一个机械设备 速度较内存更慢&#xff0c;容量大价格便宜。 磁盘是永久性存储介质&#xff0c;断电后数据还在。 内存是易失性存储介质&#xff0c;断电后(未写入磁盘的)数据丢失。 物理存储结构 扇区&#xff1a;…

DeepSeek 给我一个 DeepSeekUI 页面

接着上次分享内容 三步安装 DeepSeek 说&#xff0c;DeepSeek 下载好了&#xff0c;总不能是黑框框对话吧&#xff0c;总得找一个 UI 界面使用吧。 本地运行 DeepSeek 比安装 python、jdk 简单多了&#xff0c;本地还没装过的可以参考上次的文档安装。 于是找了几个开源的试了试…