【C++漂流记】结构体的定义和使用、结构体数组、结构体指针、结构体做函数参数以及结构体中const的使用

结构体(struct)是C语言中一种重要的数据类型,它由一组不同类型的成员组成。结构体可以用来表示一个复杂的数据结构,比如一个学生的信息、一个员工记录或者一个矩形的尺寸等。
结构体定义后,可以声明结构体变量,每个结构体变量包含结构体类型的所有成员。结构体变量中的每个成员可以是不同的数据类型,比如int、float、char等。
在结构体中,每个成员有自己的名称和数据类型,描述了结构体的内存布局。访问结构体成员可以使用点运算符(.)或者箭头运算符(->)。
结构体还可以嵌套,即在一个结构体中可以包含另一个结构体类型的成员。这种嵌套可以用来表示更复杂的数据结构。
在这里插入图片描述

文章目录

    • 一、结构体的定义和使用
    • 二、结构体数组
    • 三、结构体指针
    • 四、结构体嵌套
    • 五、结构体做函数参数
    • 六、结构体中const的使用

一、结构体的定义和使用

在C++中,结构体是一种用户自定义的数据类型,它可以包含不同类型的数据成员。结构体的定义和使用类似于C语言中的结构体,但是在C++中有一些额外的功能和特性。

示例代码:

#include <iostream>// 定义一个结构体
struct Person {std::string name;int age;std::string address;
};int main() {// 创建一个结构体变量并初始化Person person1 = {"Alice", 25, "123 Main St."};// 访问结构体的成员std::cout << "Name: " << person1.name << std::endl;std::cout << "Age: " << person1.age << std::endl;std::cout << "Address: " << person1.address << std::endl;// 修改结构体成员的值person1.age = 30;std::cout << "Updated Age: " << person1.age << std::endl;return 0;
}

代码解释:

在上面的例子中,我们首先使用struct关键字定义了一个名为Person的结构体,并在其中定义了三个数据成员:nameageaddress。接下来,在main()函数中,我们创建了一个名为person1Person类型的结构体变量,并使用初始化列表对其成员进行了初始化。然后,我们使用.运算符来访问结构体的成员,并输出了它们的值。最后,我们修改了person1age成员的值,并再次输出了它的新值。


二、结构体数组

结构体数组是一种包含多个结构体的数据结构。它可以通过定义结构体类型并使用该类型来声明和初始化数组。结构体数组通常用于存储具有相同结构的数据项。

示例代码:

#include <stdio.h>// 定义一个结构体类型
struct Person {char name[50];int age;
};int main() {// 声明并初始化一个结构体数组struct Person people[3] = {{"Alice", 25},{"Bob", 30},{"Charlie", 35}};// 访问结构体数组的成员for (int i = 0; i < 3; i++) {printf("Person %d: %s, %d\n", i+1, people[i].name, people[i].age);}return 0;
}

代码解释:
在上面的代码中,我们首先定义了一个名为Person的结构体类型,其中包含一个字符数组name和一个整数age。然后,在main()函数中,我们声明并初始化了一个包含三个Person结构体的数组people。接下来,我们使用for循环遍历结构体数组,并使用.运算符访问每个结构体的成员。最后,我们输出了每个结构体的成员值。


三、结构体指针

结构体指针是一种指针类型,用于存储结构体变量的地址。通过结构体指针,我们可以间接地访问和修改结构体的成员。

示例代码:

#include <stdio.h>// 定义一个结构体类型
struct Point {int x;int y;
};int main() {// 声明一个结构体变量struct Point p1 = { 10, 20 };// 声明一个指向结构体的指针struct Point *p2 = &p1;// 通过指针访问结构体的成员printf("p2->x: %d\n", p2->x);printf("p2->y: %d\n", p2->y);// 通过指针修改结构体的成员p2->x = 30;p2->y = 40;printf("p1->x: %d\n", p1.x);printf("p1->y: %d\n", p1.y);return 0;
}

代码解释:

在上面的代码中,我们首先定义了一个名为Point的结构体类型,其中包含两个整数成员xy。然后,在main()函数中,我们声明了一个Point类型的结构体变量p1,并初始化了它的成员。接着,我们声明了一个指向Point类型的指针p2,并将p1的地址赋值给它。

通过指针p2,我们可以使用->运算符来访问结构体的成员。例如,p2->x表示访问结构体变量p1x成员。同时,我们也可以通过指针来修改结构体的成员,例如将p2->x修改为30。由于p2指向的是p1的地址,因此对p2->x的修改也会影响到p1.x的值。最后,我们输出了修改后的p1.xp1.y的值。


四、结构体嵌套

结构体嵌套是指在一个结构体中嵌套另一个结构体,通常用于构建复杂的数据结构。在C语言中,可以通过定义嵌套的结构体来实现。

示例代码:

#include <stdio.h>// 定义一个结构体类型
struct Person {char name[50];int age;
};// 定义一个嵌套的结构体类型
struct Student {struct Person person;  // 嵌套一个Person结构体int grade;
};int main() {// 声明并初始化一个Student结构体变量struct Student student = {{"Alice", 20},90};// 访问Student结构体的成员printf("Name: %s\n", student.person.name);printf("Age: %d\n", student.person.age);printf("Grade: %d\n", student.grade);return 0;
}

