C++指针解读(1)-- 什么是指针

Google C++Style Guide【C++编程风格指南解读】——C++特性 非常重要的一节,让你的代码有明显的美观可读改善! 1:所有按引用传递的参数必须加上 const. 解读:函数传入的参数若想修改,则传入方式可以是指针或引用, 输入参数是值参或 const 引用, 输出参数为指针. 输入参数可以是 const 指针, 但决不能是非 const 的引用参数,除非用于交换,比如 swap(). 好处:定义引用参数防止出现 (*pval)++ 这样丑陋的代码 阅读详情

变量的内存地址叫指针,存放指针的变量叫指针变量。估计不少人会混淆这2个概念,而且有的书籍资料把“指针变量”称为“指针”。

1、数据的存储方式

程序中的数据都会占用一块内存空间,不同数据类型占用的内存大小不同。比如char、bool是1个字节、short是2个字节、int是4个字节等。

内存是有地址的,计算机是通过内存地址来访问的。在计算机中,1个地址代表1个字节。我们常说的8位、16位、32位、64位,指的是地址的长度。即地址有几个bit位。

比如:

(1)8位机表示地址长度是8个bit,2进制的11111111转成16进制是FF,所以地址范围是0x00 -- 0xFF。这样就有256个地址,即内存的大小是256个字节。

(2)32位机表示地址长度是32个bit,所以地址范围是0x0000 0000 - 0XFFFF FFFF。有2^32个地址,即内存的大小是4G。

假设现在定义了2个变量:int i, int j,因为每个变量占4个字节内存,则这2个变量在内存中的位置大概是像下面这样的。

2、数据的读取方式

知道了变量的地址和变量的类型后,就可以这样访问变量int i了:

(1)先找到存放变量的首地址,比如0x0000 0001;

(2)从这个地址开始取4个字节的数据。

我们可以用代码来演示一下:

class A {
public:
    int i = 11;
};
int main()
{
    A a;
    int* i = (int*)&a;

    printf(" 变量i的值: %d\n", *i);

    return 0;
}

我们先用&a取到了对象a的首地址,根据C++对象模型我们知道这个首地址也是变量i的首地址,所以从这个地址开始取int类型长度的数据就是变量i的值。

通过地址我们能找到所需的变量,也可以说地址“指向”该变量。因此,这个地址也被称为指针,即英文pointer。所以我们在C++中所说的指针其实是一个地址。

指针也需要有地方存储,这个存储指针的变量就叫指针变量,即存储指针的变量。

cppcheck 1.50 高效C/C++静态代码分析工具实战指南 上述命令启用常用检查模块,扫描src/目录下所有C/C++文件,输出潜在问题列表。工具开源性检测精度集成难度典型应用场景cppcheck✅ 开源中高低CI/CD、代码审查✅ 开源高中深度分析、安全关键系统Coverity❌ 商业极高高航空航天、金融级代码审计cppcheck广泛应用于嵌入式系统、车载软件及大型基础设施项目中,用于预防运行时崩溃、提升代码健壮性。 阅读详情

相关推荐

从零开始:在Ubuntu 22.04上配置Isaac Gym Preview 3环境(含常见错误解决方案)

本文提供了在Ubuntu 22.04系统上从零开始配置Isaac Gym Preview 3环境的完整实战指南。内容涵盖NVIDIA驱动安装、Conda环境搭建、CUDA与PyTorch版本精准匹配、Isaac Gym核心安装与验证,并重点介绍了针对四足机器人等复杂系统的强化学习训练环境配置、常见错误解决方案及性能调优技巧,旨在帮助开发者高效部署这一高性能物理仿真平台。

weixin_29048775的博客 392

参诸文籍, 带你深入理解C/C++复杂指针声明

大家是不是曾经遇到像int * (* (*fp1) (int) ) [10];一样的复杂指针声明? 是不是看着这种声明表达式就头晕? 本文将结合C/C++运算符优先级和右左原则(即, The Right-Left Rule)引导你逐步理解C/C++的复杂指针声明.

Noah Miller原创 1608

