C进阶:自定义类型:结构体、枚举、联合体

Rust嵌入式开发环境搭建指南(基于Stm32+Vscode) 本文档旨在指导开发者如何搭建基于Rust语言的STM32嵌入式开发环境。相比传统的C/C++开发方式,Rust提供了更强的内存安全保障和现代化的语言特性,非常适合嵌入式系统开发。本指南将详细介绍从环境搭建到项目配置的全过程,特别关注VSCode作为IDE的配置以及STLink和DAPLink调试器的使用。 阅读详情

自定义类型:结构体、枚举、联合体

结构体

结构的定义:

结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。

我们再回想一下数组是怎么定义的:一些相同类型值的集合。而结构体类型是可以放不同类型的变量的。

结构体的声明:

最简单的声明是这样的:

//例如描述一个学生
struct Stu 
{
	char name[20];
	int age;
	char sex[10];
}s1,s2;//注意最后分号不能省略

但是你可能还见过这样的形式:

typedef struct Stu
{
	char name[20];
	int age;
	char sex[10];
}Stu;

其实这两种写法都正确,区别在于:

image-20230113152021815

并且s1和s2是两个全局变量。

特殊的声明(匿名)

还有一种匿名结构体类型,我们只用一次以后就不需要的话,可以不给它命名,

//匿名结构体类型
struct
{
int a;
char b;
float c;
}x;
struct
{
int a;
char b;
float c;
}a[20], *p;  

但是需要注意的是如果这时候你写这样一句代码:

p=&x

这样绝对是错误的,因为这是两个完全不同的结构体类型,即使它们成员一模一样,定义一个结构体就是一个单独的类型。

匿名结构体使用还是比较少的,并不常见,了解即可。

结构体的自引用:

结构体的自引用也是一个需要注意的点,先来看错误的写法:

//代码1
struct Node
{
	int data;
	struct Node next;
};
//可行否?
//如果可以,那sizeof(struct Node)是多少?

这是我们最直观的想法,但其实这样是错误的,为什么呢?我们可以来分析一下:

image-20230113154859432

所以我们正确的结构体自引用方式是通过指针:

//代码2
struct Node
{
int data;
struct Node* next;
};  

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

结构体变量的怎么进行定义和初始化呢?

#include <stdio.h>
struct Point
{
	int x;
	int y;
}s1 = {0,0};//第一种
struct Point s2 = { 0,0 };//第二种
int main()
{
	struct Point s3 = { 1,2 };//第三种
	return 0;
}

以上是最简单的方式,如果结构体比较复杂:

cstruct Point
{
	int x;
	int y;
};
struct S
{
	int num;
	char a;
	struct Point b;
	float c;
};
int main()
{
	struct S s4 = { 1,'w',{3,4},3.14f };//按顺序初始化
	struct S s5 = { .a = 'w',.b.x = 5,.b.y = 6,.c = 3.14f,.num = 7 };//乱序
	return 0;
}

结构体内存对齐

结构体内存对齐可以说是结构体这块的重点了,也是考察最多的地方,一般用来计算结构体大小,我们先来看一个例子:

//练习1
struct S1
{
	char c1;
	int i;
	char c2;
};
//练习2
struct S2
{
	char c1;
	char c2;
	int i;
};
int main()
{
	printf("%d\n", (int)sizeof(struct S1));
	printf("%d\n", (int)sizeof(struct S2));
	return 0;
}

输出结果:image-20230113163311018

看起来结构体大小似乎并不像我们想象中的那样简单的每个成员大小之和,然后我们就来看一下到底是什么原因呢?

我们先来看一下结构体内存对齐的规则:

image-20230113164352954

这四句话是一定要加上自己的理解去记忆,我们下面来举例解释,看上述引例:

image-20230113170351767

上面就是我们画图来解释,最直观的就是画图来理解,再次阅读上面结构体内存对齐规则,理解着来进行记忆。

可以看出为了内存对齐我们还是浪费了不少空间的,那么为什么要有内存对齐呢?

为什么要有内存对齐

其实无非就两种原因:

  • 平台原因(移植原因):
    不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。
  • 性能原因:
    数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。

