C++结构体(struct)、结构体和函数、结构体指针

news2024/11/15 13:30:53

前言        

        在本文中,您将学习C ++编程中的结构。它是什么,如何定义它并在程序中使用它。结构是一个单一名称下不同数据类型的变量的集合。它与类相似,两者都保存着不同数据类型的数据集合。

问题

        例如:您要存储有关某个人的一些信息:其姓名,身份证号码和薪水。您可以轻松创建不同的变量name, citNo, salary来分别存储这些信息。
        但是,将来,您可能希望存储有关多个人的信息。现在,您需要为每个人的每个信息创建不同的变量:name1, citNo1, salary1, name2, citNo2, salary2
        您可以看到变量和代码看起来有多大和混乱。另外,由于变量之间不存在任何关系(信息),因此这将是一项艰巨的任务。

方法

        更好的方法是将所有相关信息收集在一个Person下,并将其用于每个人。 现在,代码看起来也更加简洁,易读且高效。用一个单独的名字Person收集的所有相关信息就是一个结构体。

如何在C ++编程中声明结构体? 

         struct关键字定义一个结构类型,后跟一个标识符(结构的名称)。然后,在花括号内,可以声明该结构的一个或多个成员(在花括号内声明变量)。例如:

struct Person
{
    char name[50];
    int age;
    float salary;
};

        这里定义结构体Person,其具有三个成员:name,age和salary。创建结构时,不会分配内存。结构定义只是创建变量的蓝图。您可以将其作为一种数据类型。当您如下定义整数时:

int foo;

int指定变量foo只能接纳整数元素。 同样,结构定义仅指定结构变量在定义时所拥有的属性。

注意: 切记要以分号(;)结束结构体的声明。

如何定义结构体变量?

一旦你像上面那样声明了一个结构体 Person。你可以定义一个结构变量如下:

Person bill;

这里定义了一个结构变量bill,它的类型是结构体Person。定义了结构体变量后,编译器才分配所需的内存。考虑到您具有32位或64位系统,float的内存为4字节,int的内存为4字节,而char的内存为1字节。因此,为结构体变量bill分配了58个字节的内存。

 如何初始化结构体?

#include<iostream>
struct Person {
	char name[50];
	int age;
	float salary;
};

int main() {
	Person staff; // 这里定义了一个结构变量staff,它的类型是结构体Person。
	staff  = { "张三",20,100 }; // 初始化结构体变量staff
	std::cout << "\n显示信息\n";
	std::cout << "姓名:" << staff.name << std::endl;
	std::cout << "年龄:" << staff.age << std::endl;
	std::cout << "工资:" << staff.salary << std::endl;
}


输出结果: 

如何访问结构体的成员?

        使用点(.)运算符可以访问结构变量的成员。假设您要访问结构变量bill的成员属性age并给其分配值50。您可以使用以下代码执行此任务:

bill.age = 50;

示例:C ++结构

C ++程序,用于将数据分配给结构变量的成员并显示它。

#include<iostream>
struct Person {
	char name[50];
	int age;
	float salary;
};

int main() {
	Person staff; // 这里定义了一个结构变量staff,它的类型是结构体Person。
	std::cout << "输入姓名:";
	std::cin.get(staff.name, 50);
	std::cout << "输入年龄:";
	std::cin >> staff.age;
	std::cout << "输入工资:";
	std::cin >> staff.salary;

	std::cout << "\n显示信息\n";
	std::cout << "姓名:" << staff.name << std::endl;
	std::cout << "年龄:" << staff.age << std::endl;
	std::cout << "工资:" << staff.salary << std::endl;
}


输出结果:

        在这里,声明一个具有三个成员name,age和salary的结构体。在main() 函数内部,定义了一个结构变量staff。然后,要求用户输入信息,并显示用户输入的数据。

结构体和函数

        如何将结构体作为参数传递给函数?
        可以像普通参数一样将结构体变量传递给函数。考虑以下示例:

#include<iostream>
struct Person {
	char name[50];
	int age;
	float salary;
};

void staff_message_display(Person staff) {
	std::cout << "姓名:" << staff.name << std::endl;
	std::cout << "年龄:" << staff.age << std::endl;
	std::cout << "工资:" << staff.salary << std::endl;
}
int main() {
	Person staff1; // 这里定义了一个结构变量staff1,它的类型是结构体Person。
	Person staff2;
	std::cout << "第一个员工\n";
	staff1  = { "张三",20,100 }; // 初始化结构体变量staff1
	staff_message_display(staff1); // 函数调用,结构体变量作为参数

	std::cout << "第二个员工\n";
	staff2 = { "李四", 22, 200 };
	staff_message_display(staff2);
	return 0;
}


输出结果:

 如何从函数中返回结构体?

#include<iostream>
struct Person {
	char name[50];
	int age;
	float salary;
};

