C++一些基本概念总结【面向过程篇】——指针

行为树基本概念与BehaviorTree.CPP库在C++的代码实现 文章介绍了行为树的基本概念以及介绍了MIT开源的行为树实现库——BehaviorTree.CPP的使用,包含部分C++的代码实现 阅读详情

(1)定义指针:存储类型名数据类型 *指针变量名(定义必须用*)

存储类型名:静态、栈、自动类型

数据类型:指针指向的数据类型。指针本身数据类型是unsigned long int(4位)。

如 int *p1、static int *p2、char *p3

指针变量是p而不是*p

通过指针给指向的变量赋值,如 int a=1,*pa=&a;  再赋值:*pa=2;(a变成2)


(2)指针初始化:存储类型数据类型 *指针名=初始地址值

最好初始化,哪怕初始化为空指针,如int *px=0;

使用前都必须赋值。

如 inta,*pa=&a 

or int a;      int*pa=&a;  

or int a,*pa;  pa=&a;

可以把一个已经初始化的指针赋给另一个

如 int n;  int*p1=&n;  int *p2=p1;

      px——指针变量,内容是目标的地址值

      *px——指针的目标变量,内容是数据

      &px——指针变量的存储地址

(3)指针的运算

指针加上或减去一个n没相当于指向前或者后方第n个数据的位置

如 p±n=(p)±n*sizeof(数据类型),单位是字节

 

px-py:两指针指向位置之间的数据个数,((px)-(py))/数据长度

px<py:px指向位置在py前方

px==0或px!=0判断指针是否为空指针


(4)void指针:空类型指针,不指定指针指向一个固定类型,仅仅用来存放地址

void *p

可以用任何类型的指针给void指针赋值

如:inta,*p=&a;  void *p1=p;

但是用void指针赋给别的指针,需要强制转换类型

如:int *p2=(int*)p1;


(5)const指针

const放在指针类型前:如const int *p,不能通过指针改变它指向的值,但指针可以指向其他数据

const放在*和指针名之间:如int * const p指针本身的值不可变,即指针不能指向其他数据,但它指向的数据的值可以改变

都加了:都不能改变,如const int *const p


(6)指针与数组

数组名和首地址:

一维数组如int a[10],数组名a表示该数组的首地址,即&a[0]

如 char a[10],*pa;  pa=a

or  int a[10]; int *pa=a;


二维数组如int a[2][3],a[0]表示第0行的首地址,即&a[0][0]


访问数组的方法:

下标法:a[i],a[i][j]

地址法:*(a+i),*(*(a+i)+j)

指针法:int a[10],*pa=a;  *(pa+i)就是a[i]


(7)数组指针与指针数组

数组指针:一个指向数组的指针变量

指向一维数组的指针变量:数据类型(*指针名)[常量表达式]

如int (*p)[2]定义一个指向2个元素的一维数组,用法如下

int a[2]={1,2}; 

int(*p)[2]=a;

cout<<*p[0];  //1

cout<<*(p[0]+1);  //2


指针数组:每一个元素都是指针变量,如

char *p[2]={"hello","hi"};

cout<<p[0];  //hello

cout<<p[1];  //hi


(8)指针与函数

指针作为函数参数,如

void swap(int *,int *)  //声明

void main()

{ 

    swap(&a,&b);

}


void swap(int *x,int *y)

{

    ......   //定义

}

对形参的改变会影响实参

指针型函数

函数的返回值是指针类型,数据类型 *函数名(参数表)

函数指针

数据类型 (*函数指针名)(参数表)

如 int (*p)(int,int)定义了一个函数指针p,指向一个返回值为整型,有两个整型参数的函数

给p赋值:p=fun1


(9)指向指针的指针

int i,*p=&i;

int **pp=&p;  //**表示二级指针,pp是指向指针p的指针

i=1;

i     //1

*p  //1

p   //a的地址

&p  //指针p的地址

*pp  //p的值,即a的地址

**pp  //相当于*p,即a的值1


C++学习篇——字符指针 #include<iostream> int main() { int number = 0; const char* s = "hello world!"; std::cout << "字符串首字母是" << "\"" << *s << "\"" << std::endl; std::cout << "字... 阅读详情

相关推荐

数据库崩溃恢复机制:REDO日志与UNDO日志详解

在数据库管理系统中,事务的持久性和一致性是至关重要的。为了保证在系统崩溃或发生故障时数据不会丢失,数据库引入了恢复机制。其中,REDO日志和UNDO日志是两种关键的恢复技术。本文将详细描述这两种日志的作用、工作原理以及它们在数据库崩溃恢复中的应用。

My_wife_QBL的博客 1410

【C/C++基础进阶系列】C/C++ 基础知识 -- C++ 面向过程新特性与关键知识点总结(二)

【C/C++基础进阶系列】C/C++ 基础知识 -- 函数式编程 【1】函数调用运算符与 function 类模板 【2】可调用对象 【3】lambda 表达式 参考致谢 本博客为博主学习笔记,同时参考了网上众博主的博文以及相关专业书籍,在此表示感谢,本文若存在不足之处,请批评指正。 【1】C++ 新经典 【2】C++11/14 高级编程 Boost 程序库探秘 ...

