目录

结构体与共用体

1、结构体(struct)

        (1) 格式与用法

        (2) 结构体允许嵌套

 (3) 结构体成员初始化

        (4) 指针替换变量

        (5) 求结构体在内存空间所占字节

2、共用体(union)

        (1) 格式与概念

        (2) 应用

3、枚举类型(enum)

        (1) 格式与概念

         (2) 应用

4、typedef 类型


结构体与共用体

1、结构体(struct)

        (1) 格式与用法

                其中,标识符首字母必须大写(规定),最后一行的花括号后必须加分号“;”。用来定义新的数据类型,存放在声明部分中。

例如,创建一个 struct Student 数据类型:

struct Student
{int id;char name[20];float score;
};

        对新的数据类型定义变量的方法:

        a.  在末行花括号( } )与分号( ;)中间写入所需变量的个数及名称,此时变量为全局变量,存放在静态区;

        b. 在主函数中输入创建数据类型名,在其后输入变量名来定义变量,此时变量为局部变量,存放在栈区。例如:

                         

注意:

        在主函数 main 中,成员类型与 struct 中的成员类型一致。

        “ . ”为结构体成员运算符,是一级运算符,自左至右。

        例如:使用创建的 struct Student 数据类型定义变量 s ,定义类型成员内容,完成 “1,zhangsan,97.500000” 的输出效果

int main(void)
{struct Student s;s.id = 1;strcpy(s.name, "zahngsan");//【1】s.score = 97.5;printf("%d,%s,%f\n", s.id,s.name,s.score);return 0;
}

值得注意的是代码中的【1】位置,不能写为“ s.name = "zhangsan" ”,数组不能直接进行赋值。

        (2) 结构体允许嵌套

创建一个 struct Date 数据类型,结构体成员信息如下:

struct Date
{int year;int month;int day;
};

        使用 struct Student 与 struct Date 两种数据类型,完成" 1, zhangsan, 97.500000, 2002-3-12 "的输出效果

struct Student
{int id;char name[20];float score;struct Date birthday;
};int main(void)
{struct Student s;s.id = 1;strcpy(s.name, "zhangsan");s.score = 97.5;s.birthday.year = 2002;s.birthday.month = 3;s.birthday.day = 12;printf("%d, %s, %f,%d-%d-%d \n", s.id, srname, s.score, s.birthday.year, s.birthday.month, s.birthday.day);return 0;
}

 (3) 结构体成员初始化

        a. 全初始化:结构体初始化与结构体成员声明顺序一致,例如:

struct Student s ={1, "zhangsan", 97.5, {2002,3,12}};

        b. 部分初始化:只对部分成员信息做初始化,要修改的内容之间用逗号隔开

int main(void)
{struct Student s = {.id = 1,.score = 97.5,.birthday = {.year = 2002,.month = 3,}};printf("%d, %s, %f,%d-%d-%d \n", s.id, srname, s.score, s.birthday.year, s.birthday.month, s.birthday.day);return 0;
}

        (4) 指针替换变量

        通过指针可以对成员进行修改,效率更高,否则只是值传递

struct Student *p;
p = &s;
p->id += 10;
printf("%d %f\n", p->id, p->name);
//p->name 也可写为 (*p).id
//推荐 p->name

        (5) 求结构体在内存空间所占字节

        内存对齐:数据总线以数据类型的整数倍都数据(整除)。

        1、默认按照CPU位数对其(8)字节,最终大小必须是8的整数倍;

        2、在结构体成员中找到最长成员,最终按照该成员长度对其;

        3、按照结构体声明的顺序,依次将成员保存到结构体内存中,保存的偏移量 / sizeof(成员类型)。

例如:struct Dome 中的成员数据类型依次为 char(黄)、int(蓝)、short(橙),存储如下,又因为要被最长的整除(int 的4个字节),所有该类型的 sizeof 为12。

        (6) 应用

        对于 struct Student 中的成员信息

struct Student
{int id;char name[20];float score;
};

        eg1. 单项输出(printStudent),全部输出(printStudents)

void printStudent(struct Student *p)
{printf("%d, %s, %f\n", p->id, p->name, p->score);
}void printStudents(struct Student a[], int len)
{int i;for(i = 0;i < len;++i){printStudent(a + i);}
}

        eg2. 交换(swap),逆序(reverseStudents)

