深度分析c++引用的本质以及引用与指针的区别

C语言与C++的核心区别及深度解析 C语言与C++的核心区别源于设计理念的差异:C语言是面向过程的结构化语言,追求高效、简洁,专注于底层编程和线性任务;C++是兼容C语言的面向对象语言,在高效性基础上,通过类、继承、多态、STL等特性支持复杂系统开发,兼顾灵活性与扩展性。选择哪种语言需根据应用场景决定:底层开发、资源受限场景优先C语言;大型软件、复杂系统、需代码复用和扩展的场景优先C++。两者并非对立关系,C++可兼容C语言代码,很多项目会混合使用两种语言,发挥各自优势。 阅读详情


引用的概念

在语法层面上,引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。简单理解为:在语法层面上,引用就是给变量重新取一个名字


引用的定义

引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟另外的内存空间进行存储,它与引用的变量共用的是同一块内存空间的地址。

格式如下:
类型& 引用变量名(对象名) = 引用实体;
而此处的&不是取地址操作符,而是起标志作用,标志所定义的标识符是个引用.

int main() {
    int a = 1;
    int& b = a; //此处就是引用的定义
    return 0;
}

此处就相当于变量a,b共用同一块内存地址空间
在这里插入图片描述


引用的特性

  1. 引用在定义时必须初始化
  2. 不能有空引用
  3. 一个变量可以有多个引用(相当于有多个别名)
  4. 引用一旦引用一个实体,不能引用其他实体
  5. 没有多级引用,再不能引用其他实体

如图
在这里插入图片描述


引用的权限问题

先看图代码
在这里插入图片描述

为什么图中不加const会发生报错呢???这就不得不提到引用的权限问题
接下来我们来分析一下

int main()
{
	const int a = 1;//变量a被const修饰,a的值不能改,权限是只读
	int&d = a;//d是a的别名,但d的改变会改变a,也就变成了可读可写,扩大了权限
	const int& d = a;//d被const修饰,所以d也只可读,权限与a相同,不存在扩大权限
	return 0;
}

所以之所以不加const会报错,就是因为权限被放大了

再看这个代码
在这里插入图片描述
这个代码能够顺利通过,为什么?

int main()
{
	int a = 1;//权限是可读可写
	const int& b = a;//b被const修饰,权限为可读,但不可写
	return 0;
}

通过这段代码我们可以得出,权限是可以被缩小的
注意:这段代码如果你想修改a的值,可以通过a来进行修改,但不能通过b,并且修改了之后,b的值仍然会跟随着a进行改变
如图:
在这里插入图片描述

接下来我们再看看一个特殊的例子

在这里插入图片描述
如果没有const这一行代码,可能大家会认为是a的类型(int)和b的类型(double)不匹配而导致的错误,但事实并非如此.当你加了const之后,便不会有报错,这是为什么呢?
这其中就要提到C语言中的类型转换(包括隐式类型转换和显式类型转换)
如下面这个例子
在这里插入图片描述
又比如:
在这里插入图片描述
总结:类型转换的时候都会产生一个临时变量,而这个临时变量是会被const修饰的,具有常性

所以现在我们知道了,上图那个例子报错就是因为权限被放大了,所以我们应该加上const

最后需要补充的是:权限问题只针对于引用和指针


引用的使用方式

1.引用普通变量(最常见的)

int main()
{
	int a = 10; //a是一个普通整型变量
	int & b = a;
    return 0;
}

2.常引用

int main()
{
    const int a = 1;
    const int& c = a;//保持权限相等
    const int& z =10;//常数只可读,所以要用const限制成只读
    return 0;
}

3.指针引用

int main()
{
		int a = 100;
		int* p = &a;
		int*& k = p;//这是个指针引用,k就是个指针p的别名
		return 0;
	
}

引用作参数

在使用带参函数的时候,由于一般函数的参数是实参的拷贝,但有些函数的操作可能是要对原变量进行改变的,C语言常用的做法是指针来传递原变量地址,这样的好处是如果需要将改变传回或者改变原变量则不需要返回值,可以通过传入指针直接改变。而C++提供了引用的新特性,可以使用引用传参
比如对于交换两数:

void swap(int *a, int *b)  //c语言的老方法
{
    int tmp = *a;
    *a = *b;
    *b = tmp;
}
void swap(int &a, int &b) //c++新引入的特性-引用
{
    int tmp = a;
    a = b;
    b = tmp;
}