CopperSun 技术博客 393

Codesys.运动控制修改凸轮点

通过改凸轮曲线的主从轴缩放比例或者偏置。 新建多个凸轮曲线,对CAM曲线进行切换。 程序中动态修改,仅修改中间的关键点(凸轮末点修改or凸轮曲线运行中修改)。 程序中动态修改,修改首未关键点及关键点个数,需要重新触发MC_TableSelect。 使用程序新建凸轮表代码,实现电子凸轮基本运动。 我们讲的凸轮表切换、关键点修改、程序新建电子凸轮,这些方法没有本质区别,总之都是“趁曲线不注意,把凸轮表改了。

傻响雨 6828

C++面向过程 期末复习 重点总结

位、字节、字符 位(bit): 数据存储的最小单位。每个二进制数字0或者1就是1个位; 一个数字一位 2、字节(B): 8个位构成一个字节;即:1 byte (字节)= 8 bit(位); 1 KB = 1024 B(字节); 1 MB = 1024 KB; (2^10 B) 1 GB = 1024 MB; (2^20 B) 1 TB = 1024 GB; (2^30 B) 3、ASCII码字符集 (1)标准...

Lemon__Tree__的博客 259

2024年上半年网络工程师下午真题及答案解析

位于MPLS域边缘、连接其他网络的LSR称为( 3 ),区域内部的LSR称为核心LSR(CoreLSR)IP报文进入MPLS网络时,MPLS入口设备分析IP报文的内容并为其添加合适的标签,所有MPLS网络中的LSR根据标签转发数据,当该IP报文离开MPLS网络时,标签由出口LER弹出。LSP的出口LER称为( 6 )。某高校网络拓扑如下图所示,两校区核心(CORE-1、CORE-2),出口防火墙(NGFW-1、NGFW-2)通过校区间光缆互联,配置OSPF实现全校路由收敛,两校区相距40km。

bsefef的博客 2471

飞书云文档API操作详细介绍

开通云文档API、python程序调用飞书api、飞书获取app_id和app_secret、

Brother_ning的博客 1万+

2019.8.20C++基础学习笔记——智能指针

C++基础学习笔记——智能指针 在C++中动态分配内存可使用new和delete关键字,但是有时操作错误会导致内存泄漏,所以C++中开发了智能指针,智能指针的特点就是在使用后可以自己释放内存,避免内存泄漏的问题。 智能指针auto_ptr auto_ptr是在C++98中提出的智能指针概念,其本质是一个模板类,主要用于解决动态分配引起内存泄漏的问题。auto_ptr解决内存泄漏的方法是使用类的构造...

CQ的学习笔记 507

Dofbot机械臂从零部署笔记(1)——ROS之创建URDF模型、配置Moveit和MotionPlanning

Dofbot机械臂从零部署笔记(1)——ROS之创建URDF模型、配置Moveit和MotionPlanning

takedachia的博客 8697

C/C++指针的一些概念总结

什么是指针? 指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。就像其他变量或常量一样,必须在使用指针存储其他变量地址之前,对其进行声明。指针变量声明的一般形式为: type *var-name; type 是指针的基类型,它必须是一个有效的 数据类型,var-name 是指针变量的名称。用来声明指针的星号 * 与乘法中使用的星号是相同的。但是,在这个语句中,星号是用来指定一个变量是指针。以下是有效的指针声明: int *ip; /* 一个整型的指针 */ double *dp;

ouzhiqi9007的博客 447

泛微Ecology流程数据表结构解析:workflow_requestbase和workflow_currentoperator到底怎么关联查询?

本文深入解析泛微Ecology系统中workflow_requestbase和workflow_currentoperator表的结构与关联机制,提供SQL查询语句示例,帮助开发者高效查询流程数据。涵盖待办事项、已办事项、办结事项和流程监控等典型场景,并分享性能优化技巧和常见问题排查指南。

weixin_33738555的博客 807

LPDDR6 tdbR2dbR_L cross row技术探讨

LPDDR6 tdbR2dbR_L cross row技术探讨

zilan23的博客 47

C++中的指针概念梳理

在C++中指针通常难以理解,即使是有经验的程序员也常常因为调试指针引发的错误而备受折磨。笔者在学习C++时常常被指针弄得晕头转向,于是决定对指针的概念做一次梳理,希望本文能够对C++入门者有些许作用。 1.指针的概念 指针(pointer)是“指向(point to)”;另外一种数据类型的复合类型。与引用类似,指针也实现了对其他对象的间接访问。然而指针与引用又有区别。首先,指针本身是一个对象,即我们可以对指针进行赋值和拷贝,并且在指针的生命周期中可以先后指向几个不同的对象。其次,指针定义时不必赋值,此时指针

m0_46691785的博客 2447

《QGIS快速入门与应用基础》【专栏完整目录】

