当前位置: 首页 > news >正文

C语言:定义和使用结构体变量

定义和使用结构体变量

  • 介绍
  • 基础用法
    • 1.定义结构体
    • 2. 声明结构体变量
    • 3. 初始化和访问结构体成员
    • 4. 使用指针访问结构体成员
    • 5. 使用结构体数组
  • 高级用法
    • 6. 嵌套结构体
    • 7. 匿名结构体
    • 8. 结构体和动态内存分配
    • 9. 结构体作为函数参数
      • 按值传递
      • 按引用传递

介绍

在C语言中,结构体(struct)是一种用户定义的数据类型,它允许我们将不同类型的数据组合在一起。结构体对于处理相关联的数据非常有用,比如将一个人的姓名、年龄和地址组合在一起。

基础用法

1.定义结构体

定义结构体的语法如下:

struct 结构体名 {数据类型 成员名1;数据类型 成员名2;...数据类型 成员名N;
};

例如,我们可以定义一个表示人的结构体:

#include <stdio.h>// 定义结构体
struct Person {char name[50];int age;char address[100];
};

2. 声明结构体变量

在定义了结构体之后,我们可以声明结构体变量:

// 声明结构体变量
struct Person person1;

我们也可以在定义结构体时同时声明结构体变量:

struct Person {char name[50];int age;char address[100];
} person1, person2;

3. 初始化和访问结构体成员

我们可以使用点运算符(.)来访问和赋值结构体的成员:

#include <stdio.h>struct Person {char name[50];int age;char address[100];
};int main() {// 声明并初始化结构体变量struct Person person1 = {"Alice", 30, "123 Main St"};// 访问结构体成员printf("Name: %s\n", person1.name);printf("Age: %d\n", person1.age);printf("Address: %s\n", person1.address);// 修改结构体成员person1.age = 31;printf("Updated Age: %d\n", person1.age);return 0;
}

输出结果:

在这里插入图片描述

4. 使用指针访问结构体成员

我们还可以通过指针访问结构体成员,使用箭头运算符(->):

#include <stdio.h>struct Person {char name[50];int age;char address[100];
};int main() {struct Person person1 = {"Bob", 25, "456 Elm St"};struct Person *ptr_person = &person1;// 使用指针访问结构体成员printf("Name: %s\n", ptr_person->name);printf("Age: %d\n", ptr_person->age);printf("Address: %s\n", ptr_person->address);// 通过指针修改结构体成员ptr_person->age = 26;printf("Updated Age: %d\n", ptr_person->age);return 0;
}

输出结果:
在这里插入图片描述

5. 使用结构体数组

有时候我们需要处理多个相同类型的结构体变量,这时可以使用结构体数组:

#include <stdio.h>struct Person {char name[50];int age;char address[100];
};int main() {// 定义结构体数组struct Person people[2] = {{"Charlie", 22, "789 Maple St"},{"Dana", 28, "101 Oak St"}};for (int i = 0; i < 2; i++) {printf("Person %d:\n", i + 1);printf("  Name: %s\n", people[i].name);printf("  Age: %d\n", people[i].age);printf("  Address: %s\n", people[i].address);}return 0;
}

输出结果:
在这里插入图片描述

高级用法

6. 嵌套结构体

结构体可以包含其他结构体作为它的成员,这称为嵌套结构体。嵌套结构体可以帮助我们创建更加复杂的数据结构。

#include <stdio.h>struct Address {char street[100];char city[50];char state[20];int zip;
};struct Person {char name[50];int age;struct Address address; // 嵌套结构体
};int main() {struct Person person1 = {"Emily", 35, {"123 Oak St", "Springfield", "IL", 62704}};printf("Name: %s\n", person1.name);printf("Age: %d\n", person1.age);printf("Address: %s, %s, %s, %d\n", person1.address.street, person1.address.city, person1.address.state, person1.address.zip);return 0;
}

输出结果:
在这里插入图片描述

7. 匿名结构体

在某些情况下,我们可以使用匿名结构体来简化代码。匿名结构体没有名字,可以直接使用。

