C结构详解

news2025/3/16 6:41:50

目录

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.coloradmin.cn/o/1695012.html

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

相关文章

指北者智能音乐学习机隆重亮相广州国际乐器展

2024年5月23-26日广州国际乐器展览会在广交会展馆B区隆重开幕,本届展会开设5大展厅、50000平方米的主题展区,吸引了700多家国内外参展商参展,打造集展示、商贸、文化交流、文娱于一体的广阔平台。深圳市指北科技有限公司也携旗下品牌指北者智…

plt多子图设置

import matplotlib.pyplot as plt# 使用 subplots 函数创建一个 2x3 的子图网格 fig, axs plt.subplots(nrows2, ncols3, figsize(16, 10)) # 调整 figsize 来改变图像大小# 遍历每个子图,并绘制一些内容(这里只是简单的示例) for ax in ax…

leetcode230 二叉搜索树中第K小的元素

题目 给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数)。 示例 输入:root [5,3,6,2,4,null,null,1], k 3 输出:3 解析 这道题应该是能做出…

计算机网络-BGP概述

一、概述 到目前为止我们已经学习了静态路由、OSPF、RIP、IS-IS了,前面我们也了解到按照区域或者范围来分,路由协议可以划分为:IGP内部网关协议、EGP外部网关协议,而我们前面学习的动态路由都属于IGP的范畴. IGP是用于单一自治系统…

AI大模型探索之路-训练篇25:ChatGLM3微调实战-基于LLaMA-Factory微调改造企业级知识库

系列篇章💥 AI大模型探索之路-训练篇1:大语言模型微调基础认知 AI大模型探索之路-训练篇2:大语言模型预训练基础认知 AI大模型探索之路-训练篇3:大语言模型全景解读 AI大模型探索之路-训练篇4:大语言模型训练数据集概…

NetSuite Intercompany COGS科目设置问题

在22年底的NetSuite多公司功能串讲中,有一个题目是Intercompany COGS科目的设置问题。近期在项目上这个问题被密集讨论。为了方便分享,所以在此摘出来独立成文。有兴趣的同学也可以翻看之前的视频。 NetSuite知识会 第8谈 多公司功能串讲 NetSuite Inter…

性能测试--线程的监控

1.线程的状态 1.1.线程的5种状态 java的线程总共有5种状态,如下: * 新建:new 【新建之后不启用都是new】* 运行:runnable* 等待:waitting(无限期等待),timed waitting(限期等待)* 阻塞:blocked* 结束&am…

1.存储部分

1.Flash Memory--闪速存储器(注:U盘,SD卡就是闪存)在EEPROM基础上发展而来的,断电后也能保存信息,且可进行多次 快速擦除重写。注意:由于闪存需要先擦除再写入,因此闪存写的速度要比…

[less配置]vue2引入less

1、终端输入:npm install less less-loader --save-dev 2、在package.json查看是否安装less依赖 3、调用

Add object from object library 从对象库中添加内置器件

Add object from object library 从对象库中添加内置器件 正文正文 对于 Lumerical,有些时候我们在使用中,可能需要从 Object library 中添加器件,通常我们的做法是手动添加。如下图所示,我们添加一个 Directional Coupler 到我们的工程文件中: 但是这种操作方式不够智能…

基于附带Attention机制的seq2seq模型架构实现英译法的案例

模型架构 先上图 我们这里选用GRU来实现该任务,因此上图的十个方框框都是GRU块,如第二张图,放第一张图主要是强调编码器的输出是作用在解码器每一次输入的观点,具体的详细流程图将在代码实现部分给出。 编码阶段 1. 准备工作…

Element Plus (面向外卖编程)

Element介绍 使用流程 案例 Element介绍 是饿了么团队基于 Vue 3 研发的面向设计师和开发者的组件库,访问官网能使用到各种组件样式 组件:组成网页的部件,例如 超链接、按钮、图片、表格、表单、分页条等等。官网:https://…

AI多模态「六边形战士」,原创音乐、1分钟百页PPT、抖音爆款……

2024年AI行业最大的看点是什么? 那一定是多模态AI应用。 大模型发展到今天这个阶段,文本处理已经是各家大模型的必备技能了,对音频、视觉等多模态的理解和应用才是下一个阶段大模型比拼的赛道。 3.5研究测试:hujiaoai.cn 4研究测…

测试驱动编程(3)进阶单元测试(下)

文章目录 测试驱动编程(3)进阶单元测试(下)示例实战接收同事的需求开始迭代需求故事迭代1故事迭代2故事迭代3故事迭代4故事迭代5故事迭代6 测试驱动编程(3)进阶单元测试(下) 示例实战 接收同事的需求 你的同事正在开发一个远程…

前端 防抖和节流

在前端开发中,防抖(Debounce)和节流(Throttle)是两种常用的性能优化技术,尤其在处理频繁触发的事件时显得尤为重要。无论是在用户输入、窗口调整大小,还是滚动事件中,这两种技术都可…

el-transfer和el-tree进行结合搞一个树形穿梭框

由于业务需求需要在穿梭框里使用树形结构,但是本身element里并不支持,于是参考了别的大佬发的文章作为思路及后续自己新增了一些处理功能。 目录 1.拷贝代码放到自己的项目目录中 2.改造el-transfer的源码 3.修改tree-transfer-panel.vue文件 4.修改…

C语言内存函数超详细讲解

个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 C语言内存函数超详细讲解 收录于专栏【C语言学习】 本专栏旨在分享学习C语言学习的一点学习笔记,欢迎大家在评论区交流讨论💌 目录 1. m…

IDEA打开项目报错

IDEA打开项目报错: Cannot read scheme C:\Users\xxxxxx\AppData\Roaming\JetBrains\IntelliJIdea2023.2\qaplug_profiles\Default.xmljava.lang.AbstractMethodError: Receiver class com.soldevelo.qaplug.scanner.AnalysisProfileManager$2 does not define or i…

浅谈后端boot框架整合第三方技术JUnit MyBatis Druid整体思想

整合第三方技术 不要单单学习指定技术与springboot整合的方式 学习目标的是整合整体的技术的思路 拿到任何一个第三方技术后我们在springboot中如何操作 这是真正我们应该学习的东西 以后能整合任意技术 整合JUnit JUnit 是一个流行的开源测试框架,用于 Java …

frp搭建内网流量转发

前提条件 有一台外网服务器 背景介绍 外网服务器linux内网客户端Windows 10下载frp软件安装包 下载地址:https://github.com/fatedier/frp/releases 服务端软件包下载 客户端软件包下载 服务端部署 解压软件包 tar xzvf frp_0.58.0_linux_amd64.tar.gz修复加压后文件夹名…