初阶C语言-结构体

一.结构体的声明

1.结构体类型的声明

1.1结构的基础知识

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

 1.2结构的声明

struct tag        //struct是结构体关键字,tag是结构体类型名称
{
    member - list;//成员变量的列表
}variable - list;//变量列表

         为什么要学习结构体?之前学过的char、int、short、double等都是一些内置类型,我们用这些类型是无法表示一个复杂对象——人:姓名+性别+年龄+电话+地址...所以C语言引入了结构体来近似的描述上述人(对象)的特征。比方说我们要创建一个学生结构体,首先要声明学生类型,因为C语言规定利用类型创建变量(为啥变量要有类型?因为你得告诉内存你需要多大空间,int类型的变量就占4字节,char就占1字节),再把值存变量里->int a = 10。所以要先有学生这个类型,而要有学生这个类型,我们就需要声明一个结构体来做学生类型,再把创建一个学生类型的变量->

struct Student
{
	//学生的相关属性
	char name[20];
	int age;
	char sex[5];
	char tele[12];
	//...
};

        使用这个类型来创建变量,其实就是告诉内存我要申请多大空间来存我的复杂对象。 

struct Student
{
	//学生的相关属性
	char name[20];
	int age;
	char sex[5];
	char tele[12];
	//...
}s3, s4;

int main()
{
	struct Student s1;
	struct Student s2;

	return 0;
}

        注意创建s1、s2变量的 方法别漏加struct(C语言中,struct Student才是类型名)。s1-s4都是结构体变量,两种创建方式都ok。差异是s3、s4是全局变量,s1和s2是局部变量。如果想偷懒省略掉可以使用typedef重定义类型名->

typedef struct Student
{
	//学生的相关属性
	char name[20];
	int age;
	char sex[5];
	char tele[12];
	//...
}Student;

Student s3, s4;

int main()
{
	Student s1;
	Student s2;

	return 0;
}

        注意:此时用struct Student来创建变量也可以,typedef之后,全局变量的形式就变成了上面那种,不能跟着写Student后面。

1.3结构体成员类型

        结构体成员可以是标量(基本数据类型——char,int,double等,不是复合数据类型——数组,结构体,联合体等)、数组、指针,甚至是其他结构体。

1.4结构体成员的定义与初始化

        定义(创建):

struct B
{
	char c;
	int i;
};

struct S
{
	char c;
	int num;
	int arr[20];
	double* pd;
	struct B sb;
	struct B* pb;
};

        初始化(定义的同时给值): 

#include <stdio.h>

struct B
{
	char c;
	int i;
};

struct S
{
	char c;
	int num;
	int arr[20];
	double* pd;
	struct B sb;
	struct B* pb;
};

int main()
{
	double d = 3.14;
	//按照顺序初始化
	struct S s3 = { 'q', 100, { 1, 2, 3}, &d, {'a', 99}, NULL };//记得包含头文件stdio.h
	//指定成员初始化
	struct S s4 = { .num = 1000, .arr = {1, 2, 3, 4, 5} };


	return 0;
}

         可以观察到s4里面未赋值到的成员是默认给0,s4要是一个成员都不初始化,那就是随机值,和数组的初始化是类似的。

 二.结构体成员的访问

        结构体变量的成员是通过点操作符.访问的,点操作符接受两个操作数,结构体变量.成员名还可以通过结构体指针的->,访问结构体指针->成员名。

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

struct S
{
	char name[20];
	int age;
};

void set_S(struct S t)
{
	t.age = 20;
	//t.name = "zhangsan";//这是错的,因为name是数组名,它是个地址常量
	strcpy(t.name, "zhangsan");//应该用字符串拷贝
}

int main()
{
	struct S s = { 0 };
	//写一个函数给S存放数据
	set_S(s);

	return 0;
}

         能够发现结构体s并没有被赋值成功,那问题出在哪呢?因为传参的时候,用的是传值传参,形参是实参的一份临时拷贝,二者并不是同一块内存空间,所以结构体变量t被赋值完,出了函数,生命周期结束,跟s没啥关系。所以我们应该传址传参->

        既然Set_S()函数的参数用的是指针接受,那就可以用结构体指针->成员名来访问成员,简单直观明了。

         如果要实现一个打印结构体成员的函数,传值或者传址都是行的,因为我只是打印,不对数据做修改->

void Print_S(struct S t)
{
	printf("%s %d", t.age, t.name);
}

 

