【C语言】结构体解谜:拆解数据的力量!

news2024/11/24 6:57:05

🍁博客主页:江池俊的博客

💫收录专栏:C语言—探索高效编程的基石

💡代码仓库:江池俊的代码仓库

🎪我的社区:GeekHub

🎉欢迎大家点赞👍评论📝收藏⭐

在这里插入图片描述

文章目录

  • 前言
  • 一、结构体的声明及结构体变量的定义和初始化
    • 🔖 结构体的基础知识
    • 🔖结构的声明
    • 🔖结构体变量的定义
    • 🔖结构成员的类型
    • 🔖结构体变量的初始化
  • 二、结构体成员的访问
    • 🔖结构体变量访问成员
    • 🔖结构体指针访问成员
  • 三、 结构体传参
    • 🔖值传递:
    • 🔖指针传递:


前言

在C语言中,结构体(Structure)是一种自定义的数据类型,它允许将不同类型的数据组合成一个整体,并可以方便地访问和操作这些数据。结构体是一种重要且常用的数据结构,本文将深入探讨结构体的定义、声明、初始化、访问以及常见应用场景。


一、结构体的声明及结构体变量的定义和初始化

🔖 结构体的基础知识

结构体是一种在C语言中定义和组织相关数据的自定义数据类型。它允许将多个不同类型的变量组合在一起,形成一个整体,以便更方便地操作和管理数据。(即结构体是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。)

结构体允许你将不同数据类型的变量组合成一个单一的数据结构,从而更好地表示现实世界中的实体、对象或概念。这有助于模块化、抽象化和组织代码,使得代码更具可读性、可维护性和可扩展性。

🔖结构的声明

在这里插入图片描述

在C语言中,我们可以通过使用关键字"struct"来定义一个结构体类型。例如,下面的代码定义了一个名为"Student"的结构体,用于表示一个学生的基本信息:

struct Stu
{
	//学生相关属性
	char name[20];
	int age;
	char sex[5];
	char id[20];
}s3,s4;//不可省略;
//s3,s4是结构体变量类型
//s3,s4是全局的
int main()
{
	struct Stu s1;
	struct Stu s2;
	//s1,s2是结构体类型的变量,是局部的
	return 0;
}

