C语言中的结构体:从定义到传递

news2024/11/27 8:21:23

前言

结构体是C语言中一种重要的数据类型,它允许我们将不同类型的数据组合成一个整体,并以自定义的方式进行操作。通过结构体,我们可以更加灵活地管理和处理复杂的数据结构,从而提高程序的可读性和可维护性。本篇博客将从结构体的定义开始,逐步介绍其在C语言中的应用,包括结构体变量的定义和初始化、结构体成员的访问、结构体作为函数参数的传递等内容,帮助读者深入理解C语言中结构体的核心概念和用法。接下来我们来详细解释一下

概述

  • 有时我们需要将不同类型的数据组合成一个有机的整体,如:一个学生有学号/姓名/性别/年龄/地址等属性
    • 这时候可通过结构体实现
  • 结构体(struct)可以理解为用户自定义的特殊的复合的“数据类型”

image.png

结构体变量的定义和初始化

  • 定义结构体变量的方式:
    • 先声明结构体类型再定义变量名
    • 在声明类型的同时定义变量
  • 语法格式:
// 先声明结构体类型再定义变量名
struct 结构体名 {
    成员列表
};
struct 结构体名 变量名;

// 在声明类型的同时定义变量
struct 结构体名 {
    成员列表
}变量名;
  • 示例代码:
// 结构体类型的定义
struct stu {
	char name[50];
	int age;
};

// 先定义类型,再定义变量(常用)
struct stu s1 = {"mike", 18};

// 定义类型同时定义变量
struct stu2 {
	char name[50];
	int age;
}s2 = {"yoyo", 19};

结构体成员的使用

  • 如果是结构体变量,通过 . 操作成员
  • 如果是结构体指针变量,通过 -> 操作成功
#include <stdio.h>
#include <string.h>

// 结构体类型的定义
struct stu {
    char name[50];
    int age;
};

int main() {
    // 定义结构体变量,同时初始化
    struct stu s = {"mike", 18};
    // 打印成员变量
    printf("%s, %d\n", s.name, (&s)->age);
    // 修改成功变量的内容
    strcpy(s.name, "yoyo");
    s.age = 19;
    // 打印成员变量
    printf("%s, %d\n", s.name, (&s)->age);

    return 0;
}

结构体做函数参数

结构体值传参

  • 传值是指将参数的值拷贝一份传递给函数,函数内部对该参数的修改不会影响到原来的变量

示例代码:

#include <stdio.h>
#include <string.h>

// 结构体类型的定义
struct stu {
    char name[50];
    int age;
};

// 函数定义
void func(struct stu temp) {
    strcpy(temp.name, "yoyo");
    temp.age = 20;
    printf("函数内部:%s, %d\n", temp.name, temp.age);
}

int main() {
    // 定义结构体变量
    struct stu s = {"mike", 18};
    // 调用函数,值传递
    func(s);
    // 打印成员变量
    printf("函数外部:%s, %d\n", s.name, (&s)->age);

    return 0;
}

运行结果:

函数内部:yoyo, 20
函数外部:mike, 18

结构体地址传递

  • 传址是指将参数的地址传递给函数,函数内部可以通过该地址来访问原变量,并对其进行修改。

示例代码:

#include <stdio.h>
#include <string.h>

// 结构体类型的定义
struct stu {
    char name[50];
    int age;
};

// 函数定义
void func(struct stu *p) {
    strcpy(p->name, "yoyo");
    p->age = 20;
    printf("函数内部:%s, %d\n", p->name, p->age);
}

int main() {
    // 定义结构体变量
    struct stu s = {"mike", 18};
    // 调用函数,地址传递
    func(&s);
    // 打印成员变量
    printf("函数外部:%s, %d\n", s.name, (&s)->age);

    return 0;
}

运行结果:

函数内部:yoyo, 20
函数外部:yoyo, 20

接下来我们来写一个小案例练习

题目:定义一个结构体Person,包含人的姓名和年龄两个成员变量。编写程序,创建一个Person类型的结构体数组,包含3个人的信息,并输出每个人的姓名和年龄。

代码示例:

#include <stdio.h>
#include <string.h>

