c语言结构体(初阶)

1. 结构体的声明

1.1 结构体的基础知识

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

1.2 结构的声明

struct tag
{
	member - list;
}variable-list;

例:描述一个人的信息:名字+电话+性别+身高

//声明的结构体类型struct peo
struct peo
{
	char name[20];//名字
	char tela[12];//电话
	char sex[5];//性别
	int high;//学号
}p1, p2;//分号不能丢

其中p1和p2是使用struct peo结构类型创建的两个变量,可以也就是p1和p2分别可以放一个人的信息。 但是因为p1和p2放在大括号的外面,所以p1和p2是两个全局的结构体变量。要想使其成为局部变量,我们可以使用下面这种方法创建结构体变量。

struct peo
{
	char name[20];//名字
	char tela[12];//电话
	char sex[5];//性别
	int high;//学号
};//分号不能丢​
int main()
{
	struct peo p1 = { 0 };//结构体变量的创建
	return 0;
}

1.3 结构体成员的类型

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

struct peo
{
	char name[20];//数组

};

struct st
{
	struct peo p;//其他结构体
	int num;//标量
	float* f = num;//指针
};

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

根据上面那个例题,我们可以如下初始化:

struct peo
{
	char name[20];//名字
	char tela[12];//电话
	char sex[5];//性别
	int high;//学号
};//分号不能丢​
int main()
{
	struct peo p1 = { "暴龙战士","88888888888","男",250};//结构体变量的创建

	return 0;
}

结构体成员包含结构体的结构体变量初始化:

我们需要再用一个{ }将结构体中包含的结构体初始化。

操作如下: 

struct peo
{
	char name[20];//名字
	char tela[12];//年龄
	char sex[5];//性别
	int high;//学号
};//分号不能丢​
struct st
{
	struct peo p;
	int num;
};
int main()
{
	struct st s = { {"暴龙战士","88888888888","男",250},66 };

	return 0;
}

初始化后我们可以按照以下的方法将其打印出来:

struct peo
{
	char name[20];//名字
	char tela[12];//年龄
	char sex[5];//性别
	int high;//学号
};//分号不能丢​
struct st
{
	struct peo p;
	int num;
};
int main()
{
	struct peo p1 = { "暴龙战士","88888888888","男",250};//结构体变量的创建
	struct st s = { {"暴龙战士","88888888888","男",250},66 };
	printf("%s %s %s %d \n",p1.name,p1.tela,p1.sex,p1.high );
	printf("%s %s %s %d %d\n", s.p.name, s.p.tela, s.p.sex, s.p.high, s.num);
	return 0;
}

也就是:结构体变量+.+成员变量。 

 

2.结构体成员的访问

如果是结构体指针访问指向对象的成员:就用  结构体指针 -> 成员变量  的形式打印

如果是结构体变量访问成员:就用  结构体变量 . 成员变量  的形式打印

具体操作如下:

struct st
{
	struct peo p;
	int num;
};
void print1(struct peo* sp)
{
	printf("%s %s %s %d \n", sp->name, sp->tela, sp->sex, sp->high);
    //结构体指针 -> 成员变量
}
void print2(struct peo p)
{
	printf("%s %s %s %d \n", p.name, p.tela, p.sex, p.high);
    //结构体变量 . 成员变量
}
int main()
{
	struct peo p1 = { "暴龙战士","88888888888","男",250};//结构体变量的创建
	struct st s = { {"暴龙战士","88888888888","男",250},66 };
	
	print1(&p1);
	print2(p1);
	return 0;
}

3.结构体传参

我们知道形参是实参的临时拷贝,如果使用结构体变量访问成员时形参就会将实参拷贝一份,这样就需要多开辟一块空间,就会结构体过大,参数压栈的系统开销比较大,从而导致性能的下降。

而使用结构体指针访问指向变量的成员时(如上述代码),我们只是将&p1(4个或8个字节)的地址传给sp而已。

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

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

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

相关文章

使用python netmiko模块批量配置Cisco、华为、H3C路由器交换机(支持 telnet 和 ssh 方式)

0. 当前环境 外网电脑Python版本:3.8.5(安装后不要删除安装包,以后卸载的时候用这个)外网电脑安装netmiko第三方库:cmd中输入pip install netmiko内网电脑环境:无法搭建python环境,需外网电脑完…

怎么实现Servlet的自动加载

在实际开发时,有时候会希望某些Servlet程序可以在Tomcat启动时随即启动。但在默认情况下,第一次访问servlet的时候,才创建servlet对象。 如果servlet构造函数里面的代码或者init方法里面的代码比较多,就会导致用户第一次访问serv…

Chrome插件精选 — 前端工具