其实在c++中分两种情况看待
①如果变量是内置类型,如char,int等,那么推荐值传递
因为编译器将直接使用寄存器进行操作,显然这是最快的,如果要用指针和引用,那么会多一次放存操作
②如果变量是对象,那么使用引用将是首选,并且参数里面的引用最好加上const
当需要传递的值很大,寄存器不够用时,那么使用指针或者引用,将只需要传递变量的地址就可以了


引用作返回值

说到传引用返回又不得不提到传值返回,那接下来我们对两者进行分析
1.对于传值返回,一般返回值都会建立一个临时变量,产生一个拷贝副本,而大多数情况下这个临时拷贝也是通过寄存器返回.
在这里插入图片描述
2.而传引用返回,不会产生值的副本,而是将其返回值直接传递给这个return后面的值(原因是因为本身是传引用返回,传的变量的别名,可以想成这个函数的最终效果就是一个变量),所以传引用返回可以直接当左值使用

//函数fun
int& fun()
{
   static int count = 0;//静态在全局,静态变量不会被销毁
   int* a = &count;
   return *a; // 之所以是*a,其实就好比和定义引用时的int &c = 10 一个道理
   
}
//main函数
int main()
{
	fun()++; //当左值使用,直接进行++,如果不是传引用,必须赋值给一个变量
	return 0;
}

又或者是这个例子:

struct Stu
{
	int age;	// 变量
	// c++中,结构体中是可以包含函数的
	Stu& addAge(Stu& stu, int num)
	{
		stu.age = stu.age + num;
		cout << "age = " << age << endl;
		return stu;
	}
};

int main()
{
	Stu stu;
	stu.age = 10;
	// 链式编程:所谓链式编程,就是像一根链子一样,可以一直.下去
	stu.addAge(stu, 20).addAge(stu, 30).addAge(stu, 40);
	cout << "最终age = " << stu.age << endl;
	return 0;
}

这样就产生了链式编程


引用的本质

在开始讲引用的概念时,我们强调了,在语法概念上引用就是一个别名,没有独立空间,和其引用实体共用同一块空间.但其实语法概念只是帮助我们更加方便的使用引用.
在底层实现上实际是有空间的,引用的内部实现机制其实就是指针

通过下图底层汇编代码的角度也能够看到,指针和引用在底层汇编角度一模一样

在这里插入图片描述

指针和引用其实是一样的,但我们还能单独使用引用,原因就是编译器帮我们做了很多工作

就以上面代码为例:
int & ra = a;,编译器会自动转化成 int * const ra= &a;(注意这是指针常数,这也解释了引用特性中的第4条为什么不能更改)
a = 20;,编译器会自动转化成 *a = 20;

–
下面这段引用的代码我们用底层指针进行分析

void func(int& ref)
//编译器发现参数为引用,便会转化成int* const ref = &a 
{
    ref = 100; //ref为引用,编译器转化为*ref = 100
}
int main()
{
    int a = 10;
    int& ref = a;
    ref = 20;//内部发现ref是引用,故编译器转为*ref = 20
    func(a);
    return 0;
}

总结:虽然引用的本质是指针但更为准确来说是加了const修饰的指针

此外,我们也会经常看到常量引用(const T&)的特性
定义:声明时必须用 const 修饰,例如 const int &ref = a
其背后其实也就是 const int * const ref = &a,所以指针ref既不能改变指向,也不能改变a的值

int a = 10;
const int &ref = a;// 背后是const int * const ref = &a
ref = 20; // 背后是*ref = 20,但编译错误:无法修改常量引用的值

常量引用的用法主要是在函数参数传递
作用是避免拷贝:传递大对象时引用避免复制开销;const保证数据不被意外修改

如:

void print(const std::string &str) {
    std::cout << str;  // 安全读取,无法调用str的非const方法
}

引用和指针的区别

所以正是因为引用本质是指针,但又并非普通指针,所以引用和指针也就有了一些区别

  1. 引用语法概念上定义一个变量的别名,指针存储一个变量地址。
  2. 引用在定义时必须初始化,指针没有要求
  3. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体
  4. 没有NULL引用,但有NULL指针
  5. 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下占4个字节)
  6. 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小
  7. 有多级指针,但是没有多级引用
  8. 访问实体方式不同,指针需要显式解引用,引用编译器自己处理
  9. 引用比指针使用起来相对更安全(只能说是相对安全)

数据结构中的引用

