C++引用的本质剖析

【C++深度剖析学习总结】 5 C++中引用的本质 – 作者 Allen 转载请注明出处 微信公众号「炫色Allen」(微信号:Allen5G) c++是强类型的语言,类型来不得一点含糊 7-1:函数重载 vs 函数指针 #include <stdio.h> #include <string.h> int func(int x) { return x; } int func(int a, int b) {... 阅读详情

//
//  main.cpp
//  CCC
//
//  Created by mac on 2017/4/27.
//  Copyright © 2017年 iosflow. All rights reserved.
//

#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "array"

using namespace std;

struct Teacher
{
    char name[64];//64
    int age;//8 //64位程序  4字节:32位程序
    
    int &a;//8
    int &b;//8
};
//
////指针所指向的内存空间不能被修改
//int printTeacher01(const Teacher *pT)
//{
////    pT -> age = 10;
//    return 0;
//};
//
////指针变量本身不能被修改
//int printTeacher02(Teacher * const pT)
//{
//    pT -> age = 10;
////    pT = NULL;
//    return 0;
//};
//
////指针所指向的内存空间不能被修改;指针变量本身不能被修改
//int printTeacher03(const Teacher * const pT)
//{
////    pT -> age = 10;
//    //    pT = NULL;
//    printf("age:%d",pT -> age);
//    return 0;
//};


void printT1(Teacher *pT){
    cout<<pT->age<<endl;
//    pT->age = 45;
}

void printT2(Teacher &pT){
    cout<<pT.age<<endl;
//    pT.age = 45;
}

void printT3(Teacher pT){
    cout<<pT.age<<endl;
    pT.age = 45;
}


int main()
{
    
//    Teacher t1;
//    t1.age = 35;
//    
//    printT1(&t1);
//    printT2(t1);//pT是t1的别名
//    printT3(t1);//pT是形参,t1 copy一份数据给pT // ----> pT = t1;
//    
//    printf("t1.age:%d \n",t1.age);
    
    
    const int c1 = 10;
    int  a = 10;
    int &b  = a;
    printf("&a:%d \n",&a);
    printf("&b:%d \n",&b); //a和b 都是同一块内存空间

    printf("sizeof(Teacher):%d \n",sizeof(Teacher));
    system("pause");
    return 1;
}


<C++>核心编程之引用与函数提高,剖析引用的本质和函数重载方法 🎉少年时代忧郁,是对整个宇宙的骄傲🎉 🎉写在前面 今天继续开始对C++核心编程知识的分享与系统讲解,第一,这里会提到“引用”方法传参以及剖析引用的本质;第二,我们对函数来一个提高,相当于进阶函数了,包括函数的默认值,简单的提一下函数的占位参数,函数重载以及注意事项,接下来上正文。 🎉目录 详解引用 引用的基本使用 引用做函数参数 引用做函数返回值 常量引用 引用的本质 函数提高 函数默认值 函数占位参数 函数重载及注意事项 详解引用 引用的基本使用 语法:数据类型 &am. 阅读详情

相关推荐

图像去畸变(相机成像、畸变模型)

首先通过上一步相机标定得到畸变参数和相机内参,同时,由于图像去畸变都是在归一化相机坐标系下进行的,而图像都是像素坐标,所以需要先通过相机内参矩阵将图片上的像素点从像素坐标系转变到归一化坐标系,再通过畸变参数在归一化坐标上进行去畸变的操作。由于畸变是发生在世界点通过透镜投影到相机坐标系这个过程中的,所以去畸变操作是在相机坐标系下进行的。(如图,Pd即为畸变后成像点)3.读取图像和各个参数,调用去畸变函数(opencv自带的cv.undistort函数),就可以完成对图像的去畸变处理,进而得到去畸变的图像。

lm5688jjupm1n28的博客 1051

C++ 引用的本质是什么?

结论: ①C++中的引用本质上是 一种被限制的指针(类似于线性表和栈,栈是被限制的线性表,底层实现相同,只不过逻辑上的用法不同而已)。 ②由于引用是被限制的指针,所以引用是占据内存的。 ③在使用高级语言的层面上,是没有提供访问引用的方法的。并且引用创建时必需初始化,创建后还不能修改。 下面是找到的相关资料,来证明以上结论。 ************************************************************************************

木牛的博客 3368

哨兵一号burst数据的下载和处理

在Sentinel - 1数据处理领域,其基本流程起始于从(ASF)下载原始压缩文件。这些文件规模颇为可观,常规大小约4GB,而部分数据的原文件甚至已攀升至7GB,对存储空间提出了严苛要求。从影像构成来看,每景Sentinel - 1影像由三个干涉宽幅(IW)模式子带组成,每个IW一般包含9个脉冲串(burst)。然而,在实际研究中,我们所关注的研究区域往往仅占据其中寥寥几个burst。