#include <stdio.h>struct Person {char name[50];int age;struct {char street[100];char city[50];char state[20];int zip;} address; // 匿名结构体
};int main() {struct Person person1 = {"Frank", 40, {"456 Pine St", "Riverdale", "NY", 10567}};printf("Name: %s\n", person1.name);printf("Age: %d\n", person1.age);printf("Address: %s, %s, %s, %d\n", person1.address.street, person1.address.city, person1.address.state, person1.address.zip);return 0;
}

输出结果:
在这里插入图片描述

8. 结构体和动态内存分配

在处理大型数据集或需要动态创建结构体时,可以使用动态内存分配(如mallocfree)。

#include <stdio.h>
#include <stdlib.h> // 包含 malloc 和 free
#include <string.h>struct Person {char name[50];int age;char address[100];
};int main() {// 动态分配内存给结构体struct Person *person1 = (struct Person *)malloc(sizeof(struct Person));if (person1 == NULL) {printf("Memory allocation failed\n");return 1;}// 初始化结构体成员strcpy(person1->name, "George");person1->age = 45;strcpy(person1->address, "789 Birch St");// 访问结构体成员printf("Name: %s\n", person1->name);printf("Age: %d\n", person1->age);printf("Address: %s\n", person1->address);// 释放分配的内存free(person1);return 0;
}

输出结果:
在这里插入图片描述

9. 结构体作为函数参数

结构体可以作为函数的参数传递。传递结构体有两种方式:按值传递和按引用传递。

按值传递

按值传递会复制整个结构体,因此函数内部的修改不会影响原始结构体。

#include <stdio.h>struct Person {char name[50];int age;
};void printPerson(struct Person p) {printf("Name: %s\n", p.name);printf("Age: %d\n", p.age);
}int main() {struct Person person1 = {"Helen", 50};printPerson(person1);return 0;
}

输出结果:
在这里插入图片描述

按引用传递

按引用传递通过传递指针,可以修改原始结构体。

#include <stdio.h>struct Person {char name[50];int age;
};void updateAge(struct Person *p, int newAge) {p->age = newAge;
}int main() {struct Person person1 = {"Ivy", 55};printf("Before update: Age = %d\n", person1.age);updateAge(&person1, 60);printf("After update: Age = %d\n", person1.age);return 0;
}

输出结果:
在这里插入图片描述

相关文章:

C语言:定义和使用结构体变量

定义和使用结构体变量 介绍基础用法1.定义结构体2. 声明结构体变量3. 初始化和访问结构体成员4. 使用指针访问结构体成员5. 使用结构体数组 高级用法6. 嵌套结构体7. 匿名结构体8. 结构体和动态内存分配9. 结构体作为函数参数按值传递按引用传递 介绍 在C语言中&#xff0c;结…...

Vue3学习第二天记录

Vue3学习第二天记录 背景说明截图记录一个简单的JS文件Vue3的watch()函数Vue3的toRef()/toRefs()函数前端数据类型的分类前端写一个对外暴露的函数前端的...语法Vue3中watch()函数的总结Vue3中watchEffect()函数Vue3中watch()函数的坑Vue3中computed()函数 背景 最近在学习尚硅…...

C语言:双链表

一、什么是双链表&#xff1f; 双链表&#xff0c;顾名思义&#xff0c;是一种每个节点都包含两个链接的链表&#xff1a;一个指向下一个节点&#xff0c;另一个指向前一个节点。这种结构使得双链表在遍历、插入和删除操作上都表现出色。与单链表相比&#xff0c;双链表不仅可以…...

Java物业管理系统+数据库应用程序开发[JavaSE+JDBC+idea控制台+MySQL]

背景&#xff1a; 使用JavaSEJDBCMySQL技术实现一个物业管理系统&#xff0c;具体要求如下 物业管理系统需求&#xff1a; 需求分析 1.1用户需求分析 在进入系统之前&#xff0c;要进行身份确认&#xff0c;只有用户名和用户密码都相符的用户方可进入本系统&#xff0c;为…...

未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序。.net 读取excel的时候报错(实测有效)

1. 下载AccessDatabaseEngine.exe 下载链接 添加链接描述 2. office excel是64为的需要安装【AccessDatabaseEngine.exe】、32位的【AccessDatabaseEngine_X64.exe】 3. 我的是64为&#xff0c;跳过32位安装检测 1. 找到下载的安装包 2.输入安装包文件全称并在后面加上/pas…...