总的来说:内存对齐就是一种拿空间换时间的做法

那在设计结构体的时候,我们既要满足对齐,又要节省空间, 我们最好让占用空间小的成员尽量在一起。

修改默认对齐数

有时候默认对齐数不满足我们的要求的时候我们就需要修改默认对齐数,怎么修改呢,\#pragma 这个预处理指令 就要派上用场了,

修改默认对齐数的方式是这样的:

#pragma pack(num)

num为默认对齐数。

我们也可以验证一下,例如:

#pragma pack(1)
struct S1
{
	char c1;
	int i;
	char c2;
};

int main()
{
	printf("%d\n", (int)sizeof(struct S1));
	return 0;
}c

看结果其实是成功了:image-20230113171838558

结构体传参

其实函数传参无非就传值调用和传址调用,这两种我们怎么选择呢?

//结构体传参
void print1(struct S s)
{
printf("%d\n", s.num);
}
//结构体地址传参
void print2(struct S* ps)
{
printf("%d\n", ps->num);
}
int main()
{
print1(s); //传结构体
print2(&s); //传地址
return 0;
}  

答案是:首选传址调用

原因:函数传参是需要压栈的,那么就必然会有时间和空间上的开销,如果传递结构体过大,就会造成系统性能下降。

位段

位段的定义

位段的声明和结构是类似的,有两个不同:

1.位段的成员必须是 int、unsigned int 或signed int

2.位段的成员后跟一个冒号和数字(数字代表指定占用的空间大小)

struct A
{
	int a : 2;
	int b : 5;
	int c : 10;
	int d : 30;
};
int main()
{
	printf("%d\n", (int)sizeof(struct A));
	return 0;
}

输出:image-20230113175115575

如果没有使用位段结构的话,结构体大小应该是16字节,但是使用位段结构变成了8字节。

因为我们指定了结构体成员占用多少位,有些数据用4或5位就能有效存储数据,没有必要直接占用1个整型空间。这时候使用位段就能够起到节省空间的作用。

位段的内存分配

  • 位段的成员可以是 int unsigned int signed int 或者是 char (属于整形家族)类型
  • 位段的空间上是按照需要以4个字节( int )或者1个字节( char )的方式来开辟的。
  • 位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使用位段。

一个例子:

位段的内存分配实际上C语言没有标准规定,但是我们可以用一个例子来看一下我们当前vs环境下的内存是怎样分配的。

//一个例子
struct S
{
char a:3;
char b:4;
char c:5;
char d:4;
};
struct S s = {0};
s.a = 10;
s.b = 12;
s.c = 3;
s.d = 4;
//空间是如何开辟的?  

image-20230113182257379

这样吗就理解了位段结构的内存分配。

