C语言【复合类型(自定义类型)】

一、结构体

结构体(struct)可以理解为用户自定义的特殊的复合的“数据类型”;

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

定义结构体变量的方式:

        先声明结构体类型再定义变量名

        在声明类型的同时定义变量

// 结构体类型的定义
struct stu {char name[50];int age;
};// 先定义类型,再定义变量(常用)
struct stu s1 = {"mike", 18};// 定义类型同时定义变量
struct stu2 {char name[50];int age;
}s2 = {"yoyo", 19};

2. 结构体成员的使用

如果是结构体变量,通过 . 操作成员

如果是结构体指针变量,通过 -> 操作成功

#include <stdio.h>
#include <string.h>// 结构体类型的定义
struct stu {char name[50];int age;
};int main() {// 定义结构体变量,同时初始化struct stu s = {"mike", 18};// 打印成员变量printf("%s, %d\n", s.name, (&s)->age);// 修改成功变量的内容strcpy(s.name, "yoyo");s.age = 19;// 打印成员变量printf("%s, %d\n", s.name, (&s)->age);return 0;
}

3. 结构体做函数参数

传值是指将参数的值拷贝一份传递给函数,函数内部对该参数的修改不会影响到原来的变量

#include <stdio.h>
#include <string.h>// 结构体类型的定义
struct stu {char name[50];int age;
};// 函数定义
void func(struct stu temp) {strcpy(temp.name, "yoyo");temp.age = 20;printf("函数内部:%s, %d\n", temp.name, temp.age);    // 函数内部:yoyo, 20
}int main() {// 定义结构体变量struct stu s = {"mike", 18};// 调用函数,值传递func(s);// 打印成员变量printf("函数外部:%s, %d\n", s.name, (&s)->age);    // 函数外部:mike, 18return 0;
}

4. 结构体地址传递

传址是指将参数的地址传递给函数,函数内部可以通过该地址来访问原变量,并对其进行修改。

#include <stdio.h>
#include <string.h>// 结构体类型的定义
struct stu {char name[50];int age;
};// 函数定义
void func(struct stu *p) {strcpy(p->name, "yoyo");p->age = 20;printf("函数内部:%s, %d\n", p->name, p->age);    // 函数内部:yoyo, 20
}int main() {// 定义结构体变量struct stu s = {"mike", 18};// 调用函数,地址传递func(&s);// 打印成员变量printf("函数外部:%s, %d\n", s.name, (&s)->age);    // 函数内部:yoyo, 20return 0;
}

二、共用体(联合体)

共用体union是一个能在同一个存储空间存储不同的数据类型;

共用头所占的内存长度等于其最长成员的长度,也有叫共用体;

同一内存段可以用来存放几种不同类型的成员,但每一瞬时只有一种起作用;

共用体变量中起作用的成员是最后一次存放的成员,在存入一个新的成员后原有的值会被覆盖;

共用体变量的地址和他的各成员地址一致;

#include <stdio.h>// 共用体(联合体)
union Test
{int a;char b;short c;
};int main()
{// 定义共用体变量union Test t;// 共用体大小是最大成员类型大小printf("union Test=%lu\n", sizeof(union Test));// 所有成员的首地址是一样的printf("a=%p b=%p c=%p t=%p\n", &(t.a), &(t.b), &(t.c), &t);// 1个成员赋值 会影响其他成员t.a = 0x44332211;printf("b=%x\n", t.b); // 11printf("c=%x\n", t.c); // 2211t.b = 0x00;printf("a=%x\n", t.a); // 44332200printf("c=%x\n", t.c); // 2200return 0;
};

三、枚举

将变量的值一一列举出来,变量的值只限于列举出来的值的范围内;

语法格式:

enum 枚举名{

        枚举值表;

};

在枚举值中应列出所有可用值,也称为枚举元素;

枚举值是常量,不能在程序中用赋值的语句对他赋值;

枚举的值是罗列的 所有的值都是在前面的基础上进行累加;

