首页 > 其他分享 >初学C语言day10--结构体

初学C语言day10--结构体

时间:2023-08-05 09:44:59浏览次数:34  
标签:变量 字节数 -- 成员 C语言 枚举 day10 类型 结构

结构:struct

结构是由程序员自己设计的一种数据类型,用于描述一种事物的各项数据,由若干项不同的基础数据类型组成
设计结构类型:
struct 结构类型名
{
类型名1 成员名1;
类型名2 成员名2;
...
}; // 分号不能少

定义结构变量:
struct 结构类型名 结构变量;
注意:在C语言中定义结构变量时,struct不能省略

初始化结构变量:
struct 结构类型名 结构变量 = {val1,val2,val3,...};
注意:初始化的顺序要与结构成员顺序一致

struct 结构类型名 结构变量 = {.成员名=val1,...};
注意:可以不按顺序初始化某些成员

struct 结构类型名 结构变量 = 同类型的结构变量;
注意:同类型结构变量可以直接整体初始化或赋值

访问成员:
结构变量.成员名;
由于结构变量的字节数一般都比较大,值传递效率较低,因此一般传递结构变量的地址,访问成员需要使用->,此时结构变量共享后有被修改的风险,一般通过const保护
结构指针->成员名;

typedef重定义结构类型

typedef struct 结构类型名 结构类型名;
之后就可以不使用struct关键字了

    typedef struct 结构类型名
    {
        类型名1 成员名1;
        类型名2 成员名2;
        ...
    }结构类型名;

注意:一般结构变量存储在堆内存较为合适

如何计算结构的总字节数:
结构成员的顺序会影响它的总字节数,在设计结构时合理地安排成员的顺序可能会大大地节约内存
内存对齐:
假设第一个成员从零地址开始,存储每个成员的地址编号必须能被它的类型字节数整除,如果不能整除,则会填充空白字节数直到能整除为止
内存补齐:
结构的总字节数,必须是它最大成员类型字节数的整数倍,如果不是,则会在末尾填充空白字节直到是为止
注意:数组成员按照元素类型字节数计算,不会根据数组总长度计算
注意:在32位Linux系统中计算结构体的对齐、补齐时,如果成员的字节数超过4字节则按照4字节数计算
在Windows系统、64位的Linux系统中,按照实际字节数计算对齐补齐

#pragma pack(n) 设置对齐、补齐的最大字节数
    n == 1\2\4
联合:union

联合的使用方式与结构基本一致,与结构的区别是联合中所有成员共用同一块内存,一个成员的值发生改变,其它所有成员的值都随之变化
union 类型名
{
类型名 成员1;
};
联合的目的是为了使用少量的内存对应多个标识符名,从而达到节约内存的目标,现在基本不再使用联合
联合的常考笔试题:
1、联合是天然对齐的,但是还要考虑补齐问题
union Data
{
char ch[5];
int num;
}; //总字节数8

2、通过联合可以判断系统是大端系统还是小端系统?
如何判断系统的大小端问题?
假设十六进制数0x01020304存储0xA~0xD连续的4字节内存中
大端系统:高位数据存储在低位地址
(0xA:01 0xB:02 0xC:03 0xD:04)
小端系统:高位数据存储高位地址
(0xA:04 0xB:03 0xC:02 0xD:01)

个人PC一般都是小端系统,而UNIX服务器和网络设备都是大端
本地数据称为本地字节序、网络设备数据称为网络字节序,因此数据的上传下载都需要转换字节序
JSON
sprintf
sscanf
100 "100" -> 100 200->"200" 200

枚举:enum

枚举就是把一种数据类型中可能出现的所有数值全部罗列出来,并且取一个有意义的名字,如果该枚举类型变量的值等于其它值则非法(愿望)
注意:在C语言编译器中,为了编译速度,不会专门去检查枚举变量的值,因此给枚举变量赋值没有限制
但是g++编译器严格限制,必须使用枚举常量赋值
枚举可以看做是值受限的int类型,在C语言中只是锦上添花

枚举常量与宏常量区别?
1、枚举常量需要占用内存,宏常量只是声明不需要占用内存
2、枚举常量具有类型,宏常量没有类型
3、枚举常量设计的目的是为了限制实际数据的使用,而宏定义是为了完成代码的替换和维护