void staff_message_display(Person staff) {
	std::cout << "显示员工信息:\n";
	std::cout << "姓名:" << staff.name << std::endl;
	std::cout << "年龄:" << staff.age << std::endl;
	std::cout << "工资:" << staff.salary << std::endl;
}

Person staff_message_input() {
	Person staff;
	std::cout << "输入姓名:";
	std::cin.get(staff.name, 50);
	std::cout << "输入年龄:";
	std::cin >> staff.age;
	std::cout << "输入工资:";
	std::cin >> staff.salary;
	return staff;
}

int main() {
	Person staff1; // 这里定义了一个结构变量staff1,它的类型是结构体Person。
	staff1 = staff_message_input(); 
	staff_message_display(staff1); // 函数调用,结构体变量作为参数

	return 0;
}


输出结果: 

结构体指针 

 

这是创建结构体指针的方法:

示例

#include <iostream>
using namespace std;

struct temp {
    int i;
    float f;
};

int main() {
    temp *ptr;
    return 0;
}

这个程序创建一个结构类型为temp的指针ptr。

示例:结构体指针

#include <iostream>
using namespace std;

struct Distance
{
    int feet;
    float inch;
};

int main()
{
    Distance* ptr, d; // 定义一个Distance类型的指针变量ptr,同时定义一个Distance类型的变量d
    ptr = &d; // 初始化ptr指针变量

    cout << "输入英尺: ";
    cin >> (*ptr).feet;
    cout << "输入英寸: ";
    cin >> (*ptr).inch;

    cout << "显示信息" << endl;
    cout << "距离 = " << (*ptr).feet << " 英尺 " << (*ptr).inch << " 英寸";

    return 0;
}

输出结果: 

        该程序定义了结构体类型的Distance,拥有指针变量ptr和普通变量d。变量d的地址存储在指针变量ptr中,即ptr指向变量d,然后使用指针访问变量d的成员函数。

注意:由于指针ptr在此程序中指向变量d,因此(* ptr).inch和d.inch是完全相同的单元。 同样,(* ptr).feet和d.feet是完全相同的单元。

使用指针访问成员函数的语法很丑陋,但是还有一种更常见的代替符号->

ptr->feet 等同于  (*ptr).feet
ptr->inch 等同于  (*ptr).inch

 

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

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

相关文章

《向量数据库指南》——向量数据库 大模型的“海马体”

在大模型的高调火热之下,向量数据库也获得了前所未有的关注。 近两个月内,向量数据库迎来融资潮,Qdrant、Chroma、Weaviate先后获得融资,Pinecone宣布1亿美元B轮融资,估值达到7.5亿美元。 东北证券预测,到2030年,全球向量数据库市场规模有望达到500亿美元,国内向量数…

【LeetCode热题100】--155.最小栈

155.最小栈 设计一个支持 push &#xff0c;pop &#xff0c;top 操作&#xff0c;并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。void push(int val) 将元素val推入堆栈。void pop() 删除堆栈顶部的元素。int top() 获取堆栈顶部的元…

dubbo协议与triple协议的对比

分别使用dubbo协议和triple协议&#xff0c;按照官方文档搭建Demo。 两个流程对比下来发现&#xff0c;dubbo协议搭建起来比较简单直接&#xff0c;定义好接口&#xff0c;实现类&#xff0c;然后启动provider和consumer就完事了。而triple协议则需要先定义proto文件 然后增加…

(StackOverflow问答)使用Huggingface Transformers从磁盘加载预训练模型

这是在Stack Overflow上的一个问答&#xff0c;链接如下&#xff1a; Load a pre-trained model from disk with Huggingface Transformers - Stack Overflowhttps://stackoverflow.com/questions/64001128/load-a-pre-trained-model-from-disk-with-huggingface-transformers…

找不到vcomp140.dll,无法继续执行代码?别担心,解决方法在这里!

找不到vcomp140.dll,无法继续执行代码&#xff1f;这个问题很难解决么&#xff1f;在网上看到很多人在咨询这个问题&#xff0c;看来是很多人都遇到了缺失了vcomp140.dll文件的问题啊&#xff0c;小编觉得很有必要来给大家详细的科普一下vcomp140.dll文件&#xff0c;给大家介绍…

测试老鸟整理,Fiddle抓包实战-App数据包抓取,看这一篇就够了...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 我们在做接口测试…

在线剪辑音频教程,从零开始,轻松上手

“在线怎么剪辑音频呀&#xff1f;最近参加了一个线上的歌手大赛&#xff0c;好不容易过了初赛&#xff0c;复赛要求我们准备一首流行歌曲&#xff0c;可是我的音频出了问题&#xff0c;需要进行剪辑&#xff0c;但是我不会进行操作&#xff0c;想求求大家帮帮忙。” 在这个数…

不容易解的题10.7

885.螺旋矩阵III 885. 螺旋矩阵 III - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/spiral-matrix-iii/?envTypelist&envIdZCa7r67M模拟题的一种&#xff0c;说难也难&#xff0c;说简单也简单。模拟题有很多套路题&#xff0c;它们的题解差不多&…