保姆级教程:在STM32CubeIDE上快速部署micro_ros到STM32F407(附常见问题解决)

本文提供了一份详细的保姆级教程,指导开发者如何在STM32CubeIDE上快速部署micro_ros到STM32F407微控制器。内容涵盖从Windows与Ubuntu双环境搭建、micro-ROS静态库编译、STM32CubeIDE工程深度集成,到串口通信联调与常见问题解决的完整流程,旨在帮助读者构建稳定可靠的ROS2与嵌入式设备通信系统。

o4p5q6r7s的博客 324

C++ primer(第五版) 中的2.5.1的指针、常量和类型变量名的解读

上述两条声明语句的基本数据类型都是const pstring,和过去一样,const是对给指定类型修饰,pstring实际上是指向char的指针,因此,const pstring就是指向char的常量指针,而非指向常量字符的指针。再次强调一遍:这种理解是错误的。声明语句用到的pstring时,其基本数据类型是指针。可使用char*重写了声明语句后,数据类型变为char, *成为声明的一部分。

wangdaima的博客 576

瑞芯微RK3506开发板DSM音频开发避坑指南:从硬件改接到内核配置全流程

本文详细解析了在瑞芯微RK3506开发板上进行DSM音频开发的完整流程与关键避坑点。内容涵盖从硬件改造(如电阻焊接)、内核驱动配置(DTS参数、补丁应用)到系统调试与波形分析的全过程,旨在帮助嵌入式开发者高效实现高信噪比、低成本的音频方案,避免常见错误。

weixin_29164091的博客 408

Xilinx SDK调试与FPGA硬件验证全流程解析

本文详细解析了从Vivado导出硬件到Xilinx SDK进行调试与FPGA硬件验证的全流程。重点阐述了正确导出包含bitstream的硬件平台、创建合适的SDK工程、配置Debug会话以编程FPGA,并介绍了串口验证、自定义IP测试以及使用ILA进行软硬件联合调试的高级技巧,帮助开发者高效完成FPGA系统的软硬件协同开发与问题排查。

weixin_28327051的博客 311

传递指向指针的引用

//swap values of two pointers to in void ptrswap(int *&v1, int *&v2) { int *temp = v2; v2 = v1; v1 = temp; }   关键是 int *&v1 的解读。== v1是一个引用,指针的引用,也就是说,这是传递进来指针的别名。 转载于:https...

weixin_30617737的博客 77

DMA+Timer 生成 PWM 波形错位问题分析与解决

本文深入分析了DMA与Timer协同生成PWM波形时出现的错位问题,揭示了DMA传输启动时机与定时器溢出中断的微妙关系。通过占空比强制清零法和预装载值调校技巧,提供了有效的解决方案,并总结了PWM+DMA配置的最佳实践,帮助开发者避免类似问题。

weixin_29191081的博客 348

char*类型指针转换为int*类型指针

#include "iostream" using namespace std; void main(void) { char str[] = "1234567890"; int* p = (int*)str; cout << *(p + 1) << endl; /*结果为943142453,转换为int类型指针 + 1跳过四个字节,解指针时当作整形数据读取ASCII码, 先存5,后存8,因此读取时先读8的ASCII码(00111000),后...

a_wwwwei的博客 5592

Flutter热更新实战:Shorebird从安装到发布补丁的完整流程(含iOS/Android差异解析)

本文详细介绍了Flutter热更新工具Shorebird的完整使用流程,包括安装、发布补丁及iOS/Android平台差异解析。Shorebird作为Flutter官方未提供的Code Push解决方案,能快速修复线上问题,支持合规性保障和性能优化,特别适合紧急修复场景。文章还涵盖了国内CDN加速配置和最佳实践,帮助开发者高效实现热更新。

butter的博客 1078

Proxmox VE安装卡顿深度解析:显卡驱动与BIOS设置的黄金法则

本文深度解析Proxmox VE安装卡顿的根本原因,指出显卡驱动与BIOS设置是两大关键因素。文章详细阐述了如何通过添加`nomodeset`内核参数解决显卡兼容性问题,并提供了针对不同主板品牌的BIOS显卡优先级设置黄金法则。同时,还分享了从预处理到高级调试的完整实战排查流程,帮助用户从源头杜绝安装卡顿,确保PVE系统顺利部署。