JVM垃圾收集器和性能调优

目标&#xff1a; 1.JVM垃圾收集器有哪几种&#xff1f; 2.CMS垃圾收集器回收步骤。 一、JVM常见的垃圾回收器 为什么垃圾回收的时候需要STW? 标记垃圾的时候&#xff0c;如果不STW&#xff0c;可能用户线程就会不停的产生垃圾。 1.1 单线程收集 Serial和SerialOld使用单…...

汽车EDI——Volvo EDI 项目案例

项目背景 作为Volvo的长期合作伙伴&#xff0c;C公司收到Volvo的EDI对接邀请&#xff0c;需要实现EDI对接。C公司将会面临哪些挑战&#xff1f;又应该相应地选择何种EDI解决方案呢&#xff1f; 汽车行业强调供需双方的高效协同&#xff08;比如研发设计、生产计划、物流信息等…...

Qt应用程序发布

一、静态编译发布 1.0:以Release模式构建工程 1.1:查看当前构建生成路径,并将所生成的.exe单独拷贝出来 1.2:将可执行文件*.exe拷贝至任一目标文件夹:D:\Temporary\QQIF 2:查看安装Qt时发布工具windeployqt.exe所在的目录 windeployqt.exe在Qt开发套件的bin目录下。Qt的每…...

Python 机器学习 基础 之 【常用机器学习库】 NumPy 数值计算库

Python 机器学习 基础 之 【常用机器学习库】 NumPy 数值计算库 目录 Python 机器学习 基础 之 【常用机器学习库】 NumPy 数值计算库...

Linux Kernel nf_tables 本地权限提升漏洞(CVE-2024-1086)

文章目录 前言声明一、netfilter介绍二、漏洞成因三、漏洞危害四、影响范围五、漏洞复现六、修复方案临时解决方案升级修复方案 前言 2024年1月&#xff0c;各Linux发行版官方发布漏洞公告&#xff0c;修复了一个 netfilter:nf_tables 模块中的释放后重用漏洞&#xff08;CVE-…...

[word] word如何清除超链接 #媒体#笔记#知识分享

word如何清除超链接 办公中&#xff0c;少不了使用word&#xff0c;这个是大家必备的软件&#xff0c;今天给大家分享下word如何清除超链接的操作办法&#xff0c;一起来学习下吧&#xff01; 1、清除所有超链接 按下组合键CtrlshiftF9&#xff0c;就可以将网上复制带有超链…...

【Linux】进程(9):进程控制1

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家了解Linux进程&#xff08;9&#xff09;进程控制1&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 1 fork函数2 进程终止&#xff08;A&#xff09;终止是…...

华为RH2288H V3服务器iBMC的SSL证书续期

本文对华为RH2288H V3服务器iBMC的SSL证书续期&#xff0c;以避名登录告警提示及主机状态异常。 一、检查现网服务器iBMC的SSL证书到期时间 登录iBMC&#xff0c;点击配置--SSL证书&#xff0c;如下&#xff1a; 可以看到本服务器SSL证书将于今年7月22日到期。 二、联系厂家…...

ubuntu开机黑屏

BusyBox v1.30.1 (Ubuntu 1:1.30.1-4ubuntu6.1) built-in shell (ash) Enter help for a list of built-in commands. 解决&#xff1a; help 看看哪个盘出问题了 fsck -y /dev/sda1 &#xff08;出问题的磁盘/分区&#xff09; reboot 就可以进入系统了 fsck命令&#xf…...

【risc-v】arm和riscv有什么关系或者联系?

ARM和RISC-V都是基于精简指令集计算&#xff08;RISC&#xff09;原理的处理器架构&#xff0c;它们在设计理念上有一定的联系&#xff0c;但同时存在一些关键的区别&#xff1a; 设计理念&#xff1a;ARM和RISC-V都采用了RISC的核心设计原则&#xff0c;即通过简化指令集来提高…...

Flutter项目开发模版,开箱即用