位段的跨平台问题

  • int 位段被当成有符号数还是无符号数是不确定的。
  • 位段中最大位的数目不能确定。(16位机器最大16,32位机器最大32,写成27,在16位机器会出问题。
  • 位段中的成员在内存中从左向右分配,还是从右向左分配标准尚未定义。
  • 当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是舍弃剩余的位还是利用,这是不确定的。

总结:跟结构相比,位段可以达到同样的效果,但是可以很好的节省空间,但是有跨平台的问题存在。

位段的应用

image-20230113182611165

我们的网络传输用位段还是比较多的,有些部分并不需要那么多的空间即可完成封装,这时候用位段可以很好的节省空间,避免网络传输过程中的“堵塞”问题。

枚举

枚举类型的定义

enum Day//星期
{
Mon,
Tues,
Wed,
Thur,
Fri,
Sat,
Sun
};
enum Sex//性别
{
MALE,
FEMALE,
SECRET
};
enum Color//颜色
{
RED,
GREEN,
BLUE
};  

像这样的enum Day,enum Sex等都是一种类型,我们可以用他们来定义变量,{}内部都是枚举常量,枚举常量也是常量,这些常量都是有值的,默认第一个值为0,向下一次递增。

我们也可以进行初始化:

enum Color//颜色
{
RED=1,
GREEN=2,
BLUE=4
};  

枚举的优点

我们可以使用 #define 定义常量,为什么非要使用枚举?
枚举的优点:

  1. 增加代码的可读性和可维护性
  2. 和#define定义的标识符比较枚举有类型检查,更加严谨。
  3. 防止了命名污染(封装)
  4. 便于调试
  5. 使用方便,一次可以定义多个常量

其实前两个优点是比较明显好理解的,其他优点我们只能以后写的多了才能明显体会到。

枚举的使用

enum Color//颜色
{
RED=1,
GREEN=2,
BLUE=4
};
enum Color clr = GREEN;//只能拿枚举常量给枚举变量赋值,才不会出现类型的差异  

注意:只能拿枚举常量给枚举变量赋值,才不会出现类型的差异 ,在C语言中检查没有太严格,但是在C++中这种类型不一致你去赋值的话会直接报错。

联合体(共用体)

联合类型的定义

联合也是一种特殊的自定义类型,这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间(所以联合也叫共用体)。

//联合体类型声明
union UN
{
	char a;
	int i;
};
//联合体变量定义
union UN un;
//联合体变量大小计算
printf("%d\n", sizeof(un));

联合的特点

联合体的特点是成员共用一块空间,这样的话,联合体大小至少是联合体最大成员的大小。

我们来看一个示例:

union UN
{
	int i;
	char a;
};

int main()
{
	union UN un;
    printf("%d\n",sizeof(un));
	printf("%p\n", &un);
	printf("%p\n", &(un.a));
	printf("%p\n", &(un.i));
	return 0;
}

输出:image-20230113194142095

可以看到三个地址是一样的,并且un的大小为4,这样就验证了a和i确实是共用一块地址的,并且共同占用4个字节。那么实际内存中是怎么存放的呢?我们看下图。

image-20230113194543623

联合大小的计算

可能你会注意到上面联合类型的大小为什么是4呢?难道一定就是最大成员的大小吗?其实不是的,联合体也存在一定的对齐。

image-20230113195036490

举例:

union Un1
{
	char c[5];
	int i;
};
union Un2
{
	short c[7];
	int i;
};
int main()
{
	printf("%d\n", sizeof(union Un1));
	printf("%d\n", sizeof(union Un2));
	return 0;
}

输出:image-20230113195300635

根据计算规则计算即可。
以上就是自定义类型:结构体类型、枚举类型、联合体类型的全部内容介绍。

Python爬虫实战:基于Scrapy与Playwright的搜狐新闻高效爬取 在当今信息爆炸的时代,网络爬虫技术已成为数据获取和分析的重要工具。作为国内领先的新闻门户网站,搜狐新闻包含了大量有价值的新闻数据,这些数据对于舆情分析、市场研究等领域具有重要意义。本文将详细介绍如何使用Python最新的爬虫技术栈(Scrapy框架结合Playwright浏览器自动化工具)来高效爬取搜狐新闻数据。pythontitle = scrapy.Field() # 新闻标题url = scrapy.Field() # 新闻链接。 阅读详情

相关推荐

在Ubuntu 22.04 LTS上搞定Intel Quartus Prime 22.1和QuestaSim:一份保姆级的安装与License配置指南

本文提供在Ubuntu 22.04 LTS上安装和配置Intel Quartus Prime 22.1与QuestaSim的详细指南。涵盖依赖安装、环境变量设置、License配置及常见问题解决,帮助FPGA开发者快速搭建稳定的开发环境。特别针对Ubuntu系统优化,确保工具链高效运行。

weixin_29208077的博客 314

C语言:自定义类型进阶(结构体、联合体、枚举)

本文详细介绍了C语言中的三种自定义类型:结构体、联合体和枚举。重点分析了结构体的内存对齐规则及其性能优势,解释了位段的内存分配方式及其平台依赖性,并通过实例展示了枚举和联合体的实际应用场景。结构体通过空间换时间提高访问效率,联合体通过共享内存节省空间,枚举则增强了代码可读性。文章还探讨了默认对齐数的设置方法,并总结了这些自定义类型在编程中的重要性。

2301_81454749的博客 1909

ESP32水墨屏日历实战:低功耗自动更新与HTTPS数据解析

本文详细介绍了ESP32水墨屏日历项目的开发实践,重点讲解了低功耗自动更新与HTTPS数据解析的实现方法。通过ESP32的自动休眠功能和水墨屏的零功耗特性,结合HTTPS请求安全获取网络数据,实现了高效节能的桌面日历应用。项目代码开源,适合物联网开发者参考。

xx56789的博客 769

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

有了结构体类型,那如何定义变量,其实很简单。int x;int y;}p1;//声明类型的同时定义变量p1//定义结构体变量p2//初始化:定义变量的同时赋初值。struct Stu //类型声明//名字int age;//年龄//初始化int data;//结构体嵌套初始化//结构体嵌套初始化。

