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. 结构体和动态内存分配
在处理大型数据集或需要动态创建结构体时,可以使用动态内存分配(如malloc和free)。
#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语言中,结…...
Vue3学习第二天记录
Vue3学习第二天记录 背景说明截图记录一个简单的JS文件Vue3的watch()函数Vue3的toRef()/toRefs()函数前端数据类型的分类前端写一个对外暴露的函数前端的...语法Vue3中watch()函数的总结Vue3中watchEffect()函数Vue3中watch()函数的坑Vue3中computed()函数 背景 最近在学习尚硅…...
C语言:双链表
一、什么是双链表? 双链表,顾名思义,是一种每个节点都包含两个链接的链表:一个指向下一个节点,另一个指向前一个节点。这种结构使得双链表在遍历、插入和删除操作上都表现出色。与单链表相比,双链表不仅可以…...
Java物业管理系统+数据库应用程序开发[JavaSE+JDBC+idea控制台+MySQL]
背景: 使用JavaSEJDBCMySQL技术实现一个物业管理系统,具体要求如下 物业管理系统需求: 需求分析 1.1用户需求分析 在进入系统之前,要进行身份确认,只有用户名和用户密码都相符的用户方可进入本系统,为…...
未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序。.net 读取excel的时候报错(实测有效)
1. 下载AccessDatabaseEngine.exe 下载链接 添加链接描述 2. office excel是64为的需要安装【AccessDatabaseEngine.exe】、32位的【AccessDatabaseEngine_X64.exe】 3. 我的是64为,跳过32位安装检测 1. 找到下载的安装包 2.输入安装包文件全称并在后面加上/pas…...
JVM垃圾收集器和性能调优
目标: 1.JVM垃圾收集器有哪几种? 2.CMS垃圾收集器回收步骤。 一、JVM常见的垃圾回收器 为什么垃圾回收的时候需要STW? 标记垃圾的时候,如果不STW,可能用户线程就会不停的产生垃圾。 1.1 单线程收集 Serial和SerialOld使用单…...
汽车EDI——Volvo EDI 项目案例
项目背景 作为Volvo的长期合作伙伴,C公司收到Volvo的EDI对接邀请,需要实现EDI对接。C公司将会面临哪些挑战?又应该相应地选择何种EDI解决方案呢? 汽车行业强调供需双方的高效协同(比如研发设计、生产计划、物流信息等…...
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月,各Linux发行版官方发布漏洞公告,修复了一个 netfilter:nf_tables 模块中的释放后重用漏洞(CVE-…...
[word] word如何清除超链接 #媒体#笔记#知识分享
word如何清除超链接 办公中,少不了使用word,这个是大家必备的软件,今天给大家分享下word如何清除超链接的操作办法,一起来学习下吧! 1、清除所有超链接 按下组合键CtrlshiftF9,就可以将网上复制带有超链…...
【Linux】进程(9):进程控制1
大家好,我是苏貝,本篇博客带大家了解Linux进程(9)进程控制1,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️ 目录 1 fork函数2 进程终止(A)终止是…...
华为RH2288H V3服务器iBMC的SSL证书续期
本文对华为RH2288H V3服务器iBMC的SSL证书续期,以避名登录告警提示及主机状态异常。 一、检查现网服务器iBMC的SSL证书到期时间 登录iBMC,点击配置--SSL证书,如下: 可以看到本服务器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. 解决: help 看看哪个盘出问题了 fsck -y /dev/sda1 (出问题的磁盘/分区) reboot 就可以进入系统了 fsck命令…...
【risc-v】arm和riscv有什么关系或者联系?
ARM和RISC-V都是基于精简指令集计算(RISC)原理的处理器架构,它们在设计理念上有一定的联系,但同时存在一些关键的区别: 设计理念:ARM和RISC-V都采用了RISC的核心设计原则,即通过简化指令集来提高…...
Flutter项目开发模版,开箱即用
前言 当前案例 Flutter SDK版本:3.22.2 每当我们开始一个新项目,都会 引入常用库、封装工具类,配置环境等等,我参考了一些文档,将这些内容整合、简单修改、二次封装,得到了一个开箱即用的Flutter开发模版…...
私有仓库搭建
目前市面上比较常见的私有仓库搭建方法为: 通过 Sinopia 或 verdaccio 搭建(Sinopia 已经停止维护,verdaccio 是 Fork 自 Sinopia,基本上大同小异),其优点是搭建简单,不需要其他服务。通过 cnp…...
axios设置 responseType为 “stream“流式获取后端数据
使用前景: 工作过程中遇到了后端接口响应过慢,前端界面一致loading的情况,这个时候可以尝试采用将Axios的responseType参数被设置为stream类型实现。 stream介绍: stream类型意味着你希望服务器响应的数据以Node.js流ÿ…...
Apache POI(使用Java读写Excel表格数据)
1.Apache POI简介 Apache POI是一个开源的Java库,用于操作Microsoft Office格式的文件。它支持各种Office文档的读写功能,包括Word文档、Excel电子表格、PowerPoint演示文稿、Outlook电子邮件等。Apache POI提供了一组API,使得Java开发者能够…...
golang中只用定义不用初始化的类型规律总结
在go语言的开发中,有很多的内置类型是我们只需要定义而不需要初始化的, 如上文中提到的bytes.Buffer, strings.Builder。 其实在go语言中官方给我们定义的很多的类型都只需要定义,不需要初始化。 他们都有2个共同的规律ÿ…...
新手避坑指南:ICC LAB2 Design Planning 从加载设计到写出DEF的完整流程复盘
ICC LAB2 Design Planning全流程深度解析:从数据加载到DEF输出的实战避坑指南 当你第一次打开ICC工具面对LAB2的Design Planning任务时,是否感觉像被扔进了一个满是按钮的控制室?每个命令似乎都重要,但又不清楚它们如何串联成完整…...
从癌症研究到企业风控:用Python实战Cox比例风险模型(附完整代码与数据)
从医学到商业:Python实战Cox风险模型的企业级应用 在医疗领域,我们关心患者存活时间;在商业世界,我们关注客户生命周期。看似迥异的场景背后,都隐藏着同一个数学工具的身影——Cox比例风险模型。这个诞生于1972年的生存…...
告别Keil!用VSCode+OpenOCD+STLink一键下载STM32程序(保姆级教程)
用VSCodeOpenOCDSTLink打造高效STM32开发环境 在嵌入式开发领域,Keil和IAR等传统IDE长期占据主导地位,但它们臃肿的安装包、昂贵的授权费用和略显陈旧的用户界面让许多开发者开始寻找更现代化的替代方案。Visual Studio Code(VSCodeÿ…...
AI碳足迹深度解析:从模型压缩到软硬协同的绿色AI实践
1. 从“算力怪兽”到“绿色引擎”:AI碳足迹问题的深度拆解 最近和几个在芯片厂和云服务商工作的老朋友聊天,话题总绕不开一个词:电费。不是开玩笑,现在训练一个大模型,电费账单能轻松超过一个小型数据中心的日常运维成…...
STC8H8K64U单片机IAP升级实战:从官方例程到自定义协议的完整移植指南
STC8H8K64U单片机IAP升级实战:从官方例程到自定义协议的完整移植指南 在嵌入式系统开发中,固件升级是一个永恒的话题。想象一下这样的场景:你的设备已经部署在客户现场,突然发现了一个需要紧急修复的Bug,或者需要增加新…...
模函数激活:挑战ReLU的极致简洁方案,为CV与TinyML带来性能突破
1. 项目概述:为什么我们需要重新审视激活函数?在深度学习的工具箱里,激活函数可能是最不起眼,却又最不可或缺的部件。它就像神经网络中的“开关”或“阀门”,决定了每个神经元是否被激活,以及激活的程度。长…...
利用taotoken模型广场为ai应用快速进行模型选型与测试
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 利用Taotoken模型广场为AI应用快速进行模型选型与测试 在构建一个需要集成多种AI能力的应用时,开发者面临的首要挑战往…...
PDPI Spec:规格驱动开发协议,让AI编程告别“氛围编码”
1. 项目概述:从“感觉对了”到“规格对了”在软件开发的江湖里,我们可能都经历过这样的场景:产品经理丢过来一个模糊的需求,开发同学凭着一腔热血和“感觉对了”的直觉,一头扎进代码里。几周后,功能上线了&…...
开源贡献者如何优雅管理上游补丁:隔离、消毒与自动化工作流实践
1. 项目概述:一个开源贡献者的“清洁”工作流如果你和我一样,长期维护着一些开源项目,同时又基于这些项目进行深度定制和二次开发,那你一定遇到过这个经典难题:如何优雅地管理那些你为上游项目(即原始开源项…...
Backlink Pilot:开源SEO自动化工具,提升外链建设效率
1. 项目概述:一个被低估的SEO自动化利器如果你在独立站、内容营销或者SEO领域摸爬滚打过一段时间,肯定对“外链建设”这四个字又爱又恨。爱的是,它确实是搜索引擎排名算法中一个极其重要的权重因子;恨的是,这个过程枯燥…...