标签:变量,字节数,--,成员,C语言,枚举,day10,类型,结构
From: https://www.cnblogs.com/bigflyny/p/17607517.html

相关文章

  • 俄乌战争中乌克兰的无人机、无人艇的临时操作手——善于玩电子游戏的高手——电玩高手
    看到一个新闻:凌晨450公斤炸弹命中,4000吨级俄军军舰剧烈爆炸:正在逐渐下沉 里面有这么一句话:乌克兰正在高中里搜索那些善于玩电子游戏的高手,让他们操作无人机和无人艇远程袭击俄罗斯目标。   -------------------------------------------------  一个设想:那就是......
  • VScode+X11支持连接服务器时支持open3d、openCV、matplotlib等可视化
    背景连接服务器以后,想用open3d可视化点云、matplotlib画点图,但是一直不能用,原因也很简单,就是没有配置GUI传输显示,那肯定是要配置X11相关的东西。过程服务器确保服务器下载了xterm、xorg-x11-xauth两个包,不确定可以用dpkg-l加正则表达式查看,应该基本上都有。之后检查/etc/ssh/......
  • VueRouter4 路由
    import{createRouter,createWebHistory}from'vue-router'//createRouter创建路由实例,===>newVueRouter()//1.history模式:createWebHistory()http://xxx/user//2.hash模式:createWebHashHistory()http://xxx/#/user//vite的配置import.meta.env.BASE_......
  • 暑假生活每周总结7
    本周进行了pyhon的学习基础了解frompysparkimportSparkConf,SparkContext#创建sparkconf对象conf=SparkConf().setMaster("local[*]").setAppName("test_app")#基于sparkconf对象创建sparkContext对象sc=SparkContext(conf=conf)##########基本结构 print(rdds.co......
  • 【转载】C/C++ 通过初始化列表和构造函数内赋值初始化成员变量的区别
    【结论】一、在有些情况下,必须使用初始化列表。特别是const和引用数据成员被初始化时。二、从效率方面来说,对于内置类型或复合类型,差异不会太大,但对于非内置数据类型,差异还是很明显的【具体参考】C/C++通过初始化列表和构造函数内赋值初始化成员变量的区别_Zju_Jemery的博客-......
  • 博客园皮肤geek
    博客园皮肤geek进入到博客后台-设置,将设置更改为下图页面定制css更改为如下,并禁用模板默认css#loading{bottom:0;left:0;position:fixed;right:0;top:0;z-index:9999;background-color:#f4f5f5;pointer-events:none;}.loader-inner{will-change:transform;width:40px;height:4......
  • 数据结构(二)
    目录4.树4.1树和二叉树4.2二叉树4.2.1顺序结构4.2.2链式结构4.2.3二叉树的遍历4.2.4二叉排序树4.2.5平衡二叉树4.5.6哈夫曼树4.3非二叉树和森林5.图5.1图的存储结构5.1.1数组表示法5.1.2邻接表5.2图的遍历5.2.1深度优先搜索(DFS:DepthFirstSearch)5.2.2广度优先搜索(BFS:Breadt......
  • Linux环境编程day03--文件管理
    分别使用标准IO和系统IO写入一百万个整数到文件,测试谁的时间更短?为什么?结论:在同等数据的写入下,使用标准IO要比直接使用系统IO更快原因:标准IO有缓冲区机制,在执行fwrite写文件时,数据不是直接调用系统IO写入磁盘,而是先存放在内存的缓冲区中,直到缓冲区满后才会调用一次系统IO全部写......
  • C#获取文件信息大全
    C#获取文件信息大全 转自:   https://mp.weixin.qq.com/s/HYUJAvXchZywWQRtr_Aj9g在.NET开发中,用C#获取文件信息是比较常见的操作。通过获取文件信息,我们可以了解文件的属性、大小、创建日期、修改日期等各种元数据信息。比如我们网站需要上传文件,可以用扩展名称控......
  • 凸优化8——线性规划、二次规划
    线性规划以及等价变换中科大-凸优化笔记(lec25)-等价变换_凸优化等价_及时行樂_的博客-CSDN博客二次规划QP 二次约束二次规划QCQP中科大-凸优化笔记(lec26)-二次规划_二次约束二次规划_及时行樂_的博客-CSDN博客引入了lasso回归和岭回归......