【C语言】初阶结构体

news2025/2/2 11:54:35

在这里插入图片描述

👦个人主页:Weraphael
✍🏻作者简介:目前正在回炉重造C语言(2023暑假)
✈️专栏:【C语言航路】
🐋 希望大家多多支持,咱一起进步!😁
如果文章对你有帮助的话
欢迎 评论💬 点赞👍🏻 收藏 📂 加关注😍


目录

  • 一、结构体的声明
      • 1.1 结构的概念
      • 1.2 结构的定义
      • 1.3 结构成员的类型
      • 1.4 结构体变量的初始化
  • 二、结构体成员的访问
      • 2.1 变量 . 成员
      • 2.2 指针变量 -> 成员
      • 2.3 解引用访问
  • 三、结构体嵌套
  • 四、结构体传参
      • 4.1 传值调用
      • 4.2 传址调用
      • 4.3 传值调用和传值调用的区别

一、结构体的声明

1.1 结构的概念

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

1.2 结构的定义

结构体是用来描述复杂对象的

// tag - 是标签名,是可以根据需求改变的
struct tag //这一整串是类型
{
	//代码块里是结构体成员
	//可以是不同类型
   	member_list // 成员列表	
}list; 
//list - 结构体变量 
//注意:后面有分号

通过上面的模板来举个例子

假设要描述一名学生(名字、年龄、分数)

struct student //类型
{
    //结构体成员
	char name[20]; 
	int age;      
	double score;
 
}stu,stu2; 
// stu、stu2 - 也是结构体变量(全局变量)
 
int main()
{
	// 创建结构体变量(局部变量)
	// 类型 + 变量
	struct student stu1; 
	
	return 0;
}

1.3 结构成员的类型

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

1.4 结构体变量的初始化

struct student //类型
{
	char name[20]; 
	char sex[10];
	int age;
	double score;
 
}; 
 
int main()
{
    //结构体变量初始化
	struct student stu1 = { "小明","男",18,72.5 }; 
		
 	return 0;
}

在这里插入图片描述

二、结构体成员的访问

往期博客链接:点击传送

2.1 变量 . 成员

#include <stdio.h>
 
struct student //类型
{
	char name[20]; 
	int age;
	char sex[10];
	double score;
 
}; 
 
int main()
{
	//结构体变量初始化
	struct student stu1 = { "小明",18,"男",95.5 };
 
	//结构体访问
	printf("名字:%s\n年龄:%d\n性别:%s\n分数:%.1lf\n", stu1.name, stu1.age, stu1.sex, stu1.score);
 
	return 0;
}

【程序结果】

在这里插入图片描述

2.2 指针变量 -> 成员

 
#include <stdio.h>
 
struct student //类型
{
	char name[20]; 
	int age;
	char sex[10];
	double score;
 
}; 
 
int main()
{
	//结构体变量初始化
	struct student stu1 = { "小明",18,"男",95.5 };
 
	struct student* pa = &stu1;
	//结构体访问
	printf("名字:%s\n年龄:%d\n性别:%s\n分数:%.1lf\n", pa->name,pa->age,pa->sex,pa->score);
 
	return 0;
}

【程序结果】

在这里插入图片描述

2.3 解引用访问

#include <stdio.h>
 
struct student //类型
{
	char name[20]; 
	int age;
	char sex[10];
	double score;
 
}; 
 
int main()
{
	//结构体变量初始化
	struct student stu1 = { "小明",18,"男",95.5 };
 
	struct student* pa = &stu1;
	//结构体访问
 
	//*pa就是stu1
	printf("名字:%s\n年龄:%d\n性别:%s\n分数:%.1lf\n",(*pa).name,(*pa).age,(*pa).sex,(*pa).score);
 
	return 0;
}

【程序结果】

在这里插入图片描述

三、结构体嵌套

#include <stdio.h>
 
struct S
{
	int a;
	char c;
};
struct P
{
	double d;
	struct S s;
	double f;
};
 
int main()
{
	//100和's'是结构体s的
	struct P p = { 5.5,{100,'s'},33.3 };
	
	//只打印嵌套的结构体
	printf("%d %c\n", p.s.a, p.s.c);
	return 0;
}

【程序结果】

在这里插入图片描述

只要一步一步去访问,嵌套结构体同样也能访问。当然也可以用指针来访问,这里就不为大家演示了。

四、结构体传参

4.1 传值调用

注意:如果使用传值调用,形参的改变不影响实参。