Chrome实现同一功能的插件往往有多款产品,逐一去安装试用耗时又费力,在此为某一类型插件挑选出比较好用的一款或几款,尽量满足界面精致、功能齐全、设置选项丰富的使用要求,便于节省一个个去尝试的时间和精力。 1. FeHelper(前端助…

分布式下如何实现统一日志系统?

在业务系统开发中,日志的收集和分析很重要,特别是在进行故障分析时,日志记录得好,可以帮我们快速定位问题原因。在互联网分布式系统下,日志变得越来越分散,数据规模也越来越大,如何更好地收集和…

现代 NLP:详细概述,第 1 部分:transformer

阿比吉特罗伊 一、说明 近五年来,随着 BERT 和 GPT 等思想的引入,我们在自然语言处理领域取得了巨大的成就。在本文中,我们的目标是逐步深入研究改进的细节,并了解它们带来的演变。 二、关注就是你所需要的 2017 年,来…

环保行业的物联网升级:采用钡铼技术R10

随着环境保护意识的增强和可持续发展的迫切需求,物联网技术在环保行业中扮演着越来越重要的角色。为了满足环保监测和数据采集的需求,钡铼技术R10在物联网应用中具有独特的优势。本文将探讨R10的参数和功能,并阐述其在环保行业中的应用前景。…

主流级显卡的新选择,Sparkle(撼与科技)Intel Arc A750兽人体验分享

▼前言 对于玩家而言,英特尔独显的出现不仅打破了NVIDIA与AMD双雄天下的局面,而且旗下的Arc A系列显卡还拥有不俗的做工性能以及颇具优势的价格,无论是升级或者是装新机都非常合适。如果要在Arc A系列当中选一个性能不俗,能够满足…

anaconda prompt进入虚拟环境 打开spyder

目录 1.查看有多少虚拟环境 2.conda create 指令创建新的虚拟环境 3.进入虚拟环境 4.spyder进入虚拟环境 5.退出虚拟环境 6.删除虚拟环境 1.查看有多少虚拟环境 打开anaconda prompt,输入 conda env list 2.conda create 指令创建新的虚拟环境 conda cre…

LinkedList与链表

[本节目标] 1.ArrayList的缺陷 2.链表 3.链表相关oj题 4.LinkedList的模拟实现 5.LinkedList的使用 6.ArratList和LinkedList的区别 1. ArrayList的缺陷 上篇博客已经熟悉了ArrayList的使用,并且进行了简单模拟实现,ArrayList底层使用数组来储存元素: public class Ar…

K8S 中对 Windows 节点的利用

目录 漏洞概述 漏洞详情 ​编辑 漏洞验证 补丁分析 在集群中探索 参考资料 在许多组织中,所运行的很大一部分服务和应用是 Windows 应用。Windows 容器提供了一种封装进程和包依赖项的方式,从而简化了 DevOps 实践,令 Windows 应用程序…

深入探究MongoDB:从基础到实战,一个全面的指南

MongoDB:海量数据库的介绍 定义与命名由来: MongoDB源自词“humongous”,意味着“巨大无比”。因此,MongoDB可译为“海量数据库”。类型: MongoDB是一种非关系型(NoSQL)数据库。与传统的关系型数据库相比,它的显著特点是不使用SQL语句。数据结构更灵活,没有固定的数据类…

装饰模式(单一责任)

Decorator(装饰模式:单一责任模式) 链接:装饰模式实例代码 解析 目的 在某些情况下我们可能会“过度地使用继承来扩展对象的功能”,由于继承为类型引入的静态特质,使得这种扩展方式缺乏灵活性&#xff…

【C语言】指针详解(四)

目录 1.assert断言 2.指针的使用和传址调用 2.1strlen的模拟使用 2.2传值调用和传址调用 1.assert断言 assert.h头文件定义了宏 assert(),用于在运行时确保程序符合指定条件,如果不符合,就报错终止运行。这个宏常常被称为“断言”。 例如…

【Azure 架构师学习笔记】- Power Platform(1) - 简介

本文属于【Azure 架构师学习笔记】系列。 本文属于【Power Platform】系列。 Power Platform 它是一个SaaS平台,支持和延伸M365, Dynamics 365和Azure甚至其他第三方服务。主要提供低代码,自动化,数据驱动和定制化业务逻辑的服务…

NFC物联网一次性口令认证解决方案

物联网是由无线传感器网络、射频识别(RadioFrequency Identificalion,RFID)网络、互联网等构成的一种复合型网络,具有部分终端设备体积小、存储和计算处理能力弱的特点。顾名思义,物联网就是“物物相连的互联网”,也就是说,物联网…

Spark与Hadoop的关系和区别

在大数据领域,Spark和Hadoop是两个备受欢迎的分布式数据处理框架,它们在处理大规模数据时都具有重要作用。本文将深入探讨Spark与Hadoop之间的关系和区别,以帮助大家的功能和用途。 Spark和Hadoop简介 1 Hadoop Hadoop是一个由Apache基金会…

工具系列:TimeGPT_(1)获取token方式和初步使用

文章目录 介绍获取Token用法数据的重要要求使用DateTime索引推断频率。 介绍 Nixtla的TimeGPT是一种用于时间序列数据的生成式预训练预测模型。TimeGPT可以在没有训练的情况下,仅使用历史值作为输入,为新的时间序列生成准确的预测。TimeGPT可以用于各种…

亚马逊云科技 re:Invent 大会 - ElastiCache Serverless 模式来袭

大会介绍 亚马逊云科技的 re:Invent 大会是一年一度的,面向全球技术开发者科技盛会。几乎每次都会发布云科技、云计算等相关领域的产品重磅更新,不但将时下主流热门的技术不断整合,也未将来的发展标明了方向。 亚马逊云科技开发者社区为开发…

安卓系统和鸿蒙系统,哪个更适合老人使用

安卓系统和鸿蒙系统各有优势,但总体来说,鸿蒙系统可能更适合老人使用。以下是几个原因: 1.易用性: 鸿蒙系统针对老年人的使用习惯和需求进行了优化设计。它采用了更加直观、简洁的界面设计,降低复杂度并提升操作效率。…

Vue在页面上添加水印

第一步:在自己的项目里创建一个js文件;如图所示我在在watermark文件中创建了一个名为waterMark.js文件。 waterMark.js /** 水印添加方法 */ let setWatermark (str1, str2) > {let id 1.23452384164.123412415if (document.getElementById(id) …
最新文章