编程小菜kun 1356

MapGIS地质剖面图绘制实战:从数据准备到整饰出图

本文详细解析了MapGIS地质剖面图绘制的全流程,从数据准备到整饰出图,涵盖了等高线处理、GRD格网化、比例尺控制等关键步骤。通过实战技巧和案例分析,帮助地质工作者高效完成专业地质剖面图绘制,提升矿产勘探和工程勘察的工作效率。

weixin_28335283的博客 582

如何利用CN3791实现太阳能电池板对锂电池的高效充电管理

本文详细介绍了如何利用CN3791芯片实现太阳能电池板对锂电池的高效充电管理。CN3791集成了MPPT(最大功率点跟踪)功能,能智能调节太阳能板的输出,确保在不同光照条件下获得最大功率。文章涵盖芯片工作原理、外围电路设计、充电全过程管理及实际应用经验,帮助开发者优化太阳能充电系统效率。

weixin_33709219的博客 495

【C进阶】⑧自定义类型:结构体、枚举、联合体 超详细的总结

一、结构体 1. 什么是结构体? 结构体是一些值的集合,这些值被称为成员变量;结构体中的每个成员变量可以是不同类型的变量; 例如: 数组是一组相同类型的元素的集合; 故: 结构体也是一些值的集合,结构体的每个成员可以是不同类型; 2. 结构的声明 struct tag { member -list }variable -list; 例如:生活中,对象是复杂的; 对于一本书而言: 一本书含有:书名+作者+出版社+定价+书号等等; 一个学生:学号+姓名+电话+性别等等; 这些,书和学生就是一种结构

森林里的白杨 1182

LFM调制信号分类与检测识别

支持识别LFM信号、间歇采样干扰(ISRJ)、灵巧噪声干扰(SNJ)、扫频干扰(SJ)、瞄准干扰(AJ)、阻塞干扰(BJ)、密集假目标干扰(DFJ)、密集假目标加灵巧噪声干扰(DFWSNJ)、距离欺骗干扰(DDJ)、距离欺骗加灵巧噪声干扰(DDWSNJ)。Faster-RCNN支持检测识别LFM信号、间歇采样干扰(ISRJ)、灵巧噪声干扰(SNJ)、扫频干扰(SJ)、瞄准干扰(AJ)、密集假目标干扰(DFJ)、密集假目标加灵巧噪声干扰(DFWSNJ)、距离欺骗加灵巧噪声干扰(DDWSNJ)等8种信号。

菜yuan~的博客 1022

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

/struct - 结构体关键字//tag - 结构体标签struct tagmemlist//成员列表}variable-list//变量列表;位段的声明和结构体是类似的,1️⃣位段的成员必须是int或signed int2️⃣位段的成员名后边有一个冒号和一个数字struct Sint _a:2;int _b:5;int _c:10;int _d:30;❗位段比特变量a存储于2个比特位里变量b存储于5个比特位里。

weixin_74076508的博客 314

【SWAT】SWAT中预定义河网及流域

平原圩区没有明显的海拔差异。DEM中包含的地形信息无法定义河段的位置和水文连接,SWAT模型Watershed Delineator中提供两种方法,帮助用户输入流域拓扑信息。第一种方法,“Burn-in”和手动绘制河段和子流域边界。首先,使用“Burn-in”功能导入数字河道网络(DCN),并根据DEM和DCN绘制河流和子流域。然后在ArcGIS中编辑“流域”和“河段”层,可以调整位置、范围和水文连接。第二种方法,可以手动绘制或重新编辑河流和子流域,预定义河网及流域。