#include <stdio.h>
struct student
{
	char name[20];
	int age;
	char sex[6];
	double score;
};
//不需要返回参数用void
void Print(struct student stu) //传结构体变量同样也能用结构体变量来接收
{
	printf("名字:%s\n年龄:%d\n性别:%s\n分数:%.1lf\n", stu.name, stu.age, stu.sex, stu.score);
}
int main()
{
	struct student stu1 = { "小明",18,"男",95.5 };
 
	//封装一个Print函数负责打印
	Print(stu1);
 
	return 0;
}

【程序结果】

在这里插入图片描述

4.2 传址调用

#include <stdio.h>
struct student
{
	char name[20];
	int age;
	char sex[6];
	double score;
};

//不需要返回参数用void
void Print(struct student* stu) //传地址需要用指针来接收
{
	printf("名字:%s\n年龄:%d\n性别:%s\n分数:%.1lf\n", (*stu).name, (*stu).age, (*stu).sex, (*stu).score);
	
	// 或者还可以使用->操作符来访问
	//printf("名字:%s\n年龄:%d\n性别:%s\n分数:%.1lf\n", stu->name, stu->age, stu->sex, stu->score);
}

int main()
{
	struct student stu1 = { "小明",18,"男",95.5 };
 
	//封装一个Print函数负责打印
	Print(&stu1);
 
	return 0;
}

【程序结果】

在这里插入图片描述

4.3 传值调用和传值调用的区别

那么大家认为传值调用好还是传址调用好呢?

答案是:传址调用

  • 因为传址调用时,形参也有自己独立的空间,把实参传递(拷贝)给形参就要消耗时间,这时传参的压力就比较大。如果是传址调用,因为一个地址的大小无非就是4/8个字节,形参用指针变量接收,压力也相对较小些。
  • 官方说法:函数传参的时候,参数是需要压栈的。 如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。

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

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

相关文章

使用Vue-Router实现页面跳转

安装 npm install vue-router4 --save项目中新建router.js文件 import { createRouter,createWebHashHistory } from "vue-router"; import Home from "/pages/Home.vue" import Banner from "/pages/Banner.vue" import Post from "/pag…

每日一题2023.7.17|根据层序遍历构建二叉树

根据层序遍历构建二叉树 解题思路&#xff1a; 如果所给层序遍历数组非空&#xff0c;先构建出root结点并加入辅助队列qu&#xff0c;之后当qu非空时&#xff0c;每次从qu中取出一个结点node&#xff0c;从头开始取数组中的元素作为node的左右孩子结点。并将非空的左右孩子结点…

5、深入LoadBalance

一、介绍 Spring Cloud LoadBalancer是Spring Cloud官方自己提供的客户端负载均衡器,抽象和实现&#xff0c;用来替代Ribbon&#xff08;已经停更&#xff09;&#xff0c; 二、Ribbon和Loadbalance 对比 组件组件提供的负载策略支持负载的客户端Ribbon随机 RandomRule轮询 …

css的应用详解

一、css的应用 1、在标签上的应用 <img style"height: 500px; width:500px" src"/static/1.jpg" /> <div style"color:red;">祖国</div>将样式直接写在标签上 2、在head标签中应用style标签 <!DOCTYPE html> <ht…

IntelliJ IDEA 下载安装教程(详细图文)

IntelliJ IDEA 下载安装教程&#xff08;详细图文&#xff09; 简介 IDEA 全称 IntelliJ IDEA&#xff0c;是java编程语言的集成开发环境。IntelliJ在业界被公认为最好的Java开发工具 下载安装 ► 官网地址&#xff1a;https://www.jetbrains.com/idea ► 快速下载 (官方安装…

【SQL】保姆级教程:MySQL配置全过程 编辑器DBeaver的安装配置

MySQL 是最流行的关系型数据库管理系统&#xff0c;在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System&#xff1a;关系数据库管理系统)应用软件之一。 文章目录 一、什么是数据库&#xff1f;二、RDBMS 术语三、MySQL 安装四、安装DBeaver五、dbea…

Python异步编程框架asyncio使用方法

asyncio概念 Python异步编程框架asyncio是Python 3.4及以上版本提供的一个标准库&#xff0c;用于编写异步IO并发代码。asyncio提供了一种基于协程的高效的方式来实现异步编程&#xff0c;它可以使我们在单线程中处理大量的并发IO操作&#xff0c;提高程序的并发能力和性能。 …

输入 jar cvf 后指令提示‘jar‘ 不是内部或外部命令,也不是可运行的程序

输入 jar cvf 后指令提示jar 不是内部或外部命令&#xff0c;也不是可运行的程序 一堆说jdk系统环境配置的文章&#xff0c;我都看哭了&#xff0c;还好有这位老兄拯救了我&#xff01;&#xff01;&#xff01;献上地址 https://www.cnblogs.com/wadezhou/p/16647474.html 我输…

