C结构详解

目录

1、结构模板

1. 建立结构声明

2. 定义结构变量

3. 访问结构成员

4. 初始化结构

声明结构数组

声明和初始化结构指针


1、结构模板

1. 建立结构声明

struct book{char title[MAXTITL];char author[MAXAUTL];float value;
};

该声明描述了一个又两个字符数组和一个 float 类型变量组成的结构,该声明并未创建实际的数据对象,只描述了该对象由什么组成。

关键字 struct 表明跟在其后的是一个结构,后面是一个可选标记(该例是book),我们在后面的程序中可以这样声明:

struct book library;

这把 library 声明为一个使用book结构布局的结构变量。

在结构声明中,用一对花括号括起来的是结构成员列表。每个成员都用自己的声明来描述。成员可以是任意一种C的数据类型,甚至可以是其他结构。   右花括号后面的分号是声明所必须的,表示结构布局定义结束。

2. 定义结构变量

创建结构变量:

struct book library;

编译器执行这行代码便创建了一个结构变量library。编译器使用book模板为该变量分配空间。

在结构变量的声明中,struct book 所起的作用相当于一般声明中的 int 或 float 。例如可以定义两个 struct book 类型的变量或者指向它的指针:

struct book doyle, panshin, *ptbook;

下面的声明:

struct book library;

是下面声明的简化:

struct book{char title[MAXTITL];char author[MAXAUTL];float value;
}library;

声明结构的过程和定义结构变量的过程可以组合成一个步骤,组合后的结构声明和结构变量定义不需要使用结构标记。然而,如果打算多次使用结构模板,就要使用带标记的形式。

struct {char title[MAXTITL];char author[MAXAUTL];float value;
}library;

3. 访问结构成员

使用结构成员运算符——点(.)访问结构中的成员。例如,library.value 即访问 library 的 value 部分。可以像使用任何 float 类型变量那样使用 library.value 。

假如创建了一个结构体指针,那么与上面的有所不同,用 ->符号访问结构体指针

struct book{char title[MAXTITL];char author[MAXAUTL];float value;int* ptr;
}library;

library->ptr即访问 library 的 ptr 部分 

4. 初始化结构

初始化结构有两种方法,一个是按顺序赋值,另一种是使用指定初始化器。

按顺序初始化,假如有下面的结构体:

struct book{char title[MAXTITL];char author[MAXAUTL];float value;}library;

那么给这个结构体初始化就像这样:

struct book library = {"shudannan","libai",10.0
};

还有一种是使用指定初始化器。C99和C11为结构提供了指定初始化器,结构的指定的初始化器使用点运算符和成员名。

struct book library = {.value = 10.0,.title = "shudaonan",.author = "libai"
};

另外,对特定成员的最后一次赋值才是它实际获得的值。例如:

struct book gift = {.value = 18.9,.author = "libai",10
};

赋给value的值是10,因为它在结构声明中紧跟在author成员之后。新值10取代了之前的18.9。

声明结构数组

声明结构数组和声明其他类型的数组类似。

struct book library[MAX];

以上代码把library声明为一个内含MAX个元素的数组。数组的每个元素都是一个book类型的结构。因此,library[0]是第1个book类型的结构变量,library[1]是第2个book类型的结构体变量。数组名library本身不是结构名,它是一个数组名,该数组中的每个元素都是struct book类型的结构变量。

 

标识结构数组的成员

library                    //一个book结构的数组
library[2]                //一个数组元素,该元素是book结构
library[2].title        //一个char数组(library[2]的title成员)
library[2].title[4]        //数组中library[2]元素的title成员的一个字符

声明和初始化结构指针

假设有如下结构

struct guy
{struct name handle;char favfood[10];float income;
};
struct guy * him;

首先是关键字struct,其次是结构标记guy,然后是一个星号,其后跟着指针名。这个语法和其他指针声明一样。

该声明并未创建一个新的结构,但是指针him可以指向任意现有的guy类型的结构。例如,如果barney是一个guy类型的结构变量,可以这样写:

him = &barney;

和数组不同,结构变量名并不是结构变量的地址,因此要在结构变量名前加上&运算符。

用指针访问结构成员

用指针访问结构成员,可以使用->运算符。him->income既是访问结构体中的value成员。

还有一种方法

barney.income == (*him).income == him->income // 假设him == &barney

如果him是指向guy类型结构barney的指针,上面的关系恒成立,因为 * 和 & 是一对互逆运算符。

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

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

相关文章

如何成为快手外卖代理?本地生活服务平台加盟条件解析

近年来,以抖音、快手和小红书等为代表的互联网大厂纷纷进军本地生活领域,改变美团和饿了么二分天下的这一局面的同时,也让本地生活成为了众多创业者眼中的“香饽饽”。其中,快手凭借着其庞大的用户群体,让快手团购外卖…

华语电影新力量用短片讲述:一部好电影,影响深远

近日,上汽大众杯澳涞坞全球青年电影短片大赛的公益短片《首映》在澳门澳涞坞首映发布,这一作品不仅展示了电影人的真实生活,更深刻地传达了对华语电影的敬意以及对青年电影人的殷切期望。 短片《首映》的制作团队堪称豪华。资深导演杨枫担任…

达梦数据库查看字符集、页大小

1.查看字符集select UNICODE (); 0 表示 GB18030,1 表示 UTF-8,2 表示 EUC-KR 2.查看页大小select SF_GET_PAGE_SIZE(); 也可以通过管理工具去查看

HackTheBox-Machines--Popcorn