结构体的声明如下所示:(定义该类型定义struct不可省略

struct Student stu;

如果希望更加简洁,可以使用typedef关键字给结构体类型起一个别名,如下所示:

typedef struct Student
{
	//学生相关属性
	char name[20];
	int age;
	char sex[5];
	char id[20];
}Stu;//Stu是重新定义的新类型
int main()
{
	struct Stu s1;
	struct Stu s2;
	//s1,s2是结构体类型的变量,是局部的
	Stu s3;//s3也是局部结构体类型变量,由Stu定义的
	return 0;
}

这样,我们就可以直接使用"Stu"作为结构体类型的名称,而不需要再加上"struct"关键字。

🔖结构体变量的定义

一般分为以下三种情况:

  1. 直接定义变量:可以使用结构体类型和变量名直接进行定义。

    示例代码:

    struct Point
    {
     int x;
     int y;
    }p1; //声明类型的同时定义变量p1
    
  2. 先定义结构体类型,再定义变量:可以先定义结构体类型,然后使用该类型定义变量。

    示例代码:

    struct Point
    {
     int x;
     int y;
    };
    struct Point p2; //定义结构体变量p2
    
  3. 使用typedef定义结构体类型:可以使用typedef关键字定义一个结构体类型的别名,然后使用该别名定义变量。

    示例代码:

    typedef struct 
    {
        int x;
        int y;
    } Point;
    Point p3;//定义结构体变量p3
    

这些是常见的结构体变量定义的方法,根据实际需求选择适合的方式进行定义。

🔖结构成员的类型

结构的成员可以是标量、数组、指针,甚至是其他结构体。

🔖结构体变量的初始化

一般分为一下三种情况:

  1. 直接初始化:可以使用花括号将初始化的值赋给结构体变量的成员变量。

    代码示例:

    struct Person 
    {
        char name[20];
        int age;
    };
    
    struct Person p = {"John", 25};
    
  2. 逐个成员初始化:可以逐个成员地对结构体变量的成员变量进行赋值初始化。

    代码示例:

    struct Person 
    {
        char name[20];
        int age;
    };
    
    struct Person p;
    strcpy(p.name, "John");
    p.age = 25;
    
  3. 使用指针初始化:可以使用指向结构体类型的指针来初始化结构体变量的成员变量。

    代码示例:

    struct Person
     {
        char name[20];
        int age;
    };
    
    struct Person p;
    struct Person *ptr = &p;
    
    strcpy(ptr->name, "John");
    ptr->age = 25;
    

这些是常见的结构体变量初始化的方式,根据实际需求选择适合的方式进行初始化。

注意:如果结构体内还有结构体,则可以使用结构体嵌套初始化。

代码示例:

struct Point
{
 int x;
 int y;
};

struct Node
{
 int data;
 struct Point p;
 struct Node* next; 
}n1 = {10, {4,5}, NULL}; //结构体嵌套初始化

struct Node n2 = {20, {5, 6}, NULL};//结构体嵌套初始化

二、结构体成员的访问

🔖结构体变量访问成员

结构变量的成员是通过点操作符(.)访问的,点操作符接受两个操作数。

例如:

我们可以看到 s 有成员 name 和 age ;

那我们如何访问s的成员?

struct Stu
{
 char name[20];
 int age;
};
struct Stu s;
strcpy(s.name, "zhangsan");//使用.访问name成员
s.age = 20;//使用.访问age成员

🔖结构体指针访问成员

有时候我们得到的不是一个结构体变量,而是指向一个结构体的指针。

对于结构指针可以使用箭头(->)操作符来访问结构体的成员。

如下:

struct Stu
{
 char name[20];
 int age;
};
void print(struct Stu* ps)
{
 printf("name = %s   age = %d\n", (*ps).name, (*ps).age);
    //使用结构体指针访问指向对象的成员
 printf("name = %s   age = %d\n", ps->name, ps->age);
}
int main()
{
    struct Stu s = {"zhangsan", 20};
    print(&s);//结构体地址传参
    return 0;
}

三、 结构体传参

结构体传参可以通过值传递或指针传递来传递结构体作为函数参数。这两种方式都有自己的用途和注意事项。

🔖值传递:

当你将结构体作为值传递给函数时,函数会创建结构体的一个副本,对副本的修改不会影响原始结构体。

 #include <stdio.h>
 #include <string.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;
     strcpy(person1.name, "John");
     person1.age = 30;
 
     printPerson(person1);
 
     return 0;
 }
 

🔖指针传递:

通过将结构体的指针传递给函数,函数可以直接修改原始结构体的内容。

 #include <stdio.h>
 #include <string.h>
 
 struct Person 
 {
     char name[50];
     int age;
 };
 
 void modifyPerson(struct Person *p) 
 {
     strcpy(p->name, "Alice");
     p->age = 25;
 }
 
 int main() 
 {
     struct Person person1;
     strcpy(person1.name, "John");
     person1.age = 30;
 
     modifyPerson(&person1);//通过结构体指针修改结构体的成员变量
 
     printf("Name: %s\n", person1.name);
     printf("Age: %d\n", person1.age);
 
     return 0;
 }

代码示例:

struct S
{
 int data[1000];
 int num;
};
struct S s = {{1,2,3,4}, 1000};

//结构体传参
void print1(struct S s)
{
 printf("%d\n", s.num);
}

//结构体地址传参
void print2(struct S* ps)
{
 printf("%d\n", ps->num);
}

int main()
{
 print1(s);  //传结构体
 print2(&s); //传地址
 return 0;
}

上面的 print1 和 print2 函数哪个好些呢?

答案是:首选print2函数。

原因:

函数传参的时候,参数是需要压栈的。

如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。