最后我们来思考这样一个问题,既然在c++中有了引用,那么在数据结构中许多结构中的指针是否可以用引用来进行代替?
就好比下图链表结构
在这里插入图片描述
在C语言中我们是使用指针来进行指向下一个元素,那么是否可以此处改为引用?
答案是不可以
因为一旦你使用引用来进行指向,那么链表中增删改查就无法正常操作,因为上面链表特性中的第四点已经明确指出不能改变实体(本质是因为被const修饰).所以同理其他很多其他的数据结构也不要使用引用

注意:java中的数据结构都是引用,那是因为java里面的引用实现机制和c++里面完全不同,所以c++的很多数据结构是使用指针

SAP Production Resources/Tools 在生产与维修现场的主数据设计 文章摘要:生产资源工具(PRT)是SAP系统中管理辅助生产资源的重要概念,区别于BOM组件和工作中心。SAP将PRT分为物料型、设备型、文档型等类别,通过FHMI物料类型进行专项管理。PRT与工艺路线(task list)关联,进入生产订单后可实现精细化管理。PRT还与质量检验(QM)、设备维护(PM)、文档管理(DMS)等模块集成,通过分类系统提升检索效率。PRT的价值在于将分散的生产辅助资源统一纳入生产执行体系,确保工序所需资源到位,支持制造过程的可控性。(149字) 阅读详情

相关推荐

【C++基础】指针与引用的本质区别:从汇编层看参数传递(面试必杀技)

在C++面试中,指针与引用的区别是考察候选人底层理解能力的关键领域。本文结合腾讯、阿里、字节等大厂真题,通过汇编代码和内存布局图,揭示二者在参数传递中的本质差异。无论你是校招新人还是资深专家,掌握这些核心知识点都能让你在面试中脱颖而出。

byte轻骑兵的技术小窝 1158

引用的本质

引用的本质就是一个指针常量

weixin_43200943的博客 1922

【C++深度剖析学习总结】 12 关于const和引用的分析

学习交流可以添加 微信读者交流①群 (添加微信:coderAllen,备注加群) 程序员技术交流①群:736386324 C++教程所有源码地址: https://github.com/lkk789/C-Learn-Source-code 1.关于const的疑问(老生常谈的问题,之前在C语言就是说过) const什么时候是只读变量?什么时候是常量? const常量的判断准则 只有用字面量初...

CodeAllen嵌入式 1135

引用和指针概念及区别

指针:指针是一个特殊的变量,它里面存储的的数值为内存里的一个地址,通过*访问内存地址所指向的值 引用:引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。

weixin_63178060的博客 1万+

如何用capl操控程控电源(RS232)

capl脚本操控RS232

xiaohuanxiong_的博客 3991

PyTorch版Unet训练后别只看loss:手把手教你计算并可视化多类别语义分割的mIoU(附完整代码)

本文详细介绍了在PyTorch中使用Unet模型进行多类别语义分割后,如何计算和可视化mIoU(mean Intersection over Union)以全面评估模型性能。通过完整的代码示例和实用技巧,帮助开发者从loss优化转向更精准的区域分割评估,特别适用于医学图像分析等关键场景。

weixin_30906185的博客 435

2020-09-25C++学习笔记引用2:二级指针形参与指针形参的使用方法和区别重难点,主看综合代码(1、指针形参2、引用形参3、二级指针形参4、指针引用形参)

2020-09-25引用2:二级指针形参与指针形参的使用方法和区别重难点 1、指针引用 #include "iostream" using namespace std; struct Teacher { char name[64]; int age; }; int getTe(Teacher **myp ) { Teacher *p = (Teacher *)malloc(sizeof(Teacher)); if (p ==NULL) { return -1; } memset(p

勿在浮沙築高台 493

Mac上VMware Fusion手动安装VMware Tools实现跨系统复制粘贴

本文详细指导了在Mac的VMware Fusion中手动安装VMware Tools的完整流程,以解决虚拟机与宿主机之间无法复制粘贴的常见问题。通过定位安装镜像、挂载、解压并运行安装脚本,最终实现跨系统无缝数据交换,提升工作效率。

orange的博客 698

引用的本质分析

引用的意义 (1)引用作为变量别名而存在,因此在一些场合可以代替指针 (2)引用相对于指针来说具有更好的可读性和实用性 #include <stdio.h> void swap(int& a, int& b) { int t = a; a = b; b = t; } int main() { int a = 1; int b = 2; swap(a, b); printf("a = %d, b = %d\n", a, b

weixin_46571142的博客 965

FPGA远程升级避坑指南:用AXI Quad SPI IP读写N25Q128 Flash的完整流程