三.结构体传参

        在结构体成员访问那块,其实已经讲了结构体传参,当我们在打印的时候,有两种传参方式都是可以的,但是传指针的效率高一点,因为传值,要先生成一份拷贝,当结构体很大的时候,压栈的时间花销是很大的;而传指针,大小是4/8,时间和空间效率都很高。 所以结构体传参也最好使用传址传参。

void Print_S(struct S* t)
{
	printf("%s %d", t->name, t->age);
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

minio集群部署

最近接触到minio&#xff0c; 将本地集群部署&#xff0c;分别在ubuntu、centos stream9上进行了搭建&#xff0c;目前看里面的小坑不小&#xff0c;记录以下教程&#xff0c;以备忘、以供他人借鉴。 #### 准备 1、因新版本的minio要求&#xff0c;集群部署必须使用挂载非 roo…

AAA Mysql与redis的主从复制原理

一 &#xff1a;Mysql主从复制 重要的两个日志文件&#xff1a;bin log 和 relay log bin log&#xff1a;二进制日志&#xff08;binnary log&#xff09;以事件形式记录了对MySQL数据库执行更改的所有操作。 relay log&#xff1a;用来保存从节点I/O线程接受的bin log日志…

Java中System类和RunTime类的Api

目录 System 类 1)out 2)err 3)in 4)currentTimeMillis() 5)nanoTime() 6)arraycopy(Object 要从里面复制东西的数组, int 要从里面复制东西数组的索引起始位置, Object 获得复制元素的数组, int 获得复制元素数组的起始索引, int 要复制东西的个数) 7)gc() 8)exit(int status)…

51单片机的无线通信智能车库门【proteus仿真+程序+报告+原理图+演示视频】

1、主要功能 该系统由AT89C51/STC89C52单片机LCD1602显示模块红外传感器光照传感器时钟模块步进电机蓝牙按键、LED、蜂鸣器等模块构成。适用于智能车库自动门、无线控制车库门等相似项目。 可实现功能: 1、LCD1602实时显示北京时间和自动/手动模式&#xff0c;以及验证是否成…

【Arduino IDE安装】Arduino IDE的简介和安装详情

目录 &#x1f31e;1. Arduino IDE概述 &#x1f31e;2. Arduino IDE安装详情 &#x1f30d;2.1 获取安装包 &#x1f30d;2.2 安装详情 &#x1f30d;2.3 配置中文 &#x1f30d;2.4 其他配置 &#x1f31e;1. Arduino IDE概述 Arduino IDE&#xff08;Integrated Deve…

使用 Go 和 Gin 框架构建简单的用户和物品管理 Web 服务

使用 Go 和 Gin 框架构建简单的用户和物品管理 Web 服务 在本项目中&#xff0c;我们使用 Go 语言和 Gin 框架构建了一个简单的 Web 服务&#xff0c;能够管理用户和物品的信息。该服务实现了两个主要接口&#xff1a;根据用户 ID 获取用户名称&#xff0c;以及根据物品 ID 获…

模拟实现消息队列(基于SpringBoot实现)

项目代码 提要&#xff1a;此处的消息队列是仿照RabbitMQ实现&#xff08;参数之类的&#xff09;&#xff0c;实现一些基本的操作&#xff1a;创建/销毁交互机&#xff08;exchangeDeclare&#xff0c;exchangeDelete&#xff09;&#xff0c;队列&#xff08;queueDeclare&a…

【电路笔记】-求和运算放大器

求和运算放大器 文章目录 求和运算放大器1、概述2、反相求和放大器3、同相求和放大器4、减法放大器5、应用5.1 音频混合器5.2 数模转换器 (DAC)6、总结1、概述 在我们之前有关运算放大器的大部分文章中,仅将一个输入应用于反相或非反相运算放大器的输入。在本文中,将讨论一种…

Python:条件分支 if 语句全讲解

Python&#xff1a;条件分支 if 语句全讲解 如果我拿出下面的代码&#xff0c;阁下该做何应对&#xff1f; if not reset_excuted and (terminated or truncated):... else:...---- 前言&#xff1a; 消化论文代码的时候看到这个东西直接大脑冻结&#xff0c;没想过会在这么…

5个免费ppt模板网站推荐!轻松搞定职场ppt制作!

