C语言结构体

news2024/11/25 0:32:47

C语言结构体

  • 前言
  • 1. 结构体的声明
    • 1.1 结构体的基础知识
    • 1.2 结构体声明
    • 1.3 结构体成员的类型
    • 1.4 结构体变量的定义和初始化
  • 2. 结构体成员的访问
    • 2.1 结构体变量访问成员
    • 2.2 结构体指针访问指针变量的成员
  • 3. 结构体传参
  • 4. 结尾

前言

C语言结构体是一种自定义数据类型,可以将不同数据类型的变量组合成一个整体,方便进行操作和处理,语言中具有重要的作用和意义,是C语言面向对象编程的基础。通过定义结构体,可以将相关的数据和函数封装在一起,形成一个独立的模块,便于代码的组织和管理。本篇文章将初步介绍C语言结构体相关知识!

1. 结构体的声明

1.1 结构体的基础知识

在C语言中结构体是一种用户自定义的数据类型,它由多个不同类型的成员组成,可以表示复杂的数据结构。
而结构是一些值的集合,这些值称为成员变量。结构的每一个成员可以是不同类型的变量。

1.2 结构体声明

struct tag	//tag可以根据实际情况更改
{
	member-list;	//成员列表,可一个或多个
}variable;	//变量列表,且为全局变量

例子:描述一个学生名字+年龄+性别

struct Student
{
	//成员变量,用来描述结构体对象的相关属性
	char name[20];
	int age;
	char sex[5];
}; //分号不可丢

1.3 结构体成员的类型

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

例子:

struct S
{
	int a;
	char arr[5];
	int* p;
};

struct B
{
	char ch[10];
	struct S m; //成员为结构体
	double d;
}

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

有了结构体类型,那么如何定义变量和初始化呢?其实很简单。

实例1:

struct Student //类型声明
{
	char name[15];
	int age;
};
//初始化:定义变量的同时赋初值
struct Student s = { "zhangsan",20 };//初始化

实例2:

struct point
{
	int x;
	int y;
}p1;		//定义变量的同时定义变量p1
struct point p2; //定义结构体变量p2
//初始化:定义变量的同时赋初值
struct point p3 = { 1,2 };

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

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

2. 结构体成员的访问

2.1 结构体变量访问成员

结构变量的成员是通过点操作符.访问的

例子:

struct Stu
{
	char name[20];
	int age;
};
struct Stu s;

我们可以看到s有成员name和age!那我们如何访问s的成员呢?

s.age=20;	//使用.访问age成员
//由于name是一个地址,而我们需要的是变量的内存空间
//所以访问name时不能简单照搬上面例子,而可以借助strcpy()函数来实现
strcpy(s.name,"张三");	

2.2 结构体指针访问指针变量的成员

在实际运用过程中,有时我们得到的不是一个结构体变量,而是一个结构体指针。虽然我们可以通过解引用来达到目的,但如果每次都这样未免过于冗杂。所以C语言提供了一种更好的方法!
在C语言中,指针变量的成员是通过操作符->来访问的

例子:

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;
}

3. 结构体传参

结构体和变量一样,传参时,可以传地址和结构体。那究竟那种方式更好了?
话不多说,直接上代码:

//结构体类型定义
struct S
{
	int date[1000];
	int num;
};

struct S s = { {1,2,3,4},1000 };//初始化

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

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

int main()
{	//封装两个打印函数
	print1(s);//传结构体
	print2(&s);//传地址
	return 0;
}

运行结果:
在这里插入图片描述
上面两种实现方式感觉差不多,但我们一般首选print2()函数实现方式!

原因:

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

通俗来说就是:

1. 减少内存开销:如果结构体较大,直接传值会复制整个结构体,造成内存开销。而传地址只是传递一个指针,开销会小得多。
2. 提高效率:如果结构体较大,传值的时间会更长,因为需要复制整个结构体。传地址时,只需要传递指针,速度会更快。

结论:

  • 因此,结构体传参时,传地址更好。但是需要注意,如果结构体较小,传值也可以。

4. 结尾

本篇文章到此就结束了,后续会发布新的文章,详细介绍C语言结构体后面相关细节,敬请期待。如果对你有帮助,记得三连哦!感谢您的支持!!

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

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

相关文章

vite-plugin-pwa配置详解

vite-plugin-pwa配置详解 前提:前端域名和后端服务域名相同时,用window.open新开页面下载或者导出文件,项目中导出和下载功能失效,原因是,域名相同走缓存 实现service worker离线缓存以前需要自己编写sw.js文件内容&…

基于SpringBoot+Vue的闲一品交易平台设计与实现

博主介绍: 大家好,我是一名在Java圈混迹十余年的程序员,精通Java编程语言,同时也熟练掌握微信小程序、Python和Android等技术,能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架下…

MT4电脑版交易软件使用技巧有哪些?

MT4交易软件作为连接券商平台与投资者之间的纽带,不仅是外汇金融机构的首选交易平台,也因其显著的优势成为了外汇投资者进行网上交易的重要平台。而MT4交易软件又分为电脑版和手机版,因为大多数投资者进行外汇投资时使用的是MT4电脑版软件&am…

Gradio的web界面演示与交互机器学习模型,接口自动刷新或连续刷新数据流《5》

通过在接口中设置liveTrue,可以使接口自动刷新。现在,一旦用户输入发生变化,界面就会重新计算。依然使用计算器的示例: 实时接口 import gradio as grdef calculator(num1, operation, num2):if operation "add":ret…