weixin_29278805的博客 472

指针阅读技巧分析

下面的标识符代表什么含义? 指针阅读技巧解析 右左法则 从最里层的圆括号中未定义的标识符看起 首选往右看,再往左看 遇到圆括号或方括号时可以确定部分类型,并调转方向 重复2,3步骤,直到阅读结束 int (*p)(int) ==>p为指针,指向函数,指向的函数有一个int参数,返回值为int int (*p1)(int*, int (*f)(int*)) ==>p1为指针,指向函数,指向的函数有int*,f为第二个参数,它是函数指针,指向的函数参数时int*,返回值是int;返回值为int

weixin_46571142的博客 1058

UNet改进(47):Deformable Convolution在UNet中的集成与应用

本文提出了一种可变形U-Net(DeformableUNet)结构,通过在U-Net的双卷积模块中集成可变形卷积(DeformConv2d)来提升模型对物体形变和复杂结构的建模能力。传统卷积受限于固定感受野,而可变形卷积通过动态调整采样位置,能更好地适应不规则形状。实现中,在DoubleConv模块的第二个卷积层替换为可变形卷积,同时保持第一层为标准卷积以确保稳定性。实验表明,该方法在保持参数量基本不变的情况下,显著提升了分割精度(mIoU从0.712提升到0.743)。

2501_91516851的博客 202

如何解释复杂的 C/C++ 声明

如何解释复杂的 C/C++ 声明 文章目录如何解释复杂的 C/C++ 声明序1. 基础2. const修饰符3. typedef的微妙之处4. 函数指针5 左右法则6. 推荐阅读 我想很多人曾经遇到过像 int * (*fp1) (int) [10] 这样的声明;或者你无法理解的类似的东西?本文将教您解释如此复杂的 C/C++声明,包括使用打字、const 和函数指头。 序 你是否曾经遇到过类似。int * (* (*fp1) (int) ) [10];的语句而无法理解呢?这篇文章将教你解释C/C++宣言,

liming0931的专栏 834

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

C语言sb代码,复杂的C语言标志

曾经碰到过让你迷惑不解、类似于int * (* (*fp1) (int) ) [10];这样的变量声明吗?本文将由易到难,一步一步教会你如何理解这种复杂的C/C++声明:我们将从每天都能碰到的较简单的声明入手,然后逐步加入const修饰符和typedef,还有函数指针,最后介绍一个能够让你准确地理解任何C/C++声明的“右左法则”。需要强调一下的是,复杂的C/C++声明并不是好的编程风格;我这里仅...

weixin_34634720的博客 15万+

深度学习工具包 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++高频面试题

1:std的list. vector. map. set区别 我的答案:list基于链表, vector是数组, map红黑树(平衡二叉树), 这颗树具有对数据自动排序的功能, set也是红黑树(平衡二叉树), vector随机访问效率高, 对插入和删除效率较低, list基于链表自然对插入和删除效率高, 随机访问效率不高(需要遍历), map/set基于平衡二叉树, 是排序号的接口, 对插入和删除的效率高, 查询效率高. map是k,v 答案:map红黑树(平衡二叉树), 这颗树具有对数据自动排序的功能,

yuyixiong的博客 734

继承的访问权限

