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的指针,上面的关系恒成立,因为 * 和 & 是一对互逆运算符。

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

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

相关文章

【漫画算法】哈希表:古代皇帝的秘密魔法书

❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容,和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣! 推荐:数据分析螺丝钉的首页 格物致知 终身学习 期待您的关注 导航: LeetCode解锁100…

三个有意思的链表面试题的完成

上一篇博客我们已经完成了链表的所有内容,那么这一篇博客我们来看一下三个特别有意思的链表题目。 **第一个题目如下:**相信不少朋友看到这题目就已经晕了,那就简单说明下这个题目,题目就是创建一个链表,其中每个节点…

软件构造复习1

一、软件构造的多维度视图: 共有三个维度:1.按阶段划分:构造时/运行时视图,2.按动态性划分:时刻/阶段视图,3.按构造对象层次划分:代码/构件视图 具体可如图所示(图片来自PPT&#…

数据库-SQL性能分析

SQL执行频率 慢查询日志 慢查询日志记录了所有执行时间超过指定参数(long_query_time,单位:秒,默认10秒)的所有 SQL语句的日志。 MySQL的慢查询日志默认没有开启,我们可以查看一下系统变量 slow_query_l…

掩码生成蒸馏——知识蒸馏

摘要 https://arxiv.org/pdf/2205.01529 知识蒸馏已成功应用于各种任务。当前的蒸馏算法通常通过模仿教师的输出来提高学生的性能。本文表明,教师还可以通过指导学生的特征恢复来提高学生的表示能力。从这一观点出发,我们提出了掩码生成蒸馏&#xff08…

Redis常见基本类型(5)-List, Set

List 命令小结 命令及解释时间复杂度lpush/rpush key value[key value...](向右/左端插入元素)O(k), k是元素个数linsert key before | after pivot value(在某个坐标之前/右插入元素)O(n), n是pivot距离头尾的距离lrange start end(获取从start到end部分的元素)O(s n): s是…

与用户沟通获取需求的方法

1 访谈 访谈是最早开始使用的获取用户需求的技术,也是迄今为止仍然广泛使用的需求分析技术。 访谈有两种基本形式,分别是正式的和非正式的访谈。正式访谈时,系统分析员将提出一些事先准备好的具体问题,例如&#xff0…

Java使用apache.poi生成excel插入word中

加油,新时代打工人! 工作需求,上个文章我们生成好的word,这次将生成好的excel表格数据,插入word中。需要准备好excle数据,然后插入到word中。 最后个需要,就是把这些生成好的word文档转成pdf进行…

基础技术-ELF系列(1)-ELF文件基础

成就更好的自己 本篇是基础技术系列中ELF相关技术的首篇文章。 尽管网上有许多关于ELF相关内容的文章,但总体而言,要么是一些非常基础且重复性强的内容,要么直接深入探讨相对高深的主题,缺乏系统化分析和解释。 接下来&#xf…

C++技能进阶指南——多态语法剖析

前言:多态是面向对象的三大特性之一。顾名思义, 多态就是多种状态。 那么是什么的多种状态呢? 这里的可能有很多。比如我们去买火车票, 有普通票, 学生票; 又比如我们去旅游, 有儿童票&#xff…

10款免费黑科技软件,强烈推荐!

1.AI视频生成——巨日禄 网页版https://aitools.jurilu.com/ "巨日禄 "是一款功能强大的文本视频生成器,可以快速将文本内容转换成极具吸引力的视频。操作简单,用户只需输入文字,选择喜欢的样式和模板, “巨日禄”就会…

Nginx - 安全基线配置与操作指南

文章目录 概述中间件安全基线配置手册1. 概述1.1 目的1.2 适用范围 2. Nginx基线配置2.1 版本说明2.2 安装目录2.3 用户创建2.4 二进制文件权限2.5 关闭服务器标记2.6 设置 timeout2.7 设置 NGINX 缓冲区2.8 日志配置2.9 日志切割2.10 限制访问 IP2.11 限制仅允许域名访问2.12 …

【408真题】2009-16

“接”是针对题目进行必要的分析,比较简略; “化”是对题目中所涉及到的知识点进行详细解释; “发”是对此题型的解题套路总结,并结合历年真题或者典型例题进行运用。 涉及到的知识全部来源于王道各科教材(2025版&…

qemu+gdb调试linux内核

打开CONFIG_DEBUG_INFO,编译内核 通过图形菜单配置该宏,执行make menuconfig。 kernel hacking —> compile-time checks and compiler options —> compile the kernel with debug info 验证是否打开成功,grep -nr “CONFIG_DEBUG_INFO” .config。 打开成功,然后…

AcWing 3466. 清点代码库(STL:map,vector)

3466. 清点代码库 需要求有几种不同数列&#xff0c;每种有多少个&#xff0c;可以想到用map。它的键是一个数列&#xff0c;可以把它放在vector里。也就是map<vector<int>,int> 要满足要求的输出序列&#xff0c;就要想把它放在其他容器&#xff0c;或数组里&…

【Linux】信号之信号的保存和处理详解

&#x1f916;个人主页&#xff1a;晚风相伴-CSDN博客 &#x1f496;如果觉得内容对你有帮助的话&#xff0c;还请给博主一键三连&#xff08;点赞&#x1f49c;、收藏&#x1f9e1;、关注&#x1f49a;&#xff09;吧 &#x1f64f;如果内容有误或者有写的不好的地方的话&…

仿《Q极速体育》NBACBA体育直播吧足球直播综合体育直播源码

码名称&#xff1a;仿《Q极速体育》NBACBA体育直播吧足球直播综合体育直播源码 开发环境&#xff1a;帝国cms7.5 空间支持&#xff1a;phpmysql 仿《Q极速体育》NBACBA体育直播吧足球直播综合体育直播源码自动采集 - 我爱模板网源码名称&#xff1a;仿《Q极速体育》NBACBA体育直…

编程实战:自己编写HTTP服务器(系列3:处理框架)

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 系列入口&#xff1a;编程实战…

需求分析部分图形工具

描述复杂的事物时,图形远比文字叙述优越得多,它形象直观容易理解。前面已经介绍了用于建立功能模型的数据流图、用于建立数据模型的实体-联系图和用于建立行为模型的状态图,本节再简要地介绍在需求分析阶段可能用到的另外3种图形工具。 1 层次方框图 层次方框图用树形结…

LaTex 模板 - 东北师范大学申研申博推荐信

文章目录 NENU-Letter-Template项目地址示例特性项目结构如何使用main.texletterContent.tex 如何编译方式 1 &#xff1a;在线编译方式 2 &#xff1a;本地编译 参考 NENU-Letter-Template NENU’s recommendation letter template. 东北师范大学推荐信模板 项目地址 GitHu…