本文详细介绍了FPGA远程升级过程中使用AXI Quad SPI IP读写N25Q128 Flash的完整流程,包括IP核配置、Flash操作指令集、双镜像备份设计及生产级远程升级协议。通过最佳实践和避坑策略,帮助开发者实现可靠的镜像更新方案,提升系统可靠性和可维护性。

weixin_30542079的博客 673

qPCRtools | 神仙R包分分钟搞定你的qPCR实验结果!~

1写在前面 不知道大家都是怎么完成qPCR的计算的,在不会R的时候,我是用一个祖传的Excel表进行计算的。🤣 但是,一直有个缺点,如果需要计算的量比较大时,就不方便了,去搜了一下文献,发现了一个最近发表的R包,不仅可以计算反转录的RNA体积,还可以帮助选择定量方法,简直是神仙R包,本期就介绍一下它的使用吧。🥰 感谢原作者的开发,嘿嘿,文末有引用方法。👀 2用到的包 rm(list = ls())library(tidyverse)library(ggsci)library(qPCRtools)librar

m0_72224305的博客 3986

C++ 指针与引用面试深度解析

C++指针与引用面试解析摘要 指针和引用是C++中实现间接访问的两种机制,各有特点和适用场景。指针存储对象地址,支持空值和重定向,但存在安全隐患;引用是对象别名,必须初始化且不可为空,更安全但限制更多。最佳实践中,优先使用引用处理函数参数和返回值,指针则用于可选对象或需改变指向的情况。关键区别在于指针暴露底层地址概念,引用提供高级抽象。返回引用时需确保目标对象生命周期长于引用,避免悬垂引用。

jokr_的博客 1281

Dzzoffice结合OnlyOffice 报错排查流程总结

首先访问 OnlyOffice 首页,如下图:出现上图仍旧不能说明你的 OnlyOffice 服务已经成功安装,我们需要启动 OnlyOffice 服务测试用例来检测,可以看到上图出现了两条命令,第一条命令是用来启动测试用例服务的,我们只需要在后台执行该命令即可,Windows环境是以管理员身份运行Windows PowerShell输入即可运行了。

小胡的博客 4597

C++指针与引用的本质区别及使用场景

指针和引用是C++中实现间接内存访问的核心机制,二者在底层实现和语法特性上存在显著差异。从计算机科学角度看,指针是存储内存地址的变量,支持多级间接访问和空值表示;而引用作为变量的别名,在编译后通常通过指针实现但提供更安全的语法封装。在工程实践中,指针更适合需要动态内存管理或可选参数的场景,引用则因其必须初始化和不可重绑定的特性,天然避免了空指针异常等问题。现代C++开发中,智能指针与移动语义的引入进一步扩展了二者的应用边界,理解其内存模型和类型系统处理机制对编写高性能、安全的代码至关重要。

weixin_30407613的博客 314

服务器报错:“Unhealthy status reported by this UEFI driver without specific error message”.. 记录解决过程

服务器开机报错:Unhealthy status reported by this UEFI driver without specific...

ayychiguoguo的博客 4398

uniapp - 解决报错Error in event handler for “service.requestComponentInfo“: “TypeError: cannot read prop

uniapp,报错,Error in event handler for "service.requestComponentInfo": "TypeError: cannot read properties of undefined (reading 'matches')",h5移动端网页,微信小程序,支付宝小程序,Android安卓,苹果ios,app,nvue,如何解决这个问题,一直报错,uniapp报错Error,都检查了还是报错,怎么解决这个错误,uniapp出现Error in event han

🏆 前端领域优质创作者 6379

侯捷 C++ 课程学习笔记:C++ 中引用与指针的深度剖析

定义时必须初始化,因为它是变量的别名,初始化后就不能再引用其他实体。例如 int& ra;这样的定义是错误的,必须写成 int a = 10;。定义时不要求必须初始化,可以先定义 int* pa;,后续再让它指向合适的变量,如 pa = &a;,并且指针可以在不同时刻指向不同的同类型实体。引用和指针在 C++ 中各有特点和用途。引用语法简洁、使用安全,常用于避免拷贝和作为函数参数、返回值来提高性能;

nplplus的博客 1411

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

C++指针与引用的本质区别及应用场景详解

指针和引用是C++中处理内存地址的两种核心机制。指针作为存储地址的变量,支持灵活的内存操作和多级间接访问;引用则是变量的别名,提供更安全的语法抽象。从底层实现看,指针需要额外的存储空间和两次内存访问,而引用编译后直接操作原变量。在工程实践中,指针常用于动态内存管理和多态操作,引用则更适合函数参数传递和运算符重载。理解const修饰、悬垂引用等高级特性,能帮助开发者规避常见陷阱。现代C++推荐优先使用引用传递参数,结合智能指针管理资源生命周期,这些最佳实践对提升代码安全性和性能至关重要。