void swap(struct Student *a, struct Student *b)
{struct Student t;t = *a;*a = *b;*b = t;
}void revserseStudents(struct Student *a, int len)
{int i;for(i = 0;i < len / 2;++i){swap(a + i, a + len - i - 1);}
}

        eg3. 采用回调函数按名字长度(namecmp)、按成绩(scoreStudent)进行排序(sortStudent)


int namecmp(struct Student *p1, struct Student *p2)
{return strcmp(p1->name, p2->name);
}int scorecmp(struct Student *p1, struct Student *p2)
{if(p1->score > p2->score){return 1;}else if(p1->score == p2->score){return 0;}else{return -1;}
}void sortStudent(struct Student *a, int len, int (*pfn)(struct Student *, struct Student *))
{int i, j;for(i = 0;i < len - 1;++i){for(j = i + 1;j < len;++j){if(pfn(a + i, a + j) > 0){swap(a + i, a + j);}}}
}

        在主函数中的书写格式

int main(void)
{struct Student a[3] = {{1, "zhangsan", 97.5},{2, "lisi", 98},{3, "wanghu", 95}};int len = sizeof(a) / sizeof(*a);sortStudent(a, len, namecmp);printStudents(a, len);return 0;
}

* 结构体之间不能进行比较排序,但结构体成员之间可以进行比较排序。 

2、共用体(union)

        (1) 格式与概念

        其中,共用体名满足标识符要求,且首字母要大写,共用体成员的内存公用,该类型代码存放在声明中,

        创建 union Demo 数据类型,说明共用体成员的内存是共用的

union Demo
{int i;short s;char c;
};
int main(void)
{    union Demo d;d.i = 1000;d.s = 100;d.c = 10;printf("%u\n", sizeof(d));//输出结果为 4printf("%d\n", d.i);//输出结果为 10return 0;
}

         说明:内存共用并且会进行覆盖,i 为int型占4个字节,short占2个字节,char占1个字节,相当于int 先占了第一二三四个格子,short 占第一二个格子,char占第一个格子,覆盖到最后只剩 char 的一个格子,输出。 

        可以运用指针作为类型变量

int main(void)
{union Demo *p;p = &d;printf("%p %p %p\n", &d.i, &d.s, &d.c);	return 0;
}

        (2) 应用

        用来判断程序大小端存取

union Demo
{int i;char c;
};int main(void)
{union Demo d;d.i = 1;if(d.c == 1){puts("little");}else{puts("big");}return 0;
}

3、枚举类型(enum)

        (1) 格式与概念

        枚举类型(enum),用来自定义一个数据类型,并将常参放入其中。

        一般格式为:

       

        其中,标识符首字母依旧要大写,该类型的所有可能取值称为“枚举类型常量”,各取值之间用逗号“,”隔开,最后一个取值后面不需要加任何东西,花括号后的分号“;”不能省略。也可以对其输出变量(eg1. 中的 w )进行偏移(加法)。例如:

        创建 enum Week 类型,并将 Week 的所有可能放入其中,并对 w 的后一项进行输出(可以用 “%d” 进行输出),输出的值为变量 w 在枚举常量的位置,也可以对常量进行赋值,但不能重复(例如下图 Tue=7)

enum Week
{Sun, Mon, Tue = 7, Wes, Thu, Fri, Sat
};int main(void)
{enum Week w;w = Sun;printf("%d\n", w + 1);//输出为 Monreturn 0;
}

         (2) 应用

        该类型可以做 switch 函数后面的表达式,例如:(可自行补充其他 case 情况)

enum Week
{Sun, Mon, Tue, Wes, Thu, Fri, Sat
};int main(void)
{enum Week w;switch(w){case Sun:puts("lol");break;case Mon:case Tue:puts("study");break;default:break;}return 0;
}

4、typedef 类型

        将已有类型的类型名换个名字,在全局区起名,将变量名变为类型的类型名。在全局区起名。可以在数据类型(int、char、short等后加,也可以在struct、union、enum后加),类型名可以是一个标识符,也可以是一个数组,例如:

