【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.hqwc.cn/news/99901.html

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

相关文章

自然语言处理历史史诗:NLP的范式演变与Python全实现

目录 一、引言什么是自然语言处理&#xff1f;语言与人类思维自然语言的复杂性NLP的历史轨迹 二、20世纪50年代末到60年代的初创期符号学派重要的研究和突破 随机学派重要的研究和突破 三、20世纪70年代到80年代的理性主义时代基于逻辑的范式重要的研究和突破 基于规则的范式重…

MATLAB 2023安装方法之删除旧版本MATLAB,安装新版本MATLAB

说明&#xff1a;之前一直使用的是MATLAB R2020b&#xff0c;但最近复现Github上的程序时&#xff0c;运行不了&#xff0c;联系作者说他的程序只能在MATLAB 2021之后的版本运行&#xff0c;因此决定安装最新版本的MATLAB。 系统&#xff1a;Windows 11 需要卸载的旧MATLAB 版…

yml配置动态数据源(数据库@DS)与引起(If you want an embedded database (H2, HSQL or Derby))类问题

1&#xff1a;yml 配置 spring:datasource:dynamic:datasource:master:url: jdbc:mysql://192.168.11.50:3306/dsdd?characterEncodingUTF-8&useUnicodetrue&useSSLfalse&tinyInt1isBitfalse&allowPublicKeyRetrievaltrue&serverTimezoneUTCusername: ro…

go语言学习笔记

Go学习 一直想学一门新语言&#xff0c;难度又不想太大&#xff0c;C和Java都会但是不怎么精通&#xff0c;某天看到Go语言&#xff0c;好的&#xff0c;就是它了。总体来说&#xff0c;go语言的学习还是相对简单&#xff0c;有编程基础的入手很快。 简介 go是一种并发、带垃…

Git常用命令用法

参考视频&#xff1a;真的是全能保姆 git、github 保姆级教程入门&#xff0c;工作和协作必备技术&#xff0c;github提交pr - pull request_哔哩哔哩_bilibili 1.Git初始化 首先设置名称和邮箱。然后初始化一下&#xff0c;然后就创建了一个空的Git仓库。 PS D:\golang\oth…

机器人中的数值优化(九)——拟牛顿方法(下)、BB方法

本系列文章主要是我在学习《数值优化》过程中的一些笔记和相关思考&#xff0c;主要的学习资料是深蓝学院的课程《机器人中的数值优化》和高立编著的《数值最优化方法》等&#xff0c;本系列文章篇数较多&#xff0c;不定期更新&#xff0c;上半部分介绍无约束优化&#xff0c;…

SpringMVC相对路径和绝对路径

1.相对地址与绝对地址定义 在jsp&#xff0c;html中使用的地址&#xff0c;都是在前端页面中的地址&#xff0c;都是相对地址 地址分类&#xff1a;&#xff08;1&#xff09;&#xff0c;绝对地址&#xff0c;带有协议名称的是绝对地址&#xff0c;http://www.baidu.com&…

stable diffusion实践操作-SD原理

系列文章目录 本文专门开一节写SD原理相关的内容&#xff0c;在看之前&#xff0c;可以同步关注&#xff1a; stable diffusion实践操作 文章目录 系列文章目录前言一、原理说明1.1、出图原理1.1.1 AI画画不是和人一样&#xff0c;从0开始&#xff0c;而是一个去噪点的过程&am…

Vue2基础学习

vue基础学习 Vue基础指令v-show 和 v-ifv-on指令v-bind指令v-bind操作classv-bind 操作stylev-for 指令练习&#xff1a;图书管理案例v-modelv-model原理 指令修饰符v-model指令修饰符click.stop-》阻止冒泡按键修饰符阻止默认行为 计算属性计算属性简写computed计算属性VS方法…

剪枝基础与实战(5): 剪枝代码详解

对模型进行剪枝,我们只对有参数的层进行剪枝,我们基于BatchNorm2d对通道重要度 γ \gamma γ参数进行稀释训练。对BatchNorm2d及它的前后层也需要进行剪枝。主要针对有参数的层:Conv2d、BatchNorm2d、Linear。但是我们不会对Pool2d 层进行剪枝,因为Pool2d只用来做下采样,没…

​LeetCode解法汇总1123. 最深叶节点的最近公共祖先

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 描述&#xff1a; 给你一个有…

以antd为例 React+Typescript 引入第三方UI库

本文 我们来说说 第三方UI库 其实应用市场上的 第三方UI库都是非常优秀的 那么 react 我们比较熟的肯定还是 antd 我们还是来用它作为演示 这边 我们先访问他的官网 https://3x.ant.design/index-cn 点击开始使用 在左侧 有一个 在 TypeScript 中使用 通过图标我们也可以看出…