代码解释:

在上面的代码中,我们首先定义了一个名为Person的结构体类型,其中包含一个字符数组name和一个整数age。然后,我们定义了一个名为Student的嵌套结构体类型,其中包含一个Person类型的成员变量person和一个整数grade。在main()函数中,我们声明并初始化了一个Student类型的结构体变量student。通过使用点运算符,我们可以访问student的成员,例如student.person.namestudent.person.agestudent.grade。输出结果将显示Alice2090


五、结构体做函数参数

结构体作为函数的参数可以传递结构体变量的值,以便在函数内部对该结构体变量进行操作。这样可以将数据作为整体传递,避免了传递多个单独的变量带来的麻烦。

示例代码:

#include <stdio.h>// 定义一个结构体类型
struct Point {int x;int y;
};// 定义一个函数,接受一个Point类型的结构体作为参数
void printPoint(struct Point p) {printf("x: %d, y: %d\n", p.x, p.y);
}int main() {// 声明并初始化一个Point类型的结构体变量struct Point p = { 10, 20 };// 调用函数,将结构体变量作为参数传递printPoint(p);return 0;
}

代码解释:

在上面的代码中,我们首先定义了一个名为Point的结构体类型,其中包含两个整数成员xy。然后,我们定义了一个名为printPoint的函数,该函数接受一个Point类型的结构体作为参数。在main()函数中,我们声明并初始化了一个Point类型的结构体变量p,并将其作为参数传递给printPoint函数。在函数内部,我们可以使用结构体变量p的成员来输出结果。


六、结构体中const的使用

在结构体中,const关键字可以用于修饰成员变量或成员函数,用于确保它们在结构体中的值或行为保持不变。

  1. const成员变量:
struct MyStruct {const int myConstVar;
};

在上面的代码中,myConstVar是一个const成员变量,它在结构体创建时被初始化,并且其值不能被修改。const成员变量的初始化应该在结构体声明的初始化列表中进行。

  1. const成员函数:
struct MyStruct {int myVar;void myConstFunc() const {// 这个成员函数不能修改myVar的值}
};

在上面的代码中,myConstFunc()是一个const成员函数,它不能修改结构体的任何成员变量的值。这可以通过在函数声明的末尾添加const关键字来实现。