```On Earth, Be Water, By Coding``` 3269

vue2 - 详细实现播放AMR格式音频并实现自定义播放器样式,支持amr音频文件在线地址URL播放、调用服务端API接口获取二进制文件流amr形式、用户本地上传amr文件并实现立即播放(详细代码)

vue2,amr,amr文件播放,vue播放amr音频文件以及在线url跨域问题解决,vue使用audio标签播放amr音频,amr跨域解决,amr网页解码播放,文件上传后怎么播放,vue2播放.amr语音文件,api接口形式调用获取的amr如何播放,vue中如何使用audio元素播放AMR格式的文件,进度条,vue前端如何播放AMR格式的音频文件,vue播放语音文件AMR格式,播放amr格式音频AMR录音机,h5原生audio播放amr格式的音频,VUE2使用benz-amr-recorder 实现解码、

✅ 精选推荐文章 7410

C语言进阶之自定义类型:结构体、枚举、联合体

C语言进阶之自定义类型:结构体、枚举、联合体

m0_74698759的博客 98

湿式双离合器自动变速器simulink建模与仿真

随着汽车工业的不断发展,自动变速器在提高汽车性能、驾驶舒适性和燃油经济性等方面发挥着越来越重要的作用。湿式双离合器自动变速器(Wet Dual-Clutch Transmission,简称 WDCT)作为一种先进的自动变速器技术,具有换挡速度快、动力传递平稳、燃油经济性好等优点,被广泛应用于各类汽车中。结构组成湿式双离合器自动变速器主要由双离合器、齿轮传动系统、液压控制系统和电子控制系统等部分组成。双离合器:由两个独立的离合器组成,分别控制奇数挡和偶数挡。通过切换两个离合器的工作状态,可以实现快速换挡。

平时工作较为繁忙,私信消息一般晚上回复,谢谢大家~~ 344

C语言进阶|自定义类型全解:结构体/位段/枚举/联合体(思维导图+完整源码+面试考点)

C语言自定义类型整体框架├─ 基础铺垫│ ├─ 普通内置类型:char/short/int/float/double│ ├─ 自定义类型作用:组合数据、状态枚举、位存储、内存共享│ └─ 辅助关键字:typedef 类型重命名├─ 1. 结构体 struct(核心重点)│ ├─ 基本语法:声明、变量定义、匿名结构体│ ├─ 初始化与成员访问:. 运算符、-> 指针访问│ ├─ 结构体内存对齐(面试必考)│ │ ├─ 四大对齐规则。

2401_83179383的博客 485

IMSL CNL 7.0.0 (x86-64)Crack

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

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

【C语言学习笔记 --- 自定义类型】

初识C语言学习笔记Vlog---029C语言自定义类型详解

m0_69455439的博客 316

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Android For JNI(五)——C语言多级指针,结构体,联合体,枚举,自定义类型

本篇经过博主同意方才转载,原文地址:http://blog.csdn.net/qq_26787115/article/details/51225368 Android For JNI(五)——C语言多级指针,结构体,联合体,枚举,自定义类型 我们的C已经渐渐的步入正轨了,基础过去之后,就是我们的NDK和JNI实战了 一.多级指针 指针的概念我们在

Leno 763

【C语言进阶】C语言进阶教程:利用结构体、联合体和枚举自定义数据类型

在C语言的浩瀚宇宙中,自定义类型如同璀璨星辰,为开发者们提供了无限的可能性和创造力。作为一门历史悠久且功能强大的编程语言,C语言不仅以其接近硬件的特性和高效的执行效率著称,更以其灵活的数据结构定义方式赢得了广泛的赞誉。而自定义类型,正是这一灵活性的集中体现

EterNity_TiMe_的计算机学习之路 1867

C语言自定义类型的介绍(结构体,枚举,联合体,位段)