《QGIS快速入门与应用基础》第一卷专栏完整目录,覆盖 001–328 全部篇目与附录,逐篇可跳转。

LuckyHanMo的博客 1299

【C++初阶】三、类和对象(面向过程、class类、类的访问限定符和封装、类的实例化、类对象模型、this指针)

C++类和对象:面向过程和面向对象初步认识 ;类的引入 -- struct类 ;类的定义 -- class类 ;类的访问限定符和封装 ;类的实例化 ;类对象模型 ;this指针

正在努力学C呀!(要学好久呢......) 3342

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

深度学习工具包 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")

C++学习——指针篇

C语言C++指针

m0_73931287的博客 2536

计算机控制技术及应用

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

CPP指针深析

指针的强大功能伴随着复杂性和风险。通过反复实践和注重细节,可以掌握指针的精髓,写出高效可靠的C++代码。初学者特别要注意避免未定义行为,同时养成良好的编码习惯。

weixin_57165154的博客 1216

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

C++ —— 指针基本概念

C++ —— 指针基本概念

MaoSiri的博客 849

C/C++指针详解之基础篇

目录 一.变量的内存实质到 1.1变量的实质 1.2 赋值给变量 1.3 变量在哪里? 二. 指针是个什么东西?  三. 二级指针(指针的指针) 3.1 定义与初始化 3.2 间接数据访问 3.2.1 .改变一级指针指向 3.2.2 改变 N-1 级指针的指向...

Timeless小帅的博客 2334

C++ 指针

C++ 指针介绍 (对象指针 & this 指针)

我是小白呀的博客 8027

C++——面向过程

1. 数据类型 C++数据类型包括字符型(char)、宽字符型(wchar_t)、整型(int)、浮点型(float)、双浮点型(double)、布尔型(bool),操作系统会根据变量的数据类型来分配内存和决定再保留内存中存储什么。 基本类型可使用一个或多个类型修饰符:有符号型(signed)、无符号行(unsigned)、短(short)、长(long),具体存储数据范围如下: typedef typedef type newname; typedef int feet; feet distance;

Seven_Yang_C的博客 1915

c++ 打印指针地址_c++ c语言 指针基本概念

c语言9 - 指针基本概念指针: 地址,内存单元的编号。内存单元: 计算机中内存最小的存储单位,大小为一个字节,每个内存单元都有唯一的一个编号,称这个内存单元的编号为:“地址”。指针变量存指针地址的变量内存单元与地址关系如下代码可打印出变量的地址:#includeintmain(void){inta=10;printf("%p\n",&a);return0;}即...

weixin_39982452的博客 9496

C++指针

8、unique_ptr不是绝对安全,如果程序中调用exit()退出,全局的unique_ptr可以自动释放,但局部的unique_ptr无法释放。shared_ptr不是绝对安全,如果程序中调用exit()退出,全局的shared_ptr可以自动释放,但局部的shared_ptr无法释放。指针存放变量的地址,因此,指针名表示的是地址。多线程读写shared_ptr所指向的同一个对象,不管是相同的shared_ptr对象还是不同的shared_ptr对象,也需要加锁保护。堆是由C++函数库提供的。

qq_57290422的博客 1573

CPP指针

CPP指针

记录知识点的博客 2078

指针,引用基本概念——谭浩强 cpp

在程序中一般是通过变量名来对内存单元进行存取操作的。其实程序经过编译以后已经将变量名转换为变量的地址,对变量值的存取都是通过地址进行的。 直接存取方式,或直接访问方式:按变量地址存取变量值的方式 间接存取(间接访问):可以在程序中定义这样一种特殊的变量,它是专门用来存放地址的。 变量的指针:就是变量的地址。由于通过地址能找到所需的变量单元,因此可以说,地址指向该变量单元。因此将地址形象化地...

haiki66的博客 639

【C++篇】类与对象(上篇):从面向过程到面向对象的跨越

大家好,我是“我想吃余”,很高兴你能和我一起进入到C++的学习中,我会将我的学习过程中的宝贵经验不遗余力的输入到文章中,希望可以帮助到你的学习。本文涵盖了从面向过程与面向对象的区别,到类的定义、访问限定符、封装、作用域、实例化、对象大小计算,以及this指针等内容。// 类体:由成员函数和成员变量组成// 一定要注意后面的分号class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的。

Surplus886的博客 1070

【Cpp】指针与引用

在C语言中,我们对指针的规范并不严谨——我们常常会用void*来传入一个不知道其变量类型的指针,为了兼容CCpp允许这样的语法存在,但是,由于这样的指针不具有安全性,我们无法通过来解引用void*,这就需要用到我们的显式转换。为了方便看指针的引用而不是由一堆组成了参数和参数类型,我们采用引用来让这种写法变得更加简洁;

Mongxin_Chan的博客 1121
上一篇: C++一些基本概念总结【面向过程篇】——数组
下一篇: K-means聚类算法及其MATLAB实现
code_caq
博客等级 码龄11年 112粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值