文章目录 0x01 端口扫描0x02 测试思路2.1 80端口测试 0x03 /torrent 目录文件上传测试0x04 权限提升 Popcorn 测试过程 0x01 端口扫描 (base) gryphonwsdl ~ %nmap -sC -sV 10.129.138.22 Starting Nmap 7.94 ( https://nmap.org ) at 2024-05-28 14:22 CST Nmap scan report …

【一小时学会Charles抓包详细教程】初识Charles (1)

🚀 个人主页 极客小俊 ✍🏻 作者简介:程序猿、设计师、技术分享 🐋 希望大家多多支持, 我们一起学习和进步! 🏅 欢迎评论 ❤️点赞💬评论 📂收藏 📂加关注 Charles介绍 …

一键秒删TXT文本符号,释放工作效率新高度,轻松应对海量文本处理挑战!

在这个信息爆炸的时代,我们每天都会面对海量的文本信息。而在处理这些文本时,你是否曾经因为各种符号的干扰而头疼不已?现在,我们为你带来了一款高效批量处理工具,它能够一键删除TXT文本中的符号,让你的工作…

白酒:产地的水资源与酿酒工艺的关联性

云仓酒庄豪迈白酒的酿造过程中,水资源与酿酒工艺之间存在着密切的关联性。水是白酒酿造的重要原料之一,其质量和数量直接影响着酿酒工艺的实施和酒的品质。下面我们和云仓酒庄豪迈白酒来深入探讨一下,产地的水资源如何与酿酒工艺产生关联。 首…

windows部署ollama+maxkb+vscode插件continue打造本地AI

windows部署ollamamaxkbvscode插件continue打造本地AI 前言下载ollamadocker desktopvscode插件continue 安装安装ollama设置环境变量 安装docker desktop部署maxkb容器 安装vscode插件模型搜索和推荐 前言 我采用docker运行maxkb,本地运行ollama形式。可能是windo…

VPN的详细理解

VPN(Virtual Private Network,虚拟私人网络)是一种在公共网络上建立加密通道的技术,通过这种技术可以使远程用户访问公司内部网络资源时,实现安全的连接和数据传输。以下是对VPN的详细介绍: 选择代理浏览器…

如何防止锂电池反充

锂电池通常用于许多需要备用电源的设备应用中,例如实时时钟 (RTC) 和存储设备。当锂电池不是电路中的单一电源时,如果电池意外连接到可为电池充电的电源,则存在火灾或爆炸的风险。本应用笔记提供了在备用电源开关电路中连接锂电池所需的信息&…

LangChain打造一个AI客服

最近在学习LangChain,langchain的第一个入门应用就是和ChatGPT结合形成的一个AI客服,本期文章就带大家一起认识下 LangChain LangChain是现在用得最多的AI框架,langchain在帮助如基于文档数据的回答、聊天机器人和代理这类的应用程序 langch…

前端使用JavaScript实现一个LRU缓存

引言 LRU(Least Recently Used)算法是一种广泛应用于内存管理和缓存系统的策略,在微前端、状态管理以及性能优化等场景下,合理使用缓存机制能够有效提升应用性能。本文将介绍LRU算法的基本原理,并通过JavaScript实现案…

三、Ollama导入大模型(.Net8+SemanticKernel+Ollama)

Ollama导入大模型 一、导入Ollama大模型1、使用run命令2、使用Modelfile方式 二、导入自定义大模型(Ollama官网以外的大模型)三、使用OpenWebUI导入大模型 Ollama可以导入官方提供的大模型,也可以导入huggingface上的自定义大模型&#xff08…

详解布隆过滤器(含面试考点)

Bloom Filter 底层逻辑主要代码实现解析(以C为例)优缺点应用场景面试常问问题1:什么是布隆过滤器?问题2:布隆过滤器如何处理误报?问题3:如何设计布隆过滤器以最小化误报率?问题4&…

Jetpack架构组件_2. 数据绑定库

1.理论基础 数据绑定库是一个支持库,可让您使用声明性格式(而不是以程序化方式)将布局中的界面组件绑定到应用中的数据源。 布局通常使用调用界面框架方法的代码在 activity 中定义。例如,以下代码会调用 findViewById() 来查找 T…

zabbix自定义监控项

文章目录 1、配置conf文件(zabbix_agent2)linuxwindows 2、配置监控项3、配置触发器4、查看监控数据 示例自定义程序 hash_tool:输出指定目录的哈希值 调用指令: hash_tool --path [指定目录] 1、配置conf文件(zabbix_agent2) linux vim /etc/zabbix/z…

安卓获取内部存储信息

目录 前言获取存储容量 前言 原生系统设置里的存储容量到底是怎么计算的,跟踪源码,涉及到VolumeInfo、StorageManagerVolumeProvider、PrivateStorageInfo、StorageStatsManager......等等,java上层没有办法使用简单的api获取到吗&#xff1f…

深入解析Python中的两种导入方法:from...import与import

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、引言 二、from...import与import的基本区别 1. 导入方式的不同 2. 命名空间的差异 三…

Linux基础知识点总结!超详细

Linux 的学习对于一个IT工程师的重要性是不言而喻的,学好它是工程师必备修养之一。 Linux 基础 操作系统 操作系统Operating System简称OS,是软件的一部分,它是硬件基础上的第一层软件,是硬件和其它软件沟通的桥梁。 操作系统…

软件项目管理 - 作业集合

软件项目管理 - 作业集合 作业一 1、项目与日常运作的主要区别有哪些? 项目:为提供一项独特产品、服务或成果所做的临时性努力 运作:连续不断周而复始的活动 项目是一次性的,日常运作是重复进行的; 项目是以目标为导…