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

news2025/1/11 21:40:02

结构体(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.coloradmin.cn/o/978698.html

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

相关文章

大数据Flink(七十三):SQL的滚动窗口(TUMBLE)

文章目录 SQL的滚动窗口(TUMBLE) SQL的滚动窗口(TUMBLE) 滚动窗口定义:滚动窗口将每个元素指定给指定窗口大小的窗口。滚动窗口具有固定大小,且不重叠。例如,指定一个大小为 5 分钟的滚动窗口。在这种情况下,Flink 将每隔 5 分钟开启一个新的窗口,其中每一条数都会划…

kubernetes——ingress

简介 ingress: 是k8s内部的一个资源对象ingress controller -> ingress控制器&#xff1a; 是k8s里启动的一个pod&#xff0c;运行的是nginx的镜像&#xff0c;实现k8s内部的service&#xff08;ClusterIP类型&#xff09;的负载均衡 ingress 和ingress controller 的关…

孙哥Spring源码第18集

第18集 refresh()-invokeBeanFactoryPostProcessor-二-ConfigurationClassPostProcessor的处理逻辑 【视频来源于&#xff1a;B站up主孙帅suns Spring源码视频】【微信号&#xff1a;suns45】 1、为什么PropertySource先处理&#xff1f; 因为Conponent A在处理的过程中 要把…

elementUI时间选择器

<template>//月选择器//:clearable"false" 去掉<div class"monthCard"><el-date-picker:clearable"false"v-model"monthValue"type"month"placeholder"选择月"change"handleChangeMonth($eve…

Linux上安装FTP

1、登录FTP&#xff0c;执行安装命令 yum -y install vsftpd 2、启动FTP服务器&#xff0c;设置开启自启动 systemctl enable vsftpd.service systemctl start vsftpd.service systemctl status vsftpd.service #查看状态, 显示active说明FTP启动成功 3、修改FTP配置文件/et…

一年省1000多话费的方法,具体操作步骤我教你了,只说一遍哟!

你还在使用手机套餐吗&#xff1f; 还在使用定向流量卡吗&#xff1f; 不管你现在使用哪种上网方式&#xff1f;都不如小编说的这种划算&#xff0c;算下来一年可以省下1000多块钱。 ​ 具体操作方法如下小编教你了&#xff0c;信不信由你&#xff1a; 1、可以通过官方客服电…

java+ssm+mysql小区疫情管理系统

项目介绍&#xff1a; 使用javassmmysql开发的小区疫情管理系统&#xff0c;系统包含超级管理员&#xff0c;系统管理员、居民用户角色&#xff0c;功能如下&#xff1a; 超级管理员&#xff1a;首页图表统计、管理员管理、居民管理、物资管理、诊断管理、疫苗接种、访客管理…

【网站】浏览器页面文本如何禁止和解除

2023年&#xff0c;第37周。给自己一个目标&#xff0c;然后坚持总会有收货&#xff0c;不信你试试&#xff01; 有时候&#xff0c;看法的网站&#xff0c;网页文本内容希望不能被复制&#xff0c;那么就需要对浏览器网页进行一些限制&#xff0c;是一种网站开发中的保护措施。…

论文精读 —— Gradient Surgery for Multi-Task Learning

文章目录 Multi-task Learning和 PCGrad 方法简介论文信息论文核心图摘要翻译引言翻译2 使用PCGrad进行多任务学习2.1 基本概念&#xff1a;问题和符号表示2.2 三重悲剧&#xff1a;冲突的梯度&#xff0c;主导的梯度&#xff0c;高曲率2.3 PCGrad&#xff1a;解决梯度冲突2.4 …

python-爬虫-xpath方法-批量爬取王者皮肤图片

import requests from lxml import etree获取NBA成员信息 # 发送的地址 url https://nba.hupu.com/stats/players # UA 伪装 google header {User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.3…

jvs-智能bi(自助式数据分析)9.1更新内容

​jvs-智能bi更新功能 1.报表增加权限功能&#xff08;服务、模板、数据集、数据源可进行后台权限分配&#xff09; 每个报表可以独立设置权限&#xff0c;通过自定义分配&#xff0c;给不同的人员分配不同的权限。 2.报表新增执行模式 可选择首次报表加载数据为最新数据和历…

Android之 SVG绘制

一 SVG介绍 1.1 SVG&#xff08;Scalable Vector Graphics&#xff09;是可缩放矢量图形的缩写&#xff0c;它是一种图形格式&#xff0c;其中形状在XML中指定&#xff0c; 而XML又由SVG查看器呈现。 1.2 SVG可以区别于位图&#xff0c;放大可以做到不模糊&#xff0c;可以做…

mac pyenv无法切换python版本问题

看是zsh还是bash echo $SHELLzsh 配置到&#xff5e;/.zshrc 文件 vim ~/.zshrcexport PYENV_ROOT"$HOME/.pyenv" command -v pyenv >/dev/null || export PATH"$PYENV_ROOT/bin:$PATH" 执行 source ~/.zshrc bash vim ~/.bashrc export PYENV_R…

影像三维地形图制作

一、数据来源介绍 1. 数字高程数据 数字高程数据来源于中国科学院资源环境科学与数据中心&#xff08;https://www.resdc.cn/Default.aspx&#xff09;。 2. 公主岭市遥感影像数据 遥感影像数据数据来源网络。 二、 数据预处理 1. 公主岭市遥感影像数据预处理 从之前的图中…

c++ uml时序图

时序图 通过描述对象之间发送消息的时间顺序显示多个对象之间的动态协作。 时序图和流程图的区别&#xff1a; 时序图强调对象之间的交互与时序关系&#xff0c;流程图则是针对一个过程或者活动进行全面而细致的展开。 时序图主要描绘多个对象之间的复杂关系&#xff0c;流…

第三方软件测评的重要性分析

1、首先&#xff0c;什么是软件测试&#xff1f; 很多人看到这个小标题肯定会一笑而过&#xff0c;但你绝不能忽视他的真正概念。 软件测试是检查实际结果与预期结果是否匹配并确保软件系统无缺陷的活动。软件测试还有助于识别产品与实际需求不符或是缺失项。测试活动既可以手…

华为数通方向HCIP-DataCom H12-821题库(单选题:301-320)

第301题 某台路由器运行 IS-IS,其输出信息如图所示,下列说法错误的是? [R1]display isis sdb local verboseDatabase information for ISIS(1) Level-1 Link State Database LSPID Seq Num Checksum Holdtime…

既要炫酷好看,又要出图快?可视化大屏模板了解下!

可视化大屏模板可以在很大程度上满足炫酷好看和出图快的需求。使用模板可以节约制作时间&#xff0c;像奥威BI系统就上线了大量的可视化大屏模板。这些模板实际上都是一张张完整的可视化大屏报表&#xff0c;从数据源到数据分析模型&#xff0c;再到数据可视化图表和智能分析功…

最小可用原型:极大降低风险的方法

最小可用原型&#xff1a;极大降低风险的方法【安志强趣讲279期】 趣讲大白话&#xff1a;先试一下水 **************************** 精益创业的最小可用原型MVP 胸怀大志&#xff0c;要从小做起 把愿景拆解成一个个独立的部分 每个独立的部分做出假设&#xff1a; 1、价值假设…

MAC层是如何工作的

有一个叫做 Hub 的东西&#xff0c;也就是集线器。这种设备有多个口&#xff0c;可以将宿舍里的多台电脑连接起来。但是&#xff0c;和交换机不同&#xff0c;集线器没有大脑&#xff0c;它完全在物理层工作。它会将自己收到的每一个字节&#xff0c;都复制到其他端口上去。这是…