结论:

结构体传参的时候,要传结构体的地址。


🔥今天的分享就到这里,如果觉得博主的文章还不错的话,请👍三连支持一下博主哦🤞

在这里插入图片描述

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

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

相关文章

9:00面试,9:06就出来了,问的问题实在有点变态。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到5月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%,…

Shell函数调用

定义一个函数&#xff0c;计算所有参数的和&#xff1a; #!/bin/bashfunction getsum(){local sum0for n in $do((sumn))donereturn $sum }getsum 10 20 55 15 #调用函数并传递参数 echo $?运行结果&#xff1a; 100

STM32 cubemx CAN

接收用到的结构体如下&#xff1a;CAN概念&#xff1a; 全称Controller Area Network&#xff0c;是一种半双工&#xff0c;异步通讯。 物理层&#xff1a; 闭环&#xff1a;允许总线最长40m&#xff0c;最高速1Mbps&#xff0c;规定总线两端各有一个120Ω电阻&#xff0c;闭环…

学习笔记整理-DOM-02-事件监听

一、什么是"事件监听" DOM允许书写JavaScript代码以让HTML元素对事件作出反应什么是"事件": 用户与网页的交互动作当用户点击元素时当鼠标移动到元素上时当文本框的内容被改变时当键盘在文本框中被按下时当网页已加载完毕时… “监听”&#xff0c;顾名思义…

项目实战 — 博客系统② {项目构建}

目录 一、创建项目 二、添加数据库 三、设置配置文件相关信息 四、 添加前端页面 五、构建项目分层 六、编写基本类 一、创建项目 二、添加数据库 -- 创建数据库 drop database if exists cat_blog; create database cat_blog DEFAULT CHARACTER SET utf8mb4;-- 使用数…

这四种订货系统不能选(一):不能独立品牌

随着商业环境的日益竞争和客户需求的不断变化&#xff0c;订货系统正逐渐成为企业管理中不可或缺的一部分。不少企业在订货系统的选择上不知从哪入手&#xff0c;今天我分享哪四种订货系统不能选。大家点个关注点个赞&#xff0c;我们接着往下看。 一、不能独立品牌的订货系统不…

C语言学习笔记---数据的存储详解

C语言程序设计笔记---015 C语言数据的存储1、数据类型的意义1.1、unsigned与signed数据类型例程11.2、补码与原码相互转换例程2 2、大小端的介绍2.1、大小端的例程12.2、大小端的例程2 --- 判断当前编译器环境属于大端或小端 3、综合练习题探究数据的存储3.1、练习题13.2、练习…

Qt 杂项(Qwt、样式等)

Qt隐藏窗口边框 this->setWindowFlags(Qt::FramelessWindowHint);Qt模态框 this->setWindowModality(Qt::ApplicationModal);QLable隐藏border 代码中设置 lable->setStyleSheet("border:0px");或者UI中直接设置样式&#xff1a;“border:0px” Qwt开源…

vue3 使用@vue-office/excel预览本地excel文件 demo

vue3 使用vue-office/excel预览excel文件 demo 显示如下&#xff1a; npm地址&#xff1a;https://www.npmjs.com/package/vue-office/excel vue-office还有pdf和docx&#xff0c;按需下载对应插件 npm install vue-office/excel vue-demivue代码如下 app.vue <templ…

2.Model、ModelMap和ModelAndView的使用详解

1.前言 最近SSM框架开发web项目&#xff0c;用得比较火热。spring-MVC肯定用过&#xff0c;在请求处理方法可出现和返回的参数类型中&#xff0c;最重要就是Model和ModelAndView了&#xff0c;对于MVC框架&#xff0c;控制器Controller执行业务逻辑&#xff0c;用于产生模型数据…

腾讯云国际站代充-阿里云ECS怎么一键迁移到腾讯云cvm?