AI图像生成无需API开发连接集简云数据表,实现快速增强图片分辨率

1 场景描述 当设计接到一个需求时&#xff0c;按照常规的工作安排&#xff0c;从对接需求到最后完成效果图最短时间都要在5天左右&#xff0c;如果遇到高要求的客户或领导&#xff0c;后期还需要在电脑上进一步调整细节&#xff0c;一张成片起码要花上数小时时间去完成。 而人工…

Python_paramiko_与linux交互

一、基础功能介绍 # codingutf-8 import paramiko from time import sleep# 建立通信 transport paramiko.Transport((192.168.0.7, 22)) print(transport) # <paramiko.Transport at 0x5745ed0 (unconnected)># 建立连接 transport.connect(usernameroot, password1…

redis穿透问题

1.概述 一个热点数据在高并发情况下过期时间到了&#xff0c;会导致大量流量查询redis为null&#xff0c;进而请求数据库进行更新数据&#xff0c;从流量上来说请求打到了数据库上&#xff0c;这种情况可能会造成mysql服务崩溃。 2. 解决方式之一&#xff08;加锁解决之本地锁&…

机器人制作开源方案 | Delta型腿机器狗实现原地动作

1. 功能说明 本文示例将实现R322样机Delta型腿机器狗原地摆臂、原地圆形摆动、原地蹲起、原地踏步的功能。 原地摆臂 原地圆形摆动 原地蹲起 原地踏步 2. 电子硬件 本实验中采用了以下硬件&#xff1a; 主控板 Basra主控板&#xff08;兼容Arduino Uno&#xff09; 扩展板 Bigf…

pyspark随记

1、spark读取文件 #1.spark 读取csv custid_df spark.read.format("csv").\option("sep", ",").\option("header", True).\option("encoding", "utf-8").\schema("custid STRING").\load("/tmp/…

SQL聚合函数和窗口函数

1.创建表格插入数据 DROP TABLE IF EXISTS 学生; create table 学生 (student_id INT PRIMARY KEY,gender TEXT,city TEXT,a_score FLOAT(2),b_score FLOAT(2),weight FLOAT(2) )engineinnodb;INSERT INTO 学生 VALUES (001,female,xiameng,90.6,110.87,50.34), (002,male,gua…

应用程序发生异常,6个方法轻松解决!

“用电脑的时候大家有没有遇到过应用程序异常的情况呀&#xff01;刚刚突然遇到这种情况不知道应该怎么解决&#xff0c;请大家帮帮我吧&#xff01;” 应用程序发生异常是在使用电脑时常见的问题之一。当应用程序无法正常运行或突然崩溃时&#xff0c;它会显示一个错误消息或弹…

港联证券-尾盘集合竞价拉升意味着什么意思?

在股票市场中&#xff0c;尾盘集合竞价是指每个交易日的最后几分钟&#xff0c;即下午14:57到3:00之间的交易。在这段时间内&#xff0c;所有股票的买卖都将以竞价的方式进行&#xff0c;最终价格以最高买价与最低卖价的平均值确定&#xff0c;成交量也将作为当日的收盘价和成交…

Qt音视频开发47-文字和图片水印(可存储到MP4中)

一、前言 近期花了两周时间闭门啃硬骨头&#xff0c;主要就解决三个问题&#xff08;音视频同步存储和推流、图片水印并将水印信息存储到文件或者推流、rtsp推流&#xff09;&#xff0c;这三个问题困扰了很多年&#xff0c;以至于找遍了网络和翻遍ffplay代码以及ffmpeg示例的…

【ceph】存储池pg个数如何设置

存储池pg个数如何设置 参考官方文档说明&#xff1a;https://old.ceph.com/pgcalc/参数说明TargePGs per OSD&#xff1a;每个OSD的pg数OSD#存储池包含osd个数%Data存储池写入数据占总OSD容量百分比Size存储池冗余数

Selenium 报表自动化测试——黑盒测试篇

目录 前言&#xff1a; 背景 需求 分析 解决思路 解决方案 测试流程图 实现的功能 用例代码 两种测试方式 随机测试 指定测试 总结 前言&#xff1a; Selenium是一个广泛使用的自动化测试工具&#xff0c;用于Web应用程序的测试。它提供了一组功能强大的API&…

【CCF推荐】1区TOP刊,稳定检索29年,仅17天见刊,7月26即将截稿~

本期小编给大家推荐的是一本1区计算机科学类SCI. 该期刊为CCF推荐TOP刊&#xff0c;是计算机科学领域高质量期刊&#xff0c;隶属于世界前三出版社旗下。 发表与数字孪生、物联网、服务计算、智能计算、大数据、云计算、网络服务等方向相关或结合研究的高质量原创文章。 在…