继承的访问权限很特别,这里总结两点。 一、private继承的对象不能赋予基类指针 class Base { public: virtual void f(){cout << "Base:f()" << endl;} private: int a; }; class Derived:private Base { public: void f(){cout << "Deriv

pyjfoot的专栏 759

2021-07-20

复杂声明解读: int * (*(*p)[10]) (void); 解读办法:先找标识符(这里是p),然后找包含p的小括号,再看与p近的中括号,最后看与p近的*号。先处理小括号里的,看到中括号就是数组,看到*号就是指针。 (1)在纸上写下:“p是” (2)包含p的最内层小括号是(*p),括号里是*p,写下:“p是一个指针,指向” (3)把(*p)忽略掉,下一个括号是(*[10]),先看中括号,写下:“p是一个指针,指向一个有10个元素的数组,每个元素为” (4)再看*号,写下: “p是一个指针,指向一个.

snail_Dao的博客 144

对数组取地址

看下面一段代码 int a[]={1,2,3,4}; int *ptr=(int*)(&a+1); cout <<*(ptr-1)<<endl; 输出为4,这里&a是 int[4]*类型的,所以+1相当于地址加sizeof(int[4]), 总结,对于指针T* p,加1相等于地址加sizeof(T),所以关键...

weixin_34186950的博客 595

第17周项目1-体会函数参数的传递

问题及代码: /* *Copyright(c)2014,烟台大学计算学院 *All rights reserved. *文件名称:test.cpp *作者:陈银丽 *完成日期:2014年12月22日 *版本号:v1.0 * *问题描述:阅读下面的程序,写出期望的运行结果。 *输入描述: *程序输出: */ #include using namespace std; void fun1(int

CKL1029的专栏 779

CMU-15445project0(仅自己记录留念)

PUT函数我觉得是最难的,因为要考虑值节点的与非值节点的变化,还有就是每一次的put都是在新的trie中进行,也就是要每遍历一个节点,都需要对该节点进行深拷贝,clone之后,也必须确保该节点与父节点的连接,另外对于空trie,第一次插入时,需要创造根节点等,思路不难,就是实现的时候,bug很多,需要不断的修改,加上c++能力薄弱,实现起来更加吃力。:dynamic_pointer_cast适用于智能指针类型,如std::shared_ptr和std::weak_ptr,用于进行智能指针的动态类型转换。

qq_58887972的博客 3329

面试题

void *(*(*fp1)(int))[10]; //fp1是一个指针,指向一个函数,这个函数的参数为int型,返回值为指针,这个指针指向一个数组,这个数组有10个元素,每个元素是一个void*的指针

程序猿成长之路 504

c语言字符串接口实现,使用C语言实现字符串中子字符串的替换 描述:编写一个字符串替换函数,如函数名为 strReplace(char* strSrc_题来了...

#includeusing namespace std;void strReplace1(char* strSrc, char* strFind, char*strReplace){if(strSrc==NULL||strFind==NULL||strReplace==NULL)return;char *replace=strReplace;char *find = strFind;w...

weixin_35335035的博客 1095

第六周项目一—深复制体验(1)

(1)阅读下面的程序,补足未完成的注释 /* Copyright (c) 2014, 烟台大学计算机学院 * All rights reserved. * 文件名称:test.cpp * 作者:陈丹妮 * 完成日期:2015年 4 月 14 日 * 版 本 号:v1.0 */ #include #include using namespace std; class

nufangdongde的专栏 593

C++ this指针 具体解析

为什么需要this指针 在C++中每个新生成的对象都有一个地址,比如我们用下面方法来生成的对象,food3表示指向该对象的地址,而this的含义和food3是一样的,都是一个指向对象的地址。 stock* food3 = new stock("wang3",1,2); food3->OutPut(); 比如在一个类中,有一个比较函数名字叫做topval它比较一个输入的类的total_val值和该类自身的tatal_val值,并返回数值较大的那个数的对象指针,我们可以清晰的知道,如果输入的Stock

weixin_41785349的博客 183

C++指针解读

一、概念:指针与引用 程序中的所有变量与函数都存放到内存中,C++提供了指针对它们在内存中的地址进行访问。指针的功能强大,操作灵活,还能提高程序的运行效率。相对地,对内存操作是一把双刃剑,如果处理不当,将会造成程序的崩溃。引用则是变量的别名,它们使用同一块地址。 整型变量i和j在内存中存储 1.指针的声明 声明指针的一般形式如下: 数据类型标识符 *指针变量名 ...

gangganggood的专栏 1559
上一篇: C++对象模型(8)-- 数据语义学:this指针
下一篇: C++指针解读(2)-- 指针变量
老蔡编程
博客等级 码龄23年 48粉丝 75原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值