kangkangluoluo的博客 1965

C++ —— 理解引用及其原理

概念 引用的简单概念: 引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。 引用一般被使用做参数/返回值这样可以提高效率, 减少拷贝。 底层实现 在语言层面引用是一个对象的别名不占据空间, 但是实际上在底层的实现上引用是类似于指针实现的。 我们借助代码进行探索 int i=5; int &ri=i; ri=8; 通过:调试->窗口->反汇编 int i=5; 00A013DE mov dword

ifwecande的博客 1637

【操作系统】Hello CTF-专为CTF比赛封装的虚拟机 Beta版

很多师傅在学习与研究CTF的道路上,总是碰到想提升自我水平,但缺少本地化的训练环境以及安装各类软件的烦恼现象;因此拥有一些趁手“武器”,干起活来将会事半功倍。CTFos是探姬(ProbiusOfficial)专为CTF比赛封装的虚拟机,基于工具集封装多个版本和系统。CTF入门选手各行业网络/信息从业人员安全相关工作人员但不想在工作机上安装CTF一些奇葩的软件…该系统是通过虚拟机封装的,需要使用打开!一个专为CTF比赛封装的虚拟机,开箱即用。

qq_47493625的博客 1万+

MATLAB信号处理实战:VMD分解参数调优全指南(附避坑技巧)

本文深入探讨了MATLAB中变分模态分解(VMD)的核心参数调优实战技巧。针对模态数K和惩罚系数α的选择难题,提供了从经验估计、可视化观察到量化指标辅助的渐进式调优框架,并分享了避免过分解与欠分解的实用避坑指南,旨在帮助工程师高效处理非平稳信号,提取清晰的物理特征。

weixin_29079671的博客 145

C++ 引用本质

C++引用及其本质在C++中,引用是一项强大而灵活的特性,允许程序员通过引用访问和修改变量的值。本文将深入探讨C++引用的本质、用法、优势以及与指针的比较等方面。引用是C++中强大而灵活的特性,提供了一种直接而高效的方法来操作变量。通过引用,我们可以避免不必要的拷贝,简化代码结构,提高程序的效率。然而,在使用引用时需要注意生命周期和作用域,确保引用始终指向有效的对象。在适当的场景和使用情境下,引用是C++中不可或缺的一部分。

wuyiyu_的博客 549

HDRP shader 获取阴影(Custom Pass)

Unity:2021.3.0f1 HDRP:12.1.6

LanQ的博客 2099

C++中引用的本质分析

1,引用的意义: 1,引用作为变量别名而存在,因此在一些场合可以代替指针; 1,变量的另一个表现形式; 2,交换函数时,可代替指针; 2,引用相对于指针来说具有更好的可读性和实用性; 1,指针类似手动挡车,引用类似于自动挡车; 3,引用实现交换函数; 1,函数中的引用形参不需要进行初始化; 1,调用函数的时候才初始化; 2,const 引用: ...

weixin_45032957的博客 439

《21天学通C++》阶段性成果测试题——hstring(手写string类)

总体考察了类的使用,缓冲区考察了指针和数组的使用、增删改查、考察编码思维、考察了类的重载。1.初始化子字符串的起始位置为-1,表示未找到,若buffer或findHstring为空,则返回-1。右边的字符串不为空,则分别获取母串和子串的长度(用循环),然后创建一个固定大小的数组。3.然后循环遍历寻找子串在母串中的起始位置,循环时可以通过两个长度相减,避免循环越界。2.如都不为空,则分别获取双方的字符串长度(用循环),然后。右边的字符串为空,则输出原来的字符串。是否为空,有一方为空则返回另一方。

立志成为炼丹师? 1265

OpenClaw实战系列02:企业微信接入完全指南

本文详细介绍了如何将OpenClaw与企业微信对接,实现智能机器人功能。主要内容包括:企业微信侧创建智能机器人或自建应用,获取必要凭证和权限;OpenClaw侧安装配置企业微信插件,设置通信通道;完成双向验证并进行功能测试。文章提供了详细的配置步骤、常见问题排查方法和进阶玩法,帮助用户在30分钟内完成对接。关键点包括:确保URL可访问、Token一致、网关正常运行,以及针对不同部署环境(云服务器/内网)的配置差异。

PeterPan的博客 3814

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

Unity 工具 之 SoftMask软遮罩 实现 UI 边缘渐变过渡的简单使用介绍

目录Unity 工具 之 SoftMask软遮罩 实现 UI 边缘渐变过渡的简单使用介绍一、简单介绍二、Mask 实现的遮罩效果三、Soft Mask 实现遮罩效果四、 Soft Mask 的一些设置五、插件下载Unity 工具类,自己整理的一些游戏开发可能用到的模块,单独独立使用,方便游戏开发。