struct Person {          // Person是结构体名
    char name[20];
    int age;
};
struct Person person[3] = {         // person[3]是结构体数组
    {"喜羊羊", 22},     // 结构元素
    {"懒羊羊", 23},
    {"沸羊羊", 25}
};
int main() {
    // 定义一个结构体Person,包含人的姓名和年龄两个成员变量。编写程序,创建一个Person类型的结构体数组,包含3个人的信息,并输出每个人的姓名和年龄。
    for(int i = 0; i < 3; i++){
        printf("姓名:%s,年龄:%d\n", person[i].name, person[i].age);
    }
 return 0;
}

总结

通过本篇博客,我们了解了C语言中结构体的重要性以及如何运用它来组织和管理数据。结构体不仅是一种数据类型,更是程序设计中的重要工具,能够帮助我们处理各种复杂的数据结构,实现更加高效、清晰的代码。希望本文能够对读者在学习和使用C语言时有所帮助,也欢迎大家分享自己对结构体的理解和应用经验,共同探讨C语言编程的知识。

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

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

相关文章

allure2教程-1-环境搭建

领取资料&#xff0c;咨询答疑&#xff0c;请➕wei: June__Go 自动化测试执行完成后我们需要展示给其他人看&#xff0c;这就要有自动化测试报告了。复杂的测试报告当然可以自己代码实现&#xff0c;但用pytest-html或allure基本也能满足我们生成测试报告的要求了。本小节介绍…

Rustdesk如何编译代码实现安装后,不会在右下角出现托盘图标

环境&#xff1a; Rustdesk1.1.9 问题描述&#xff1a; Rustdesk如何编译代码实现安装后&#xff0c;不会在右下角出现托盘图标 解决方案&#xff1a; 安装后只有自定义进程图标 详细方案&#xff0c;有需要私聊

Python及软件测试方面的总结的技巧

目录 一.Python &#xff08;一&#xff09;输入pip安装包时出现Fatal error in launcher错误 &#xff08;二&#xff09;如何使用清华镜像安装库 二.软件测试 一.Python &#xff08;一&#xff09;输入pip安装包时出现Fatal error in launcher错误 解决方法&#xff1a…

Linux之bpfjit(2)使用分析和mini-tcpdump实现

Linux之bpfjit(2)使用分析和mini-tcpdump实现 Author: Once Day Date: 2024年4月13日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章可以参考专栏&#xff1a;…

简约风好看的个人主页源码

效果图 PC端 移动端 源代码 index.html &#xfeff;<html lang"en"><head><meta charset"utf-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content&quo…

