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

深入探索C语言中的结构体:定义、特性与应用

在这里插入图片描述

🔥 个人主页:大耳朵土土垚

在这里插入图片描述

目录

  • 结构体的介绍
  • 结构体定义
  • 结构成员的类型
  • 结构体变量的定义和初始化
  • 结构体成员的访问
  • 结构体传参

结构体的介绍

在C语言中,结构体是一种用户自定义的数据类型,它允许开发者将不同类型的变量组合在一起,形成一个新的数据类型。结构体可以包含多个成员变量,每个成员可以是不同的数据类型,例如整型、字符型、浮点型等。

结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。

结构体定义

结构体的定义使用关键字struct,后面跟随结构体的名称。

例如描述一个人:

struct Person {char name[20];int age;float height;
};

上述代码定义了一个名为Person的结构体,它包含三个成员变量:name、age和height。name是一个字符型数组,有20个元素;age是一个整型变量;height是一个浮点型变量。

结构成员的类型

结构成员的类型可以是以下几种:

  1. 基本数据类型:包括整型(int)、浮点型(float)、字符型(char)、布尔型(bool)等。
  2. 枚举类型:表示一组具有离散值的变量。
  3. 结构体类型:用来定义多个不同类型的变量,形成一个新的数据类型。结构体中可以包含基本数据类型、枚举类型、数组、指针等。
  4. 指针类型:表示变量的地址。
  5. 数组类型:表示一组相同类型的变量。
  6. 函数类型:表示函数的参数和返回值类型。

这些类型可以在结构体中作为成员类型,用于定义结构体的成员变量。

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

结构体变量定义有两种方式,一种在声明时候直接定义,一种在使用时再定义:

struct Point
{int x;int y;
}p1; //声明类型的同时定义变量p1//需要使用时
struct Point p2; //定义结构体变量p2

定义变量的同时初始化:

struct Point p3 = {1, 2};//定义结构体变量p3并赋值1和2

结构体嵌套初始化:

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

结构体成员的访问

  1. 通过点操作符(.)访问结构变量的成员:

点操作符接受两个操作数。

例如:

struct Stu        //类型声明
{char name[15];//名字int age;      //年龄
};struct Stu s = { "tutu",20};
printf("%s,%d", s.name, s.age);//使用.访问s中的成员
  1. 结构体指针访问指向变量的成员:
struct Stu        //类型声明
{char name[15];//名字int age;      //年龄
};struct Stu s = { "tutu",20};
struct Stu* ps = &s;
printf("%s,%d", ps->name, ps->age);//使用->访问ps指向的结构体成员

结构体传参

结构体传参可以通过以下两种方式:

  1. 传值传参

将结构体的副本传递给函数。

//结构体传值传参
void print1(struct Stu s)
{printf("%d\n", s.age);
}
struct Stu s = { "tutu",20};
print1(s);
  1. 传地址传参

将结构体的指针传递给函数,以便在函数内部修改结构体的内容。

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

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

这是因为函数传参的时候,参数是需要压栈的。如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。此外,传递结构体地址也便于我们修改结构体的内容。

http://www.lryc.cn/news/393471.html

相关文章:

  • EDEM-FLUENT耦合报错几大原因总结(持续更新)
  • ctfshow sql注入 web234--web241
  • Python的招聘数据分析与可视化管理系统-计算机毕业设计源码55218
  • 使用ChatGPT写学术论文的技巧和最佳实践指南
  • 多模态图像引导手术导航进展
  • 小程序 全局数据共享 getApp()
  • 第一次面试的经历(java开发实习生)
  • GitHub Copilot API
  • CobaltStrike的内网安全
  • Linux之进程控制(下)
  • Mac搭建anaconda环境并安装深度学习库
  • Linux:文件系统与日志分析
  • 迈阿密色主题学科 HTML5静态导航源码
  • Qt 基础组件速学 鼠标和键盘事件
  • 【踩坑】解决undetected-chromedriver报错cannot connect to-chrome
  • PyCharm 2024.1 版本更新亮点:智能编程,高效协作
  • 网络安全设备——蜜罐
  • Java与Selenium配置及常见报错解决方法
  • 最新扣子(Coze)实战案例:使用图像流做超分,模糊图片秒变清晰,完全免费教程
  • 数组相关内容
  • 【Python机器学习】模型评估与改进——打乱划分交叉验证
  • nodejs操作excel文件实例,读取sheets, 设置cell颜色
  • 用GPT做足球预测案例分享
  • 代码随想录| 编辑距离
  • MOJO编程语言的编译与执行:深入编译器与解释器的工作原理
  • nginx-限制客户端并发数
  • Vatee万腾平台:智能生活的新选择
  • 白嫖A100-interLM大模型部署试用活动,亲测有效-2.Git
  • LeetCode 60.排序排列(dfs暴力)
  • 矩阵分析与应用1-矩阵代数基础