仙魁XAN 8575

深入浅出的剖析C++中引用的本质

深入浅出的分析引用有的来龙去脉,进而深入汇编语言探索引用的本质 目录 1、变量名的回顾 2、引用的本质 3、特殊的引用 - const引用 4、再谈引用的本质 5、深入汇编分析 6、指针变量的引用 7、其他注意事项 8、引用与函数 9、引用的意义 1、变量名的回顾 变量是一段连续存储空间的别名 程序中通过变量来申请并命名存储空间 通过变量的名字可以使用存储空间 问题:一段连续的存储空间只能有一个别名吗? 2、引用的本质 1、C++中做了一个升级,于是引用就出来了。引用可以看

木牛的博客 701

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

C++中引用和匿名对象的理解和本质剖析

大家对C++的引用应该都不陌生吧,抱着既要知其然,也要知其所以然的态度。下面将按照是什么?怎么用?为什么需要?本质剖析的流程来向大家一一描述。 引用是什么? 引用其实就是给变量起的一个别名,使用这个别名跟使用变量名没有区别。 那什么又是变量名呢? 变量名实质上是一段连续存储空间的别名,是一个标号(门牌号),编译器通过变量来申请并命名内存空间,程序员可以通过变量的名字可以使用存储空间。 也...

546

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

C++引用详解:从基本使用到本质剖析

摘要: C++引用是为变量创建别名的复合类型,与变量共享内存空间,必须初始化且不可重新绑定。相比指针,引用更安全简洁,不能为NULL或引用字面值(常量引用除外)。常用作函数参数实现传引用调用,避免对象拷贝并允许修改实参。函数返回引用时需确保不返回局部变量引用。底层实现上,引用类似自动解引用的常量指针。常量引用可绑定临时对象,广泛用于范围for循环和不修改参数的函数中。引用能提升效率、支持链式调用,是C++开发中的重要特性,需根据场景合理选用引用、指针或值传递。

weixin_70366898的博客 1452

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

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

【C++基础入门】4.C++中引用的本质深度剖析

一、引用的意义 引用作为变量别名而存在,因此在一些场合可以代替指针 引用相对于指针来说具有更好的可读性和实用性 下面通过代码来进行说明,在C语言中,可以这么写: #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(...

老胡的博客 849

C++-Record08—引用的基础及本质剖析

主要介绍引用的基础及本质剖析 ..

恋蛩音的博客 442

stdmove 跟 左键引用 区别_C++中引用和匿名对象的理解和本质剖析

大家对C++的引用应该都不陌生吧,抱着既要知其然,也要知其所以然的态度。下面将按照是什么?怎么用?为什么需要?本质剖析的流程来向大家一一描述。引用是什么?引用其实就是给变量起的一个别名,使用这个别名跟使用变量名没有区别。那什么又是变量名呢?变量名实质上是一段连续存储空间的别名,是一个标号(门牌号),编译器通过变量来申请并命名内存空间,程序员可以通过变量的名字可以使用存储空间。也可以这样理解,变量名...

weixin_39709674的博客 108

c语言引用作为函数参数,举例剖析C++中引用的本质及引用作函数参数的使用

引用的意义与本质1)引用作为其它变量的别名而存在,因此在一些场合可以代替指针2)引用相对于指针来说具有更好的可读性和实用性引用本质思考:思考、C++编译器背后做了什么工作?#include using namespace std;int main(){int a = 10;// 单独定义的引用时,必须初始化;说明很像一个常量int &b = a;// b是a的别名b = 11;cout &...

weixin_42641998的博客 2383

c语言中的匿名变量,C++中引用和匿名对象的理解和本质剖析

大家对C++的引用应该都不陌生吧,抱着既要知其然,也要知其所以然的态度。下面将按照是什么?怎么用?为什么需要?本质剖析的流程来想大家一一描述。引用时什么?引用其实就是给变量起的一个别名,使用这个别名跟使用变量名没有区别。那什么又是变量名呢?变量名实质上是一段连续存储空间的别名,是一个标号(门牌号),编译器通过变量来申请并命名内存空间,程序员可以通过变量的名字可以使用存储空间。也可以这样理解,变量名...

weixin_32698563的博客 1553

C++进阶剖析(二)之引用的本质分析和三目运算符

1.1 三目运算符 1.1.1 int main() { int a =1; int b =2; (a < b ? a:b) =3; //在c++中是成立的 printf("a= %d\n",a); printf("b= %d\n",b); return 0; } 1.1.2三目运算符在C语言和C++中的比较 在C语言中三目运算符只能作为右值使用 在C++中三目...

海是倒过来的天的博客 494
上一篇: Android关于SDCard存储
下一篇: 基于Linux虚拟镜像主机优化
linuxMinx
博客等级 码龄15年 195粉丝 79原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值