前言 当前案例 Flutter SDK版本&#xff1a;3.22.2 每当我们开始一个新项目&#xff0c;都会 引入常用库、封装工具类&#xff0c;配置环境等等&#xff0c;我参考了一些文档&#xff0c;将这些内容整合、简单修改、二次封装&#xff0c;得到了一个开箱即用的Flutter开发模版…...

私有仓库搭建

目前市面上比较常见的私有仓库搭建方法为&#xff1a; 通过 Sinopia 或 verdaccio 搭建&#xff08;Sinopia 已经停止维护&#xff0c;verdaccio 是 Fork 自 Sinopia&#xff0c;基本上大同小异&#xff09;&#xff0c;其优点是搭建简单&#xff0c;不需要其他服务。通过 cnp…...

axios设置 responseType为 “stream“流式获取后端数据

使用前景&#xff1a; 工作过程中遇到了后端接口响应过慢&#xff0c;前端界面一致loading的情况&#xff0c;这个时候可以尝试采用将Axios的responseType参数被设置为stream类型实现。 stream介绍&#xff1a; stream类型意味着你希望服务器响应的数据以Node.js流&#xff…...

Apache POI(使用Java读写Excel表格数据)

1.Apache POI简介 Apache POI是一个开源的Java库&#xff0c;用于操作Microsoft Office格式的文件。它支持各种Office文档的读写功能&#xff0c;包括Word文档、Excel电子表格、PowerPoint演示文稿、Outlook电子邮件等。Apache POI提供了一组API&#xff0c;使得Java开发者能够…...

golang中只用定义不用初始化的类型规律总结

在go语言的开发中&#xff0c;有很多的内置类型是我们只需要定义而不需要初始化的&#xff0c; 如上文中提到的bytes.Buffer&#xff0c; strings.Builder。 其实在go语言中官方给我们定义的很多的类型都只需要定义&#xff0c;不需要初始化。 他们都有2个共同的规律&#xff…...

数据库之PostgreSQL详解

一、PostgreSQL介绍 PostgreSQL是一个功能强大的 开源 的关系型数据库。底层基于C实现。 PostgreSQL的开源协议和Linux内核版本的开源协议是一样的。。BDS协议&#xff0c;这个协议基本和MIT开源协议一样&#xff0c;说人话&#xff0c;就是你可以对PostgreSQL进行一些封装&a…...

找出链表倒数第k个元素-链表题

LCR 140. 训练计划 II - 力扣&#xff08;LeetCode&#xff09; 快慢指针。快指针臂慢指针快cnt个元素到最后&#xff1b; class Solution { public:ListNode* trainingPlan(ListNode* head, int cnt) {struct ListNode* quick head;struct ListNode* slow head;for(int i …...

ssm629基于SSM的二手交易平台设计与开发+jsp【已测试】

前言&#xff1a;&#x1f469;‍&#x1f4bb; 计算机行业的同仁们&#xff0c;大家好&#xff01;作为专注于Java领域多年的开发者&#xff0c;我非常理解实践案例的重要性。以下是一些我认为有助于提升你们技能的资源&#xff1a; &#x1f469;‍&#x1f4bb; SpringBoot…...

【Unity】资源管理与热更 YooAsset+HybridCLR

1 前言 Unity资源管理与热更新该用什么方法&#xff1f;当然是YooAssetHybridCLR了&#xff0c;YooAsset负责资源管理与热更&#xff0c;HybridCLR负责支持代码热更。 但这里我就不自己讲了&#xff0c;我会提供相关学习链接&#xff08;前人栽树我躺平&#xff09;。 2 学习链…...

PDF批量加水印 与 去除水印实践

本文主要目标是尝试去除水印&#xff0c;但是为了准备测试数据&#xff0c;我们需要先准备好有水印的pdf测试文件。 注意&#xff1a;本文的去水印只针对文字悬浮图片悬浮两种特殊情况&#xff0c;即使是这两种情况也不代表一定都可以去除水印。 文章目录 批量添加透明图片水印…...

【MySQL】服务器配置和管理

本文使用的MySQL版本是8.0 MySQL服务器介绍 MySQL服务器通常说的是mysqld程序。 mysqld 是 MySQL 数据库服务器的核心程序&#xff0c;负责处理客户端的请求、管理数据库和执行数据库操作。管理员可以通过配置文件和各种工具来管理和监控 mysqld 服务器的运行 官方文档&…...