typedef int INT;
typedef int ARRAY[10];int main(void)
{int i;ARRAY a;printf("%lu\n", sizeof(a));return 0;
}

        也可以运用指针作为类型名,例如:

typedef struct Demo
{int i;short s;char c;
}Demo, *PDEMO;int main(void)
{Demo d;PDEMO p;p = &d;return 0;
}

【END】

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

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

相关文章

辐射源定位方法简述

文章目录 前言 一、按照信息建模分类 1.1.时间参数 1.1.1.到达时间&#xff08;TOA, Time of Arrival&#xff09;定位 1.1.2.到达时间差&#xff08;TDOA, Time Difference of Arrival&#xff09;定位 1.2.角度参数 1.2.1.到达角度&#xff08;AOA, Angle of Arrival&a…

CamX-设置SceneMode:CONTROL_SCENE_MODE_FACE_PRIORITY不生效问题解决

应用设置CONTROL_SCENE_MODE_FACE_PRIORITY设置不生效 问题&#xff1a;app 代码 CaptureRequest.Builder captureRequestBuilder mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);builder.set(CaptureRequest.CONTROL_SCENE_MODE, CameraMetadata.CONTRO…

MFC CChartCtrl编程

重点&#xff1a;创建CChartCtrl控件有2种方式1、直接创建CChartCtrl2、窗体上添加Custom Control&#xff08;切记一定不能是Static Text或者Picture Control&#xff0c;否则无法响应鼠标消息&#xff09;&#xff0c;然后根据ID关联CChartCtrl控件&#xff0c;初始化代码如下…

从0到1了解热部署

热部署&#xff08;Hot Deployment&#xff09;是软件开发中一种提高开发效率的技术&#xff0c;指的是在应用程序不停止运行的情况下&#xff0c;动态更新代码、配置或资源&#xff08;如页面、图片等&#xff09;&#xff0c;并让这些修改立即生效的过程。热部署主要用于开发…

[12月考试] E

[12月考试] E 题目描述 给定 nnn 个正整数 a1,a2,…,ana_1,a_2,\ldots,a_na1​,a2​,…,an​&#xff0c;小 E 可以进行若干次交换&#xff0c;每一次可以交换两个相邻的整数。 求小 E 至少要交换多少次&#xff0c;才可以让 a1a_1a1​ 是 nnn 个数里的最小值&#xff0c;ana_n…

kmp复习,需要多看多练