#include <stdio.h>//   ○ 在枚举值表中应列出所有可用值,也称为枚举元素
//   ○ 枚举值是常量,不能在程序中用赋值语句再对它赋值
//   ○ 枚举元素本身由系统定义了一个表示序号的数值从0开始顺序定义为0,1,2 …enum weekday{sun = 2, mon, tue, wed, thu, fri, sat
};enum bool {flase, true
};
int main() {// 枚举:将变量的值一一列举出来,变量的值只限于列举出来的值的范围内enum weekday a,b,c;// 枚举的值是罗列的 所有的值都是在前面的基础上进行累加a = sun;    // 2b = tue;    // 4c = sat;    // 8printf("a=%d b=%d c=%d\n",a,b,c);enum bool flag;flag = flase;if (flag == true) {printf("flag为真\n");}else{printf("flag为假\n");}return 0;
}
;

四、typedef

typedef是C语言的关键字,作用是为一种数据类型定义一个新名字

#include <stdio.h>// 类型起别名
typedef int INT;
typedef char BYTE;
typedef BYTE T_BYTE;
typedef unsigned char UBYTE;// struct type 起别名 
// TYPE为普通结构体类型,PTYPE为结构体指针类型
typedef struct type {UBYTE a;INT b;T_BYTE c;
} TYPE, * PTYPE;int main() {TYPE t;t.a = 254;t.b = 10;t.c = 'c';PTYPE p = &t;printf("%u, %d, %c\n", p->a, p->b, p->c);return 0;
}

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

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

相关文章

(十四)C++自制植物大战僵尸游戏windows平台视频播放实现

植物大战僵尸游戏开发教程专栏地址http://t.csdnimg.cn/8UFMs VLC库 在Cocos2d-x游戏开发框架中&#xff0c;没有实现windows平台视频播放的功能&#xff0c;需要自定义实现。在本项目中使用vlc库实现windows平台的视频播放功能。 vlc官网&#xff1a;网址 下载完成后&#x…

虚幻引擎源码版安装下载,点击GenerateProjectFiles.bat报错 error NU1101NuGet包问题解决参考方案

开发环境配置与源码安装使用 安装VS2022 按照官方文档安装需要的vs配置 虚幻引擎源代码下载 Epic里面下载的引擎与源代码引擎区别&#xff1a;Epic里面下载的引擎是已经编译过的它的源代码访问权限不完整&#xff0c;源代码版本提供比较完整引擎代码&#xff0c;并且可以修…

密码学 | 承诺:Pedersen Commitment

​ &#x1f951;原文&#xff1a;密码学承诺之 Pedersen Commitment 原理及应用 &#x1f951;写在前面&#xff1a;本文属搬运博客&#xff0c;自己留存学习。 ​ 1 承诺 密码学承诺方案是一个涉及双方的 二阶段 交互协议&#xff0c;双方分别为 承诺方 和 接收方。 第…

MDK stm32怎么生成bin文件

第一种 D:\Keil_v5\ARM\ac5.6\bin\fromelf.exe --bin -o ../../Output/atk_f407.bin ../../Output/atk_f407.axf 空格解析 D:\Keil_v5\ARM\ac5.6\bin\fromelf.exe一个空格--bin一个空格-o两个空格../../Output/atk_f407.bin ../../Output/atk_f407.axf &#xff08;注意后…

OWASP 发布十大开源软件风险清单(详解版)

近日&#xff0c;OWASP发文称&#xff0c;尽管软件供应链对开源软件 (OSS) 的依赖程度很高&#xff0c;但业内缺乏一致的用于了解和衡量OSS风险的方法。OSS 风险管理始于许可管理&#xff0c;之后延伸至CVE&#xff0c;但我们仍然缺乏与安全、法律和运营相关的全面的OSS风险管理…

ELK,ELFK日志收集分析系统

ELK简介 ELK是一套完整的日志集中处理解决方案&#xff0c;将ElasticSearch&#xff0c;Logstash和Kibana三个开源工具配合使用&#xff0c;实现用户对日志的查询、排序、统计需求。 ELK工作原理 在所有需要收集日志的服务器上部署Logstash&#xff0c;或者先将日志进行集中…

Python 判断一个数是否为素数

在Python中&#xff0c;判断一个数是否为素数可以通过多种方法实现。以下是一种简单的方法&#xff0c;它通过检查给定数是否有除了1和它本身之外的因数来确定它是否是素数&#xff1a; def is_prime(number):if number < 1:return False # 0和1不是素数if number < 3:…

c# .net 香橙派 Orangepi GPIO高低电平、上升沿触发\下降沿触发 监听回调方法