限流定义、算法、实施方案

限流定义 1、 时间 &#xff0c; 基于某段时间或某个时间点&#xff0c;即&#xff1a;时间窗口 2、资源&#xff1a; 对可用资源进行限制&#xff1a; QPS/连接数/传输速率/黑白名单等 分布式环境下&#xff0c;主流限流方案&#xff1a; 网关层限流&#xff1a;流量入口Ngi…...

[312. 戳气球] 动态规划寻找转移函数

Problem: 312. 戳气球 文章目录 思路Code 思路 这个哥们写的思路真的很牛逼&#xff0c;转载一下他。 戳气球题解 Code class Solution { public:int maxCoins(vector<int>& nums) {nums.insert(nums.begin(), 1);nums.push_back(1);int n nums.size();vector<v…...

以操作系统和Java的视角看“中断“

引言 fucking-java-concurrency主要解读了在开发过程中常常会遇到的Java并发问题&#xff0c;本文主要总结Java的中断原理和应用。 PS: https://github.com/WeiXiao-Hyy/blog整理了后端开发的知识网络&#xff0c;欢迎Star&#xff01; 操作系统的中断 什么是中断&#xff1…...

【运维】如何在Ubuntu 22上使用Python 3.8的虚拟环境

在Ubuntu 22上使用Python 3.8的虚拟环境安装Ryu是相对简单的。以下是一步一步的指南&#xff1a; https://qq742971636.blog.csdn.net/article/details/139566151 安装Python 3.8&#xff1a; 在Ubuntu 22上&#xff0c;Python 3.8可能不是默认安装的版本。你可以使用以下命令…...

汕头市住建局/seo外包软件

比较明显的网络流最小割模型&#xff0c;对于这种模型我们需要先求获利的和&#xff0c;然后减去代价即可。 我们对于第i个人来说&#xff0c; 如果选他&#xff0c;会耗费A[I]的代价&#xff0c;那么(source,i,a[i])代表选他之后的代价&#xff0c;如果不选他&#xff0c;我们…...

wordpress集成到app/seo网站优化排名

基本概念首先简单介绍一下地理坐标系、大地坐标系以及地图投影的概念&#xff1a;● 地理坐标系&#xff1a;为球面坐标。参考平面地是椭球面&#xff0c;坐标单位&#xff1a;经纬度;● 投影坐标系&#xff1a;为平面坐标。参考平面地是水平面&#xff0c;坐标单位&#x…...

百度云附件 wordpress/东莞seo外包平台

关于如何架设PT请参考&#xff1a;NexusPHP架设PT服务站点教程 安装完成后发现可以局域网内可以做种&#xff0c;但是外网就不行了&#xff0c;查看种子下载地址列表会显示可连接性为否&#xff0c;查看了announce.php文件&#xff0c;可连接性由这段代码决定 $sockres pfsock…...

做网站正规公司/优化关键词软件

1&#xff0c;直接在当前浏览器更换皮肤 2&#xff0c;在当前浏览器更换皮肤并保存到cookle 3&#xff0c;在当前浏览器更换皮肤并保持到config文件 1.直接添加其他css文件换肤. 皮肤文件:xtheme-olive.zip下载 把皮肤文件解压,把css文件(如xtheme-olive.css…...

佛山百度快照优化排名/株洲seo优化

0&#xff0c;Matlab语言的介绍 1&#xff0e;什么叫计算&#xff1f; 在汉语中&#xff0c;“计算”一词的含义&#xff1a; 谋划 &#xff0c;考虑 &#xff0c; 算计。随着电子计算机的产生与应用&#xff0c;人们对“计算”的理解发生了很大的变化。 &#xff…...

网站建设沈阳/关键词指数

作者&#xff1a;小傅哥 博客&#xff1a;https://bugstack.cn 沉淀、分享、成长&#xff0c;让自己和他人都能有所收获&#xff01;&#x1f604; 一、前言 为什么&#xff0c;读不懂框架源码&#xff1f; 我们都知道作为一个程序员&#xff0c;如果想学习到更深层次的技术&…...