每次过完小长假&#xff0c;可以明显地感觉到&#xff0c;2024这一年很快又要结束了&#xff0c;不知此刻的你有何感想呢&#xff1f;是满载而归&#xff0c;还是准备着手制作年终总结ppt或年度汇报ppt呢&#xff1f; 每当说到制作ppt&#xff0c;很多人的第一反应&#xff0c…

ElasticSearch备考 -- Multi match

一、题目 索引task有3个字段a、b、c&#xff0c;写一个查询去匹配这三个字段为mom&#xff0c;其中b的字段评分比a、c字段大一倍&#xff0c;将他们的分数相加作为最后的总分数 二、思考 通过题目要求对多个字段进行匹配查询&#xff0c;可以考虑multi match、bool query操作。…

vivo全新AI战略“蓝心智能”发布 原系统5亮相开发者大会

​10月10日&#xff0c;2024 vivo开发者大会在深圳国际会展中心举办&#xff0c;大会主题为“同心同行”。会上&#xff0c;vivo正式发布全新AI战略——“蓝心智能”&#xff0c;同时带来全面升级的自研蓝心大模型矩阵、原系统5&#xff08;OriginOS 5&#xff09;、蓝河操作系…

PHP中的HTTP请求:简化你的网络通信

在当今的网络应用开发中&#xff0c;PHP作为一种流行的服务器端脚本语言&#xff0c;经常需要与外部服务进行通信。这通常涉及到发送HTTP请求来获取或提交数据。幸运的是&#xff0c;PHP提供了多种方式来简化HTTP请求的过程&#xff0c;使得网络通信变得轻而易举。 PHP中的HTTP…

网络编程(17)——asio多线程模型IOThreadPool

十七、day17 之前我们介绍了IOServicePool的方式&#xff0c;一个IOServicePool开启n个线程和n个iocontext&#xff0c;每个线程内独立运行iocontext, 各个iocontext监听各自绑定的socket是否就绪&#xff0c;如果就绪就在各自线程里触发回调函数。为避免线程安全问题&#xf…

AVL树如何维持平衡

1.AVL树的特性 二叉搜索树虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序二叉搜索树将退化为单支树&#xff0c;查 找元素相当于在顺序表中搜索元素&#xff0c;效率低下。因此&#xff0c;两位俄罗斯的数学家G.M.Adelson-Velskii 和E.M.Landis在1962年 发明了一种…

音频文件重采样 - python 实现

在处理音频文件的时候&#xff0c;经常会将原音频进行统一的重采样处理&#xff0c;设置为相同的采样率&#xff0c;本示例&#xff0c;就是将44100采样率的音频&#xff0c;重采样为16000. 安装对应的python 库&#xff1a;librosa 和 soundfile. pip install soundfile pip i…

详细解读“霸王面”战术

“霸王面”战术是指在没有得到雇主面试通知的情况下&#xff0c;强行加入面试&#xff0c;以此争取工作机会的求职策略。以下将以3000字左右的篇幅&#xff0c;通过生动形象的例子详细解释这一战术。 一、背景介绍 在当今竞争激烈的就业市场中&#xff0c;求职者需要经历网申…

国外火出圈儿的PM御用AI编程工具Bolt.new效果干不过国产的CodeFlying?号称全新定义全栈开发流程?

不知道大家最近有没有发现国外的很多AI都在挤破脑袋想去提升大模型的编程能力&#xff0c; 离我们最近的是上周Openai 发布的全新模型GPT-4o-Canvas&#xff0c; 拥有超强的代码编写能力。 另外还有LlamaCoder、Cursor、Claude artifacts、Replit... 光是今年一年就推出了好…

【笔记学习篇】一篇文章搞定Mybatis-快速回顾

概述 5.1.1 Mybatis简介 Mybatis是一款优秀的持久层框架&#xff0c;它以sql为中心&#xff0c;支持定制化sql、存储过程以及高级映射。 使用Mybatis框架&#xff0c;可以无需手动编写基础的JDBC代码、无需手动设置参数和转换结果集到对象。 Mybatis可以使用简单的xml或注解来…

2024.10月7~10日 进一步完善《电信资费管理系统》

一、新增的模块&#xff1a; 在原项目基础上&#xff0c;新增加了以下功能&#xff1a; 1、增加AspectJ 框架的AOP 异常记录和事务管理模块。 2、增加SpringMVC的拦截器&#xff0c;实现登录 控制页面访问权限。 3、增加 Logback日志框架&#xff0c;记录日志。 4、增加动态验…