c# .net 香橙派GPIO高低电平、上升沿触发\下降沿触发 监听回调方法 通过gpio readall 查看 gpio编码 这里用orangepi zero3 ,gpio= 70为例 当gpio 70 输入高电平时,触发回调 c# .net 代码 方法1: Nuget 包 System.Device.Gpio ,微软官方库对香橙派支持越来越好了,用得…

SpringBoot多数据源(二)

SpringBoot多数据源AbstractRoutingDataSource&#xff08;二&#xff09; 1.多数据源配置2.多数据源调用流程3.实现 1.多数据源配置 spring-jdbc模块提供AbstractRoutingDataSource,其内部可以包含了多个DataSource&#xff0c; 然后在运行时来动态的访问数据库 2.多数据源…

vue 组件间通信方式

目录 1、props传递数据&#xff08;父 → 子&#xff09; 2、v-model&#xff08;双向绑定&#xff09; 3、.sync&#xff08;双向绑定&#xff09; 4、ref&#xff08;使用 ref 属性获取子组件的实例或 DOM 元素&#xff09; 5、$emit / v-on&#xff08;子组件向父组件发…

【Python系列】查看虚拟环境信息和包大小

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Java基于SpringBoot+Vue的蜗牛兼职网系统的研究与实现

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

CSS-布局

display display 属性是用于控制 布局 的最重要的 CSS 属性。display 属性规定是否/如何显示元素。 每个 HTML 元素都有一个默认的 display 值&#xff0c;具体取决于它的元素类型。大多数元素的默认 display 值为 block 或 inline。 block block&#xff1a;块级元素。块级…

越来越多服务区安装智慧公厕是什么原因

随着社会的不断发展&#xff0c;人们对生活质量的要求也越来越高。在这种背景下&#xff0c;越来越多的服务区开始安装智慧公厕&#xff0c;以满足人们在出行过程中的生活需求。那么&#xff0c;为什么越来越多的服务区选择安装智慧公厕呢&#xff1f;这其中究竟有哪些原因呢&a…

你信不信,五分钟快速学习Nginx

Nginx是什么&#xff1f; Nginx 是一个高性能的HTTP和反向代理服务器。它是由俄罗斯程序员Igor Sysoev开发的&#xff0c;最初是为了解决俄罗斯大型的门户网站的高流量问题。 说到反向代理&#xff0c;那么有没有正向代理呢&#xff1f; 正向代理&#xff1a;客户端非常明确要…

Swift Publisher 5 for mac:打造精美版面

Swift Publisher 5 for mac&#xff1a;打造精美版面 Swift Publisher 5是一款专业的版面设计和编辑工具&#xff0c;为Mac用户提供了强大的设计功能和直观的操作界面。以下是关于Swift Publisher 5的功能介绍&#xff1a; 直观易用的界面&#xff1a;用户能够轻松地使用Swift …

每日两题 / 189. 轮转数组 560. 和为 K 的子数组(LeetCode热题100)

189. 轮转数组 - 力扣&#xff08;LeetCode&#xff09; 向右轮转将使尾部k个元素顶到头部 将整个数组反转&#xff0c;再分别反转前k个元素和剩下的元素即可 class Solution { public:void rotate(vector<int>& nums, int k) {k % nums.size();reverse(nums.begi…

MOM系统框架及其主要功能

MOM系统&#xff08;Message-Oriented Middleware&#xff09;是一种基于消息传递的中间件系统&#xff0c;用于在分布式系统中实现异步通信和消息传递。MOM系统架构是指MOM系统的组成部分和它们之间的关系&#xff0c;下面我们将对MOM系统架构进行全面解析。 MOM系统的架构通…

C# 自动填充文字内容到指定图片

目录 需求 开发运行环境 方法设计 实现代码 AddText方法 图片转Base64 调用示例 小结 需求 在我们的一些发布系统项目应用中&#xff0c;会经常发布一些链接图标&#xff0c;该图标基本上以模板背景为主&#xff0c;并填充项目文字内容。解决方式一般会让美工进行制作…

Qt 拖放功能详解:理论与实践并举的深度指南

拖放&#xff08;Drag and Drop&#xff09;作为一种直观且高效的用户交互方式&#xff0c;在现代图形用户界面中扮演着重要角色。Qt 框架提供了完善的拖放支持&#xff0c;允许开发者在应用程序中轻松实现这一功能。本篇博文将详细阐述Qt拖放机制的工作原理&#xff0c;结合详…