⭐️前面的话⭐️ 大家好!在C语言中,有个叫“自定义类型”玩意,它究竟是什么呢?其实,就是字面意思,可以自己定义的类型就是自定义类型。具体说就是我们熟知的结构体,枚举,位段,联合体(共用体)。 划重点: 结构体,枚举,位段,联合体的定义。 结构体实现位段。 结构体,枚举,联合体内存对齐及其大小计算。

未见花闻的博客 1212

收集飞花令碎片——【C语言】自定义类型(结构体、联合体、枚举)

C语言结构体详解 结构体(Struct)是C语言中一种自定义数据类型,可以将不同类型的数据组合成新的复合类型。本文全面介绍了结构体的核心知识点: 结构体定义:通过struct关键字定义,包含多个成员变量。 变量声明与初始化:三种声明方式及初始本文内容翔实,配以代码示例和内存布局图表,是学习C语言结构体的完整指南。

枫亭湖区的博客 6468

C语言-结构体、联合体、枚举

c语言中的结构体、联合体、枚举的定义、语法以及应用

m0_74147998的博客 2007

C语言自定义类型:<结构体,枚举,联合>一招破

一章教会你自定义类型:结构体,枚举,联合 大家好我是枫晨~,今天就来总结一下C语言中的所有自定义类型:结构体,枚举,联合,以及一般书上提都不会提的位段,扩大你的只是储备。 文章目录一、结构体※1.1认识结构体※1.2结构体的声明※1.3特殊声明 ---匿名结构体类型※1.4结构体的自引用typedef在结构体指针上的应用※1.5定义结构体变量※1.6结构体内存对齐-重要!!!**offsetof函数** -返回/计算结构体相对于起止位置偏移量为什么存在内存对齐?1.7修改默认对齐数1.8结构体传参

qq_36935038的博客 1464

C语言——自定义类型详解[结构体][枚举][联合体]

详细解读自定义类型

plj521的博客 1068

【C语言】一篇搞定自定义类型:结构体、枚举、联合体(共用体)附上简易通讯录项目源码

一篇搞定自定义类型:结构体、枚举、联合体(共用体)1. 结构体1.1 结构体类型的声明1.2 结构的自引用1.3 结构体变量的定义和初始化1.4 结构体内存对齐1.5 为什么存在内存对齐1.6 修改默认对齐数1.7 结构体传参1.7 结构体实现位段(位段的填充&可移植性)2. 枚举2.1 枚举类型的定义2.2 枚举的优点2.3 枚举的使用3. 联合3.1 联合类型的定义3.2 联合的特点3.3 联合大小的计算4. 利用自定义类型实现简易通讯录程序 1. 结构体 结构的基础知识 结构是一些值的集合,

DerrickWestbrook的博客 718

C语言之自定义类型:结构体、联合体和枚举

本篇文章对C语言中的结构体、联合体和枚举类型进行了全面的解释,包含类型声明、变量创建和内存对齐等内容

Eristic0618的博客 1251

C语言:自定义类型 - 结构体 & 联合体 & 枚举

讲解C语言的自定义类型,包括结构体,联合体,枚举

博客网站 https://async-area.com 1714

C语言从入门到实战——自定义类型:结构体,联合体和枚举

结构体(struct):结构体是一种自定义的数据类型,它可以将不同类型的数据组合在一起。结构体的作用是提高代码的可读性和模块化,使得代码更加清晰和易于维护。使用场景包括:存储多个相关联的数据,如学生信息、员工信息等。联合体(union):联合体与结构体类似,但它的所有成员共享同一块内存空间。联合体的作用是在相同的内存空间中存储不同类型的数据,节省内存空间。使用场景包括:需要在不同类型之间进行切换的场景,如操作系统中的进程控制块(PCB)。枚举(enum)

2203_75422717的博客 1628

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

【C语言进阶】自定义类型:结构体、枚举、联合体的详细介绍。

共同学习,相互分享。 1228
上一篇: C进阶:字符函数和内存函数
下一篇: 动态内存管理
迟钝南瓜
博客等级 码龄4年 847粉丝 50原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

迟钝南瓜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值