【C语言】结构体(详解)

C语言定义全局结构体,在工程文件中都可以调用 c语言 结构体 全局变量 阅读详情

1. 结构体基本知识

1.1 结构体声明

(假如描述一个商品)

struct item
{
	char name[30];
	int price;
	float dicount;
};

 
声明时可以同时定义结构体变量,这里定义的变量是全局变量
item1 是一个类型为struct item的结构体变量

struct item
{
	char name[30];
	int price;
	float dicount;
}item1;  // item1 是一个类型为struct item的结构体变量

 
结构体的类型重命名
结构体类型一般比较长,通常声明的同时进行类型重命名(typedef)
这里的struct item类型被重定义为item类型
注意:重新命名的类型名位置与定义全局结构体变量相同

typedef struct item
{
	char name[30];
	int price;
	float dicount;
}item;

 

匿名结构体(须在声明同时定义结构体变量)

struct 
{
	char name[30];
	int price;
	float dicount;
};

 
 

1.2 结构体的自引用

下面是单链表中的结构体自引用,通过结构体指针进行自引用

typedef struct Node
{
	int data;
	struct Node* next;
}Node;

 
 

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

根据结构体类型使用{ }定义
下面是结构体的嵌套定义

struct point
{
	int x;
	int y;
};

typedef struct Node
{
	int data;
	struct point p;
	struct Node* next;
}Node;

int main()
{
	Node n1 = { 2, {3, 4}, NULL };
	return 0;
}

2. ** 结构体内存对齐

2.1 结构体内存对齐规则

  • 第一个成员在相对结构体变量的 0 偏移量地址处
  • 其余各成员对齐到各自对其数的整数倍偏移量地址处
  • 某成员的对其数 = min{ 该成员字节数,默认对其数 },(默认对其数在VS环境下为8)
  • 结构体的总大小为各其成员最大对其数的整数倍
  • 嵌套了结构体时,嵌套的结构体对齐到其最大对其数的整数倍地址处,该结构体整体大小为所有对其数中(包含被嵌套结构体的对其数)最大对其数的整数倍

对齐的原因

  • 结构体对齐是拿空间换时间的做法,处理器访问未对齐内存时,需要作两次访问,而访问对齐内存只需一次访问
  • 数据结构,尤其是栈,应尽可能在自然边界上对齐

 

下面结构体的大小是16

struct test
  {
    short c;
    int b;
    char d;   
    int a;   
  };

分析
在这里插入图片描述
 

设计结构体时,为尽量节省空间,可将占空间小的成员尽量集中在一起
在这里插入图片描述
 

 
可以使用#pragma修改默认对其数
将默认对其数修改为2:

#pragma pack(2) //默认对其数修改为2

还原为默认对其数

#pragma pack()

 
宏offsetof可计算结构体中某成员相对于起始位置的偏移量
计算结构体类型struct test中成员d的偏移量

	printf("%d\n", (int)offsetof(struct test,d)); //8

在这里插入图片描述

C语言结构体变量——struct 当我们有大量且类型不同的数据需要描述的时候,如果针对每个数据都去定义一个变量或数组,是很消耗时间和内存的,那么如何跟方便的存储大量不同类型的数据呢,这就需要用到结构体变量了 结构体变量——struct是一种构造类型 构造类型:不是基本类型的数据结构也不是指针,它是由若干个相同或不同类型的数据构成的集合。 结构体概念:结构体是一种构造类型的数据结构,是一种或多种基本类型或构造类型的数据的集合 1.结构体类型的定义 结构体类型的定义方法:在使用结构体之前必须先有类型,然后用类型定义数据结构,这个类型相 阅读详情

相关推荐

ADAS系统架构与核心功能解析:从感知到执行的智能驾驶方案

高级驾驶员辅助系统(ADAS)是现代汽车智能化的核心技术,其本质是通过传感器融合、算法决策与车辆控制,构建一个“感知-决策-执行”的闭环系统。在技术原理上,ADAS依赖摄像头、毫米波雷达、激光雷达等多源传感器进行环境感知,并通过深度学习模型与融合算法(如卡尔曼滤波)构建精准的环境模型。其技术价值在于提供主动安全冗余与驾驶舒适性,核心应用场景包括自动紧急制动(AEB)、自适应巡航(ACC)及车道保持辅助(LKA)等。随着传感器成本下降与域控制器算力提升,ADAS正从高端配置向主流车型快速普及,并逐步向高阶导航

weixin_31062533的博客 418

结构体的声明