  1. const指针成员:
struct MyStruct {int myVar;const int* myConstPtr;
};

在上面的代码中,myConstPtr是一个const指针成员,它指向一个const整数。通过这个指针不能修改所指向的值。如果需要修改所指向的值,需要使用非const指针或通过其他方式传递修改后的值给结构体。

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

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

相关文章

NCCoE发布“向后量子密码学迁移”项目进展情况说明书

近日&#xff0c;NIST下属的国家网络安全中心&#xff08;NCCoE&#xff09;发布了一份向后量子密码学迁移&#xff08;Migration to Post-Quantum Cryptography&#xff09;项目情况说明书。该文档简要概述了向后量子密码学迁移项目的背景、目标、挑战、好处和工作流程&#x…

【HTML5高级第二篇】WebWorker多线程、EventSource事件推送、History历史操作

文章目录 一、多线程1.1 概述1.2 体会多线程1.3 多线程中数据传递和接收 二、事件推送2.1 概述2.2 onmessage 事件 三、history 一、多线程 1.1 概述 前端JS默认按照单线程去执行&#xff0c;一段时间内只能执行一件事情。举个栗子&#xff1a;比方说古代攻城游戏&#xff0c…

Jenkins自动构建(Gitee)

Gitee简介安装JenkinsCLI https://blog.csdn.net/tongxin_tongmeng/article/details/132632743 安装Gitee jenkins-cli install-plugin gitee:1.2.7 # https://plugins.jenkins.io/gitee/releases获取安装命令(稍作变更) JenkinsURL Dashboard-->配置-->Jenkins Locatio…

鸿蒙系列-如何使用好 ArkUI 的 @Reusable?

如何使用好 ArkUI 的 Reusable&#xff1f; OpenHarmony 组件复用机制 在ArkUI中&#xff0c;UI显示的内容均为组件&#xff0c;由框架直接提供的称为 系统组件&#xff0c;由开发者定义的称为 自定义组件。 在进行 UI 界面开发时&#xff0c;通常不是简单的将系统组件进行组合…

NIO原理浅析(三)

epoll 首先认识一下epoll的几个基础函数 int s socket(AF_INET, SOCK_STREAM, 0); bind(s, ...); listen(s, ...);int epfd epoll_create(...) epoll_ctl(epfd, ...); //将所有需要监听的socket添加到epfd中while(1) {int n epoll_wait(...);for(接受到数据的socket) {//处…

Kotlin 环境下解决属性初始化问题

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

react使用hook封装一个tab组件

目录 react使用hook封装一个tab组件Tabbar.jsx使用组件效果 react使用hook封装一个tab组件 Tabbar.jsx import PropsTypes from "prop-types"; import React, { useEffect, useState } from react; export default function Tabbar(props) {const { tabData , cur…

使用pip下载第三方软件包报错超时处理方法

报错如下&#xff1a; WARNING: Retrying (Retry(total4, connectNone, readNone, redirectNone, statusNone)) after connection broken by ‘ReadTimeoutEr ror(“HTTPSConnectionPool(host‘files.pythonhosted.org’, port443): Read timed out. (read timeout15)”)’: /p…

Maven编译java及解决程序包org.apache.logging.log4j不存在问题

1、首先新建一个文件夹&#xff0c;比如hello Hello里新建pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi…

git快速使用

1、下载git 设置签名 2、基本概念 工作区&#xff1a;写代码的地方。 暂存区&#xff1a;.git的.index 工作区&#xff1a;.git 3、常用操作 本地codinggit init&#xff0c; 初始化一个本地仓库&#xff0c;项目根目录下会出现个.gitgit remote add origin gitgithub.com…

[杂谈]-快速了解LoRaWAN网络以及工作原理

快速了解LoRaWAN网络以及工作原理 文章目录 快速了解LoRaWAN网络以及工作原理1、LoRaWAN网络元素1.1 终端设备&#xff08;End Devices&#xff09;1.2 网关&#xff08;Gateways&#xff09;1.3 网络服务器&#xff08;Net Server&#xff09;1.4 应用服务器&#xff08;Appli…

OpenCV(二十一):椒盐噪声和高斯噪声的产生

目录 1.图像噪声介绍 2.椒盐噪声的产生 3.高斯噪声的产生 1.图像噪声介绍 噪声介绍 图像噪声是指在图像中存在的不期望的、随机的像素值变化&#xff0c;这些变化来源于多种因素。噪声可能导致图像细节模糊、失真或难以分辨。 以下是几种常见的图像噪声类型&#xff1a; 1…

Unity中神秘的Transform和transform(小写)的关系

1.为什么Transform类是保护的不能通过new 来实例化对象,也没有静态函数,而Rotate()这种方法却属于它,该如何访问? Transform 类还是被保护的不允许用户修改! protected Transform(); 是一个受保护的构造函数,不能直接实例化 Transform 类。 2.为甚么transform可以访问Tr…

Mac Homebrew中常用的 Brew 命令

Mac 中常用的 Brew 命令集 Brew&#xff08;Homebrew&#xff09;是一个强大的包管理器&#xff0c;用于在 macOS 上安装、更新和管理各种软件包。它使得在 Mac 上安装开发工具、应用程序和库变得轻松和便捷。本博客将介绍一些在 Mac 中常用的 Brew 命令&#xff0c;以帮助您更…

【Springcloud】Sentinel熔断和降级

【Springcloud】Sentinel熔断和降级 【一】基本介绍【1】什么是熔断和降级【2】为什么使用熔断和降级【3】Sentinel熔断和降级【4】核心概念 【二】下载方式【1】Windows平台安装包下载【2】打开控制台 【三】使用案例【1】添加依赖【2】添加Sentinel配置【3】添加TestUserCont…

线上问诊:数仓开发(一)

系列文章目录 线上问诊&#xff1a;业务数据采集 线上问诊&#xff1a;数仓数据同步 线上问诊&#xff1a;数仓开发(一) 文章目录 系列文章目录前言一、Hive on yarn二、数仓开发1.ODS开发2.DIM开发3.DWD开发 总结 前言 上次我们已经将MYSQL的数据传送到了HDFS&#xff0c;但…

commet与websocket

commet与websocket Comet 前言 Comet是一种用于web的技术&#xff0c;能使服务器能实时地将更新的信息传送到客户端&#xff0c;而无须客户端发出请求&#xff0c;目前有两种实现方式&#xff0c;长轮询和iframe流。 实现方式 长轮询 长轮询是在打开一条连接以后保持&…

关于HarmonyOS元服务的主题演讲与合作签约

一、感言 坚持中&#xff0c;总会有很多意想不到的收获。 前几次参与HDC时更多的是观众、开发者、专家的身份&#xff0c;以参观、学习、交流为主。 通过几年的努力&#xff0c;和HarmonyOS功能成长&#xff0c;在2023年的HDC大会中&#xff0c;有了我的演讲&#xff0c;并带领…

无涯教程-Android Mock Test函数

本节介绍了与 Android 相关的各种模拟测试。您可以在本地计算机上下载这些样本模拟测试,并在方便时离线解决。每个模拟测试均随附一个模拟测试键,可让您验证最终分数并为自己评分。 Mock Test I Mock Test II Mock Test III Mock Test IV Q 1 -什么是Android&#xff1f; A -A…

VMware虚拟机安装CentOS6.9设置静态ip

1.设置虚拟网络编辑器 点击编辑–>虚拟网络编辑器 2.更改系统网络适配器选项 这里的子网掩码与网关&#xff0c;与第一步的一致 3.修改虚拟机主机名 vi /etc/sysconfig/networkNETWORKINGyue HOSTNAMEchen4.配置IP映射 vi /etc/hosts192.168.121.138 chen5.配置网卡…