今天主要来介绍一下如何通过阿里云国际ECS控制台一键迁移至腾讯云国际CVM。腾讯云国际站云服务器CVM提供全面广泛的服务内容。无-需-绑-定PayPal&#xff0c;代-充-值腾讯云国际站、阿里云国际站、AWS亚马逊云、GCP谷歌云&#xff0c;官方授权经销商&#xff01;靠谱&#xff0…

嵌入式Qt开发—Excel表格数据导出

有一个嵌入式Excel表格数据导出的需求&#xff1a;应用软件运行于嵌入式Linux平台上&#xff0c;在设备运行过程中&#xff0c;存储了许多数据&#xff0c;这些数据想以表格的形式导出。考虑到Windows平台的普遍性&#xff0c;需要将数据以excel表格形式导出&#xff0c;故选择…

基于机器学习的假新闻检测 -- 机器学习项目基础篇(14)

不同平台上的假新闻正在广泛传播&#xff0c;这是一个令人严重关切的问题&#xff0c;因为它导致社会稳定和人们之间建立的纽带的永久破裂。很多研究已经开始关注假新闻的分类。 在这里&#xff0c;我们将尝试在Python中的机器学习的帮助下解决这个问题。 主要步骤 导入库和数…

一生一芯4——使用星火应用商店在ubuntu下载QQ、微信、百度网盘

星火应用商店可以非常方便的完成一些应用的下载&#xff0c;下面是官方网址 http://spark-app.store/download 我使用的是intel处理器&#xff0c;无需下载依赖项&#xff0c;直接点击软件本体 我这里下载amd64,根据自己的处理器下载对应版本 sudo apt install ./spark-stor…

影响股票数据接口l2传输数据快慢因素有哪些?(l2数据接口)

股票数据接口l2是一种用于获取股票市场相关数据的编程接口。它允许开发者通过编程的方式获取、查询、订阅和更新股票相关数据&#xff0c;如股票价格、成交量、财务数据等&#xff0c;并将这些数据用于自己的应用或系统中。l2数据接口通常提供实时行情数据、历史行情数据、财务…

如何批量替换文件名称的一部分?

如何批量替换文件名称的一部分&#xff1f;在工作和生活中&#xff0c;我们经常需要对一些文件和文件夹进行批量修改操作&#xff0c;其中最常见的是对文件名进行部分更改&#xff0c;例如批量替换文件名中的一部分分子。这些操作不仅可以提高工作效率&#xff0c;还能帮助我们…

elementUI 的上传组件<el-upload>,自定义上传按钮样式

方法一&#xff1a; 原理&#xff1a;调用<el-upload>组件的方法唤起选择文件事件 效果&#xff1a; 页面代码&#xff1a; 1、选择图片按钮 <div class"flex_row_spacebetween btn" click"chooseImg"><span class"el-icon-plus ic…

Boost开发指南-4.4assign

assign 许多情况下我们都需要为容器初始化或者赋值&#xff0c;填入大量的数据&#xff0c;比如初始错误代码和错误信息&#xff0c;或者是一些测试用的数据。在C98中标准容器仅提供了容纳这些数据的方法&#xff0c;但填充的步骤却是相当地麻烦&#xff0c;必须重复调用inser…

财报解读:继续押注Disney+,迪士尼距离盈利还有多远?

迪士尼最新一季的“答卷”&#xff0c;透露着不小的寒气。 近日&#xff0c;迪士尼披露了2023财年第三季度&#xff08;自然年2023年Q2&#xff09;业绩报告&#xff0c;营收223.3亿美元&#xff0c;同比仅增长4%&#xff0c;低于市场预期的225.1亿美元&#xff1b;归母净亏损…

Python第三方库 - Pandas库

文章目录 1. Pandas介绍2. Pandas基础2.1 引入2.2 数据结构2.2.1 Series2.3 DataFrame2.3.1 概念 3 Pandas CSV 文件3.1 语法3.2 遇到的问题 参考文档 1. Pandas介绍 概念: Pandas 是 Python 的核心数据分析支持库&#xff0c;提供了快速、灵活、明确的数据结构&#xff0c;旨…