结构的基础知识: 结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。 结构的声明: struct tag { member-list; }variable-list; 例如描述一个学生 typedef struct Stu { char name[20];//名字 int age;//年龄 char sex[5];//性别 char id[20];//学号 }St...

question_mark的博客 3016

c语言串口编程详解

串口: 一种异步通信接口,通常用于低速数据传输。RS-232: 最常见的串口标准,定义了电气特性、连接器和信号线。UART: 通用异步收发传输器,是实现串口通信的硬件模块。通过以上内容,你应能够理解并实现C语言在Windows和Linux平台上的串口编程。希望这本手册能帮助你在实际项目中顺利进行串口通信开发。如果有任何疑问或需要进一步的帮助,请随时提问。

jkzyx123的博客 2224

全局结构体的使用方法

1. 对于全局结构体定义,首先在Globals.h头文件中构造结构体,用typedef方式,如: typedef struct Parameter { int OK; string No; }PARAM; 2.在Globals.cpp文件中: PARAM*parameter= NULL;    // 注意,在这里初始化,这是初始的指针类型 3.再回到Globals.h头文件...

Sirius_007的博客 1万+

ZYNQ烧写程序到flash

1.打开SDK创建FBSl项目 点击finish 2.创建BootImage 导入fsbl.elf、.bin、.elf三个文件,Create Image 生成BOOT.bin文件 3.将BOOT文件烧录到FLASH image File选择2中生成的BOOT.bin文件,FSBL File选择fsbl.elf文件,连接好ZYNQ的Jtag,点击Program,即可烧录。 4.烧录程序到FLASH失败 如果是第一次烧录,需更改创建的fsbl工程下的main函数,在如下代码处加入BootModeRegi

qq_40603614的博客 8338

卡诺图化简法

目录 1.学前需要了解知识点 2.卡诺图(karnaugh map) 3.逻辑函数的卡诺图化简法 4.总结 1.学前需要了解知识点 最小项的定义 最小项的表示方法 最小项的相邻性 最小项的定义:一个函数的某个乘积项包含了函数的全部变量,其中每个变量都以原变量或反变量的形式出现,且仅出现一次,则这个乘积项称为该函数的一个标准积项,通常称为最小项。 最小项的表示方法:通常用来表...

hahasusu的专栏 17万+

【C语言】自定义类型:结构体,枚举,联合

位段,结构体,共用体 文章目录 前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结 前言 我们终于来到了C语言最自由,最方便的类型----自定义类型 一、结构体 1.结构体的定义 在C语言中,结构体(struct)指的是一种数据结构,是C语言中复合数据类型(aggregate data type)的一类。结构体可以被声明为变量、指针或数组等,用以实现较复杂的数据结构。结构体同时也是一些元素的集.

m0_62179366的博客 1414

YOLO11涨点优化:知识蒸馏 | 引入FGD(Focal and Global Distillation)蒸馏,让轻量学生模型汲取大模型全局感知力

文章摘要 目标检测模型YOLO11在轻量化部署中存在"全局盲区"问题,即轻量模型感受野不足导致大尺度场景下性能下降。知识蒸馏技术FGD(Focal and Global Distillation)通过双分支机制有效解决这一问题:Focal Distillation分离前景背景特征,让学生模型聚焦关键区域;Global Distillation传递像素间关系信息,弥补全局感知缺陷。实验表明,FGD可使YOLO11轻量版mAP提升2.5%以上,且不增加推理耗时。本文详细解析了FGD原理,并给出YOLO11上的实

2601_95807009的博客 227

C语言结构体详解

的,和数组非常类似,但是,结构体的占用内存的总大小不一定等于全部成员变量占用内存大小之和。结构体是一个集合,是一种构造的数据类型,为了描述一个数据集自己定义出来的数据类型。结构体的成员(member)可以是任意类型的变量,也可以是结构体变量。因为子函数中用sizeof(pst),得到的不是结构体占用内存的字节数,而是结构体指针变量占用内存的字节数(8字节)。全部成员变量占用的内存是50+4+4+30+30=118,但是结构体占用的内存却是 120。和数组不一样,结构体变量名不是结构体变量的地址,

喜欢编程,将自己会的知识分享给大家 5092

【系统架构设计师】预测试卷一:综合知识(75道选择题)

软件架构风格是描述某一特定应用领域中系统组织方式的惯用模式,架构风格反映领域中众多系统所共有的结构和 (48),强调对架构(49)的重用。 (48) A. 语义特性 B. 功能需求 C. 质量属性 D. 业务规则 (49) A. 分析 B. 设计 C.实现

数据知道的博客 7766

Headless Browser 反检测:如何在自动化测试和爬虫中模拟真实用户环境和指纹,以规避检测?

这是最基本的操作,你需要将 Headless Browser 的 User-Agent 修改成一个真实的 User-Agent。我是你们的老朋友,代码界的段子手,今天咱们来聊聊一个让爬虫工程师和自动化测试工程师头疼,但又不得不面对的问题:Headless Browser 的反检测。Headless Browser 的反检测是一个持续对抗的过程,网站的反爬虫机制会不断升级,你需要不断地学习新的反检测技巧。以上只是一些基本的反检测手段,如果你的目标网站的反爬虫机制比较高级,那么你需要使用更高级的技巧。

weixin_41455464的博客 1657

C语言 | 结构体使用详解

本文更好的排版方式:【C语言笔记】结构体 我们都知道C语言中变量的类型决定了变量存储占用的空间。当我们要使用一个变量保存年龄时可以将其声明为int类型,当我们要使用一个变量保存某一科目的考试成绩时可以将其声明为float。 那么,当我们要做一个学生信息管理系统时,需要保存学生的姓名、学号、年龄等信息,该怎么做呢? 如当要保存三个学生的信息时, 方法一是: char *name1,*name2,...

嵌入式大杂烩 3万+

Office 365中的Assigned Access详细功能介绍

本文系统介绍了Office365中AssignedAccess功能的应用与管理。作为Windows系统的重要安全特性,AssignedAccess可将设备锁定为单应用模式,有效防范未授权访问。文章详细阐述了其核心功能、技术架构及配置方法,包括UWP/Win32应用支持、多用户配置、与AzureAD集成等。通过MicrosoftEndpointManager可实现批量部署和远程监控,适用于公共终端、零售设备等场景。该功能为企业数字化转型提供了安全、可控的终端管理方案,在保障数据安全的同时优化用户体验。

xueyunshengling的博客 227

c语言结构体详解

char c;int i;double d;讲解按顺序,先是s2.c1 ,该为字符,大小为1个字节,<8,所以对齐数为1又因为起始位置偏移量为0所以接着就是嵌套结构体了,开始进入结构体s3s3.d为double类型,大小为8个字节 == 8,所以对齐数为8又因为起始位置要为对齐数的整数倍所以最终为。

L070117的博客 2395

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

C语言详解:结构体

结构体 当然本次结构体仍不会讲的特别深入,在后面的自定义类型进阶会更加深入的讲到这部分内容。 结构(体)是一些值的集合,这些值被称为成员变量。结构的每个成员变量可以具有不同类型。 我们所学过的类型如:char,int,float,double等,都只能描述单一变量。但是结构体,顾名思义,是多个变量的集合,其中包含多个单一变量。所以C语言就发明了结构体用于用来描述复杂对象,如:书,人等具有多个特征的变量。 结构体类型的声明 结构体声明的语法结构 struct tag//结构体名称 { member

yourfriendyo的博客 2万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

C语言 结构体详解

C语言为我们提供了基本的数据类型,例如int、char、float等,但我们在实际生活中的对象都是复杂的,不能仅靠一种数据简单的描述。我们回顾一下数组,数组是一种自定义类型,比如,它的类型就为int [10],自定义类型使我们能够更加灵活的解决问题。而结构体同样是一种自定义类型。而结构体就实现了对一个对象进行多方面描述的功能。

qq_67140973的博客 1205

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【C语言】结构体详解

在计算机编程的世界中,数据的组织和存储是至关重要的。C语言作为一门强大而灵活的编程语言,提供了结构体(Structures)这一强大的工具,使得我们能够更加有效地组织和管理数据。结构体是C语言中一种用户自定义的数据类型,它允许我们将不同数据类型的元素组合在一起,形成一个更为复杂的数据结构。通过结构体,我们可以模拟现实世界中的实体,将相关的信息组织起来,使得代码更加清晰、可读性更强。在这篇博客中,我们将深入探讨C语言结构体的概念、用法以及它在程序设计中的实际应用。

m0_68002296的博客 2111

C语言详解(结构体)

结构体详解

小羊的博客 2798

【c语言】详解结构体

【c语言】详解结构体

一起学习,进大厂!!! 1322

C语言中的结构体(struct)详解

C语言中,结构体类型属于一种构造类型(其他的构造类型还有:数组类型,联合类型)。本文主要介绍关于结构体以下几部分。 1、概念 为什么要有结构体? 因为在实际问题中,一组数据往往有很多种不同的数据类型。例如,登记学生的信息,可能需要用到 char型的姓名,int型或 char型的学号,int型的年龄,char型的性别,float型的成绩。又例如,对于记录一本书,需要 char型的书名,char型的作者名,float型...

edward_zcl的博客 6万+

C语言结构体typedef struct详解

1、typedef关键字 C 语言提供了 typedef 关键字,您可以使用它来为类型取一个新的名字。下面的实例为单字节数字定义了一个术语 BYTE: typedef unsigned char BYTE; 在这个类型定义之后,标识符 BYTE 可作为类型 unsigned char 的缩写,例如: BYTE b1, b2; typedef相当于给unsigned char起...

羊脂球的博客 3万+
上一篇: 【C语言】内存函数
下一篇: 【C语言】位段(详解)
honortech
博客等级 码龄4年 369粉丝 105原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值