151. 反转字符串中的单词 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:string reverseWords(string s) {int n s.size();int i n - 1;string res;while(i > 0){while(i > 0 && s[i] ) i--;if(i < 0) break;int j i;while(i > …

Linux驱动开发笔记(五)——设备树(下)——OF函数

一、OF函数定义 第6.8讲 Linux设备树详解-绑定文档以及OF函数_哔哩哔哩_bilibili 《指南》43.9部分 设备树的功能就是描述设备信息&#xff0c;帮助驱动开发。那么驱动如何获取设备信息&#xff1f;获取这些信息的函数linux直接提供&#xff0c;都定义在linux-imx-rel_imx_4.…

8.2-使用字符串存储 UTF-8 编码文本

使用字符串存储 UTF-8 编码文本 我们在第4章讨论过字符串&#xff0c;但现在将更深入地探讨它们。新手 Rustacean 常常因为三个原因而卡在字符串上&#xff1a;Rust 倾向于暴露可能的错误、字符串比许多程序员想象的要复杂得多&#xff0c;以及 UTF-8。这些因素结合起来&#x…

以AI大模型重构教育新生态,打造“教-学-练-辅-评”一体化智能平台

在《中国教育现代化2035》与“教育新基建”政策驱动下&#xff0c;教育数字化转型已进入深水区。如何将AI技术深度融合于教学全流程&#xff0c;实现从“标准化”到“个性化”的跨越&#xff1f;文渊智阁推出的 AI教学大模型建设方案 &#xff0c;以“数据驱动AI潜能&#xff0…

AI在法律合同内容比对的应用实例

在商业世界的复杂交易中&#xff0c;合同是至关重要的法律保障。然而&#xff0c;随着业务的扩展&#xff0c;合同数量呈指数级增长&#xff0c;合同条款也日趋复杂。对于法务和商务团队来说&#xff0c;如何高效、准确地进行合同比对&#xff0c;成为一个亟待解决的难题。传统…

【Maven】Maven多模块拆分与依赖隔离 的终极深度解析,从 原子级配置 到 企业级架构设计,涵盖 8大核心维度

Maven多模块拆分与依赖隔离 的终极深度解析&#xff0c;从 原子级配置 到 企业级架构设计&#xff0c;涵盖 8大核心维度一、模块化工程结构设计&#xff08;黄金法则&#xff09;1. 分层架构模板2. 依赖流向控制矩阵二、依赖隔离的原子级配置1. 严格依赖管理&#xff08;父POM&…

大模型流式长链接场景下 k8s 优雅退出 JAVA

一、 java bootstrap.yml bootstrap.yml 启动文件增加timeout-per-shutdown-phase spring:lifecycle:timeout-per-shutdown-phase: 30m# 这个值是故意设置这么大的&#xff0c;因为现在推理服务支持深度思考# 为了保证用户侧的连接不被断开&#xff0c;因此我们需要设置超大 g…

uni-app用css编写族谱树家谱树

需求背景&#xff1a;公司接到一个项目&#xff0c;是需要做一个族谱微信小程序&#xff0c;需要有族谱树&#xff0c;且可以添加家族人员。 灵感来源&#xff1a;在插件市场中下载了作者 羊羊不想写代码 的插件tree-list族谱&#xff0c;树形列表&#xff0c;可缩放滑动 - DC…

思途JSP学习 0731

继0730&#xff0c;我们对项目做最后的升级一、删除功能1、新增复选框辅助删除条目的选择修改我们的list.jsp和list.js在列表的第一列增加一列选择框2、给复选框添加全选与行点击选择功能在行选择功能中&#xff0c;因为此时的选择框还未生成&#xff0c;所以我们将事件委托给他…

某讯视频风控参数逆向分析

文章目录1. 写在前面2. 接口分析3. 加密分析4. 扣JS代码【&#x1f3e0;作者主页】&#xff1a;吴秋霖 【&#x1f4bc;作者介绍】&#xff1a;擅长爬虫与JS加密逆向分析&#xff01;Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力…

[Broken IOS] 配置CLI | 终端用户界面TUI

链接&#xff1a;https://palera.in/ docs&#xff1a;palera1n palera1n 是一款专为 Jailbroken苹果设备 设计的强大工具&#xff0c;支持运行 iOS/iPadOS/tvOS 15.0 及更新系统 的 iPhone、iPad 和 Apple TV。 该工具通过 DFU 模式 下的底层 USB 通信引导设备&#xff0c;…

论文阅读|ArxiV 2024|Mamba进一步研究|VSSD

论文地址&#xff1a;pdf 代码地址&#xff1a;code 文章目录1.研究背景与动机2. 核心方法2.1 预备知识:mamba-ssm2.2 非因果状态空间对偶性2.3 视觉状态空间对偶性模型3. 实验结果3.1 图像分类任务3.2 目标检测任务3.3 语义分割任务3.4 消融实验4.局限性与结论4.1 局限性4.2 结…

Flutter中 Provider 的基础用法超详细讲解(二)之ChangeNotifierProvider

目录 前言 一、什么是ChangeNotifierProvider? 二、ChangeNotifier的简单用法 1.定义状态类 2.使用ChangeNotifierProvider提供状态 3.获取状态并监听更新 1.Consumer 2.通过API方式获取 1.Provider.of (context) 2.context.watch () 3.context.read () 4.各种获…

2025电商CPS分销与推客系统小程序开发:趋势、架构与实战解析

一、行业趋势&#xff1a;CPS模式与社交电商的深度融合1.1 电商行业新趋势根据《2025年电子商务行业发展趋势预测报告》&#xff0c;社交电商与内容营销已成为核心增长点。消费者行为呈现三大特征&#xff1a;消费习惯转变&#xff1a;线上购物占比超70%&#xff0c;Z世代用户更…

Conda环境下配置的基本命令

功能命令创建环境conda create -n myenv python3.11激活环境conda activate myenv删除环境conda env remove -n myenv复制环境conda create -n newenv --clone myenv列出所有环境conda env list列出环境所有包conda list彻底清除某个 Conda 环境中的所有已安装包&#xff08;但…