浏览器原理+跨域+解决方案

原网址:浏览器部分笔记_浏览器不同窗口cookie共享吗_JackieChan_的博客-CSDN博客 一、浏览器存储对象 1.cookie cookie是一种纯文本文件,大小只有4kb,每次发送非跨域html请求时都会自动携带。特性如下: cookie一旦创建&#xff…

华为开源自研AI框架昇思MindSpore应用案例:Pix2Pix实现图像转换

目录 一、环境准备1.进入ModelArts官网2.使用CodeLab体验Notebook实例 在实际应用场景中,由于训练数据集不足,所以很少有人会从头开始训练整个网络。普遍的做法是,在一个非常大的基础数据集上训练得到一个预训练模型,然后使用该模…

Java程序设计入门教程--主函数

情形 在Java中,主函数就是主方法,即main()方法。它是Java应用程序的入口方法,也就是说,程序在运行的时候,第一个执行的方法就是main()方法,这个方法和其他的方法有很大的不同,比如方法的名字必…

Python100天:01.初识python

❝ 本教程计划通过100天的时间,每天分享一篇关于python的知识点,与大家一起学习python这门编程语言。 ❞ Python 对初学者来说是一门很棒的语言: 容易学 有一个积极的支持社区 在网络开发、游戏、数据科学方面提供多种机会。 Python的应用领域…

PMP课堂模拟题目及解析(第13期)

121. 项目经理、团队成员以及若干干系人共同参与一次风险研讨会。已经根据风险管理计划生成并提供一份风险报告。若要为各个项目风险进行优先级排序,现在必须执行哪一项分析? A. 定量风险分析 B. 根本原因分析 C. 偏差分析 D. 定性风险分析 122. …

Yarn资源调度详解

第1章 Yarn资源调度器 思考: 1)如何管理集群资源? 2)如何给任务合理分配资源? Yarn是一个资源调度平台,负责为运算程序提供服务器运算资源,相当于一个分布式的操作系统平台,而MapRe…

什么是产品操作手册?企业该怎样制作产品操作手册页面?

产品操作手册是一种用于指导用户如何正确使用和维护产品的文档。它通常包括产品的基本信息、操作步骤、安全警告、故障排除、维护方法等内容。产品操作手册对于企业来说非常重要,它不仅可以提高用户的使用体验,还可以为企业节省售后服务成本。本文将介绍…

cython编译加密python源码

场景 python的解释特性是将py编译为独有的二进制编码pyc 文件,然后对pyc中的指令进行解释执行,但是 pyc的反编译却非常简单,可直接反编译为源码,当需要将产品发布到外部环境的时候,源码的保护尤为重要。 一、Cpython介…

Java程序设计入门教程--标识符和关键字

目录 标识符 标识符的约定 标识符 1. 定义 用来标识类名,变量名,方法名,类型名,数组名,文件名的有效序列称为标识符。简单地说,标识符就是一个名字。 2. 标识符命名规则 (1)大小…

Tuxera for Mac2023中文版读写硬盘U盘工具

在日常生活中,我们使用Mac时经常会遇到外部设备不能正常使用的情况,如:U盘、硬盘、软盘等等一系列存储设备,而这些设备的格式大多为NTFS,Mac系统对NTFS格式分区存在一定的兼容性问题,不能正常读写。 那么什…

算法|1.二分及其扩展

算法|1.二分及其扩展 1、有序数组中找到num 题意:给定有序数组,在有序数组中找到指定数字,找到返回true,找不到返回false. 解题思路: 数组有序查找指定元素使用二分法L指针初始值设为0,R指针初始值设为…

chatgpt赋能python:Python修改配置文件内容

Python 修改配置文件内容 介绍 配置文件是软件开发中经常使用的一种文件,用于存储程序的配置参数。在实际开发中,我们经常需要修改配置文件内容来满足我们的需求。Python 提供了很多方法来操作配置文件,让我们能够方便地修改配置文件。 本…

camunda如何部署到容器云Kubernetes

部署Camunda到Kubernetes需要以下步骤: 1、将Camunda打包成Docker镜像。 2、在Kubernetes中创建一个Deployment对象,用于定义Camunda应用程序的副本数量、容器镜像、环境变量、卷挂载等信息。例如,可以使用以下命令创建一个Deployment&…

镜像二叉树和求二叉树最大深度(java)

镜像二叉树和求二叉树最大深度 镜像二叉树。有些题目叫翻转二叉树。是同一个题。二叉树的最大深度 镜像二叉树。有些题目叫翻转二叉树。是同一个题。 题目描述:给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 示例&#xff1…

从Redisson的RedissonSemaphore引发的信号量实际含义的思考

Semaphore到底该如何使用 事情的起因是最近在看redisson的源码&#xff0c;刚好看到了RedissonSemaphore的acquire/release实现。 public RFuture<Void> releaseAsync(int permits) {if (permits < 0) {throw new IllegalArgumentException("Permits amount ca…

微信小程序 基础模板引入sass的两种方法

推荐使用第二种方法 一、VSCode扩展引入&#xff08;旧&#xff09; 1.vscode搜索扩展 Easy Sass安装 2.微信开发者工具导入vscode安装的所有扩展 3.修改sass扩展配置 打开扩展目录 找到刚导入的sass扩展 打开package.json文件 改成这样 保存 4.重新打开此项目 配置完事 5.使…