Vue 中 KeepAlive 内置缓存使用

KeepAlive 介绍及使用场景 KeepAlive 是 vue 中的内置组件&#xff0c;当多个组件动态切换时可以对实例状态进行缓存&#xff0c;用法如下 <router-view v-slot"{ Component }"><keep-alive><component :is"Component" /></keep-al…

Adobe Photoshop2018-2024mac/win合集:轻松掌控设计世界

Adobe Photoshop&#xff0c;简称“PS”&#xff0c;是由Adobe Systems公司开发和发行的图像处理软件。Adobe Photoshop主要处理以像素所构成的数字图像。使用其众多的编修与绘图工具&#xff0c;可以有效地进行图片编辑工作。 Adobe Photoshop在图像、图形、文字、视频、出版等…

京东商品数据:8月京东环境电器行业数据分析

8月份&#xff0c;环境电器大盘市场整体下滑。鲸参谋数据显示&#xff0c;8月京东平台环境电器的大盘将近570万&#xff0c;环比下滑约29%&#xff0c;同比下滑约10%&#xff1b;销售额为25亿&#xff0c;环比下滑约23%&#xff0c;同比下滑约8%。 *数据源于鲸参谋-行业趋势分析…

数字经济和法治背景下国企合规数字化转型思考

近年来&#xff0c;数字经济的快速发展已经深刻影响了各行各业的运营方式和商业模式。在这个数字化时代&#xff0c;企业要想保持竞争力和可持续发展&#xff0c;必须紧跟时代潮流&#xff0c;进行数字化转型。而对于国有企业来说&#xff0c;数字化转型中的合规问题显得尤为重…

景联文科技:AI大模型强势赋能,助力自动驾驶迭代升级

我国一直以来都将自动驾驶作为新兴产业发展的重点领域之一&#xff0c;工信部等相关部委出台了一系列自动驾驶发展战略、规划和标准&#xff0c;一些地方政府也在积极开展关于自动驾驶的地方立法&#xff0c;为自动驾驶技术的研发和应用提供更加具体的法律保障。例如&#xff0…

记录:Unity脚本的编写3.0

目录 前言前置控制方法查看效果移动方式 前言 前面记录了一些通过脚本控制对象模型移动和通过用户的操作对模型进行变化的方法&#xff0c;那么为了让我们创造的不论是地形还是模型都拥有真实的物理引擎&#xff08;大雾&#xff09;&#xff0c;那么这次就使用脚本控制模型感…

purr map walk 学习教程 完整版

Function reference • purrrhttps://purrr.tidyverse.org/reference/index.htmlMap over multiple input simultaneously (in "parallel") — pmap • purrr

linux python 保存图形savefig import matplotlib.pyplot as plt

import matplotlib.pyplot as plt # 绘制图形 mod.plot_history(20)# 保存图形 plt.savefig("my_training_ephoes_plot.png") # 保存为PNG格式 # 保存图形并设置dpi参数 plt.savefig("my_plot.png", dpi600) # 保存为PNG格式&#xff0c;设置dpi为300

Conv1d与Conv2d函数用法

Conv1d 和 Conv2d 分别是卷积神经网络&#xff08;CNN&#xff09;中的两种卷积层操作&#xff0c;它们在处理不同维度的数据上有联系和区别&#xff0c;本文是一篇学习笔记。 本文主要包括以下内容&#xff1a; 1.联系2.区别3.Conv1d卷积4.Conv2d卷积5.图解Conv1d卷积&#x…

一文告知HTTP GET是否可以有请求体

HTTP GET是否可以有请求体 先说结论&#xff1a; HTTP协议没有规定GET请求不能携带请求体&#xff0c;但是部分浏览器会不支持&#xff0c;因此不建议GET请求携带请求体。 HTTP 协议没有为 GET 请求的 body 赋予语义&#xff0c;也就是即不要求也不禁止 GET 请求带 body。大多数…

教资一年可以考几次 教资考试每年次数介绍

教师资格证一年可以考两次。根据教师资格证考试规定&#xff0c;为了满足报考人员的工作需求&#xff0c;达到市场供求均衡的状态&#xff0c;教师资格证区别于其他的技术资格类的考试&#xff0c;会每年举行两次考试&#xff0c;分别在上半年和下半年各举行一次考试。 上半年…

设计模式 - 行为型模式考点篇:策略模式(概述 | 案例实现 | 优缺点 | 使用场景)

目录 一、行为型模式 1.1、策略模式 1.1.1、概论 1.1.2、案例实现 1.1.3、优缺点 1.1.4、使用场景 一、行为型模式 1.1、策略模式 1.1.1、概论 策略模式设计的每一个算法都封装了起来&#xff0c;使他们可以相互替换&#xff0c;通过一个对象委派不同的算法给相应的客户…