weixin_30786657的博客 495

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

C++中指针与引用的区别详解:从原理到实战

C++中指针与引用的区别详解:从原理到实战

m0_63951116的博客 951

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

指针 vs 引用:C/C++ 内存操控的双生核心机制深度剖析

摘要:指针与引用在C/C++中均实现间接访问,但存在本质差异。指针是独立对象,可空且可重绑定;引用是别名,必须初始化且不可更改。引用更安全,编译器可优化其内存占用。函数参数传递时,优先用引用表达必存对象,用指针表示可空场景。性能上二者无显著差异,选择应基于语义清晰性。指针关注内存地址,引用强调对象身份,理解这一哲学差异有助于编写更安全高效的代码。

聚焦前沿科技与硬核技术底层拆解,深耕 AI、量子计算、WebAssembly 等核心领域,拒绝碎片化科普。以通俗语言讲透复杂原理,用干货内容拆解技术逻辑,助力从业者吃透核心、把握趋势,每篇都是可落地的深度技术沉淀。 1336

深入解析C++引用:安全高效的别名机制及其与指针的对比

引用(Reference)是C++为变量创建的别名,通过符号声明。指针适用场景现代C++黄金法则"引用是指针的安全马甲,而智能指针是带着安全帽的指针——它们共同构建了现代C++的内存安全体系。绑定即永恒:必须初始化且不可重新绑定零额外开销:编译器自动处理解引用类型安全:必须与原始变量类型严格匹配// 正确声明ref = 100;// 修改value的值// 输出100// 错误:未初始化// 错误:不能绑定字面量引用优势语法简洁,自动解引用强制初始化,减少空指针异常明确表达程序设计意图。

2301_76794365的博客 1106

C++ 指针与 C 语言指针的深度比较

特性C 指针C++ 指针内存管理手动 (手动或智能指针 (new/delete, RAII)类型安全弱类型安全强类型系统,类型转换操作符空指针NULL(通常为 0)nullptr(类型安全的空指针)面向对象支持无直接支持支持多态、虚函数、成员指针引用类型无有引用类型 (),作为指针替代函数指针支持简单函数指针支持成员函数指针和函数对象模板支持无支持模板和泛型指针使用 C 风格指针的情况与 C 库交互的兼容层嵌入式系统等受限环境需要极致性能的底层操作使用 C++ 现代指针的情况。

weixin_66709931的博客 1479

【C++】引用机制深度解析

2. 一个变量可以有多个引用3. 引用一旦引用一个实体,再不能引用其他实体。

2402_83411382的博客 2137

【C++】引用(下)【深度全面解析】

今天我们接着上一篇文章继续学习C++引用(上)继续学习C++引用相关的知识,码字不易,希望多多支持!引用概念上定义一个变量的别名,指针存储一个变量地址。引用在定义时必须初始化,指针没有要求引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何 一个同类型实体没有NULL引用,但有NULL指针在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32 位平台下占4个字节)

云小逸的博客 1019

C++数组、数组名与指针的深度解析

C++中数组、数组名与指针的关系是初学者容易混淆的核心概念。数组是连续内存的相同类型元素集合,数组名在大多数情况下会隐式转换为指向首元素的指针,但仍与指针变量有本质区别:数组名是常量标识符不可重新赋值,而指针是变量可修改指向;sizeof(数组名)返回整个数组大小,而sizeof(指针)返回指针自身大小。理解这些特性对正确操作数组内存至关重要,特别是在函数参数传递时数组会退化为指针,必须显式传递长度参数。掌握三者关系可避免常见编程错误,写出更安全高效的代码。

bkspiderx的博客 1455

第5课 引用的本质分析

引用的意义 引用作为变量别名而存在,因此在一些场合可以代替指针 引用相对于指针来说具有更好的可读性和实用性 特殊的引用 const引用 在C++ 中可以声明const引用 const Type& name = var; const引用让变量拥有只读属性 int a = 4; const int& b = a; int* p = (int *)&a...

lzg2011的博客 271
上一篇: 【排序算法】详解直接插入排序和希尔排序原理及其性能分析
下一篇: 【Linux】零基础入门Linux你所需要掌握的
kklovecode
博客等级 码龄4年 127粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

kklovecode

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

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

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

打赏作者

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

抵扣说明:

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

余额充值