全网短剧搜索源码+短剧API接口 短剧下载 热门短剧 全开源可二开

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 pc端h5手机端全网短剧搜索前端源码分享 内含7000短剧资源(不支持在线播放&#xff09; 搜索API接口&#xff1a;文件内查看 全部短剧API接口&#xff1a;文件内查看 每日更新API接…

48.HarmonyOS鸿蒙系统 App(ArkUI)常用组件的使用

48.HarmonyOS鸿蒙系统 App(ArkUI)常用组件的使用 按钮触发事件 toast信息提示 单选按钮 复选框 切换按钮&#xff0c;开关按钮 进度条 textbox,textinput,TextArea文本输入框 气泡提示 import prompt from ohos.prompt; import promptAction from ohos.promptAction; …

DC-7渗透测试复现

DC-7渗透测试复现 目的&#xff1a; 获取最高权限以及flag 过程&#xff1a; 信息打点--SSH- 命令执行反弹shell-计时任务提权 环境&#xff1a; 攻击机&#xff1a;kali(192.168.85.137) 靶机&#xff1a;DC_3(192.168.85.139) 复现&#xff1a; 一.信息收集 nmap -s…

阿里云安全证书到期了,有证书的情况下如何重新续期

文章目录 前言零、阿里云使用证书说明一、如何看安全证书是否到期&#xff08;以百度为例&#xff09;1.点击链接旁边的按钮2.点击【连接是安全的】3.点击【证书有效】 4. 查看证书二、更换操作1.Digicert 和Digicert pro的区别2.在你购买证书后创建证书3. 填下面的域名 4. 验证…

李沐-动手学深度学习-Pytorch神经网络基础总结

注&#xff1a;1. 沐神对应章节视频出处 2.代码使用Jupyter Notebook运行更方便 3.文章笔记出处 一、层和块 层&#xff1a;层&#xff08;1&#xff09;接受一组输入&#xff0c; &#xff08;2&#xff09;生成相应的输出&#xff0c; &#xff08;3&#xff09;由一组可调整…

js+网络摄像头实现人体肢体关键点动作捕获

最近有一个项目&#xff0c;客户需要用户人体姿势识别&#xff0c;进行表演考核用途&#xff0c;或者康复中心用户恢复护理考核&#xff0c;需要用摄像头进行人体四肢进行肢体关键点对比考核&#xff0c;资料还是太少了。只有个别大佬发了部分技术指导。感觉写的不错。 阿里云…

WPF中DataGrid主从数据(父子数据)展示

在wpf中可以使用DataGrid控件,进行主从数据展示,也称父子数据展示。下面展示纯原生控件编码实现功能(样式自己可以根据需求进行修改)。 效果如下: 点击图标,展开和收缩可以自由的切换,也可以自己重新写一个样式,比如+,-或者类似图标的样式,都是可以的。 1.首先创建一…

C# 两种方法截取活动窗口屏幕,实现窗体截图

方法1&#xff0c;截屏内容仅包括活动窗口界面&#xff0c;而方法2是从屏幕范围取图&#xff0c;截屏内容会包括屏幕上所有内容。例如有一些程序在桌面顶层显示半透明的悬浮窗&#xff0c;用方法2截屏就会包括这些内容&#xff0c;并不是单纯的活动窗口内容。 方法1&#xff0c…

【数据结构与算法】:10道链表经典OJ

目录 1. 移除链表元素2. 反转链表2.1反转指针法2.2 头插法 3. 合并两个有序链表4. 分隔链表5. 环形链表6. 链表的中间节点7. 链表中倒数第K个节点8. 相交链表9. 环形链表的约瑟夫问题10. 链表的回文结构 1. 移除链表元素 思路1&#xff1a;遍历原链表&#xff0c;将 val 所在的…

YOLOv8最新改进系列:融合DySample超轻量动态上采样算子,低延迟、高性能,目前最新上采样方法!!!遥遥领先!

YOLOv8最新改进系列&#xff1a;融合DySample超轻量动态上采样算子&#xff0c;低延迟、高性能&#xff0c;目前最新上采样方法&#xff01;&#xff01;&#xff01;遥遥领先&#xff01; DySample超轻量动态上采样算子全文戳这&#xff01;here! 详细的改进教程以及源码&am…

复习回顾ES6基础篇(一小时学会es6)

基本语法 多行注释 /* 这里的所有内容 都是注释。 */单行注释 // 这是一条注释。变量定义 var x "" //定义范围变量 let y "" //定义局部变量 const z "" //定义常量运算符 变量类型 流程语句 if (condition) {/* 条件为真时运行的代…

《中医病证分类与代码》-中医疾病分类数据库

《中医病症分类与代码》由国家中医药管理局2020年底修订&#xff0c;目的是为中医疾病及证候的分类提供统一的规范。规定2021年起&#xff0c;各中医机构的临床科室及基层中医药的医师都应按照最新修订的《中医病症分类与代码》规范来填报病案及病历。 中医病证分类与代码数据库…

js base64 img 转 file

转化canvas的图像 打印canvas图像的dataurl const imgDataUrl canvas.toDataURL();console.log(imgDataUrl)上传的图像编码 1,把base64编码转为文件对象第一个参数dataUrl是一个base64的字符串。第二个参数是文件名可以随意命名funtion base64toFile(dataurl, filename fil…

基于ADB的Scrcpy实现电脑控制手机

Scrcpy是一个开源的&#xff0c;基于ADB&#xff08;Android 调试桥&#xff09;的手机到电脑上的投屏操控的实现&#xff0c;本文将介绍如何搭建开发环境&#xff0c;使得在Windows系统中去控制投屏的安卓手机。 1. 安装投屏软件 下载Scrcpy软件到电脑上&#xff0c;该软件中…

推荐一个超好用的测试工具,值得体验!

在软件开发领域中&#xff0c;测试是确保质量与可靠性的必要环节。俗话说得好“工欲善其事&#xff0c;必先利其器”&#xff0c;测试工具越简单、用户友好度越高&#xff0c;开发者编写测试的意愿度就越高。 为了满足大家的测试需求&#xff0c;MoonBit 标准库最近引入了 ins…