这次肯定可以看懂C++智能指针,适合新手小白,C++内功修炼

C++之指针(简单易懂,非常详细) C++之指针(详细,简单易懂) 阅读详情

智能指针的本质

类。
智能指针就是一个类,当超出了类的作用域是,类会自动调用析构函数,析构函数会自动释放资源。

为什么要使用智能指针?

c++的内存管理是让很多人头疼的事,当我们写一个new语句时,一般就会立即把delete语句直接也写了,但是我们不能避免程序还未执行到delete时就跳转了或者在函数中没有执行到最后的delete语句就返回了,如果我们不在每一个可能跳转或者返回的语句前释放资源,就会造成内存泄露。使用智能指针可以很大程度上的避免这个问题,因为智能指针就是一个类,当超出了类的作用域是,类会自动调用析构函数,析构函数会自动释放资源。

智能指针的原理

智能指针是利用RAII或者“获取资源即初始化”思想来实现的。RAII的主要原则是为将任何堆分配资源的所有权提供给其析构函数包含用于删除或释放资源的代码以及任何相关清理代码的堆栈分配对象。也就是,利用C++对象生命周期的概念来控制程序的资源,确保资源能得到及时释放。
当然上述思想仅是基础,在此之上还需要添加诸多实现才能得到我们的智能指针。其中一种比较通用的技术是使用引用计数,将一个计数器与类指向的对象相关联,引用技术跟踪该类有多少个对象的指针指向同一对象。
比如常见的智能指针shared_ptr,多个指针共享一个引用计数器,其引用规则如下:
• 当一个shared_ptr被赋值或者拷贝构造给其他shared_ptr之时,共享引用计数器自增1。
• 当一个shared_ptr被析构或者被用于管理其他裸指针之时,共享引用计数器自减1。
• 当引用计数器为0时,也就是这是管理该指针的最后一个shared_ptr,此时会释放该指针指向的资源。
在RAII的基础上建立合适的引用计数规则,确保智能指针所指向的对象,总能得到正确的释放。

智能指针的类型

智能指针,类型上可以分为两类:
• 独占型:如std::unique_ptr,一份资源,仅能由一个std::unique_ptr对象管理;
• 共享型:如std::shared_ptr,一份资源,可以由多个std::shared_ptr对象共同管理,当没有std::shared_ptr对象指向这份的资源,资源才会被释放,即基于引用技术原理。
细分: auto_ptr, shared_ptr, weak_ptr, unique_ptr 其中后三个是c++11支持,并且第一个已经被c++11弃用。

auto_ptr

这个指针,现在已经被C++11标准所抛弃,是C++03的失败品。
auto_ptr的出现,主要是为了解决“被异常抛出时发生资源泄漏”的问题。即如果我们让资源在局部对象构造时分配,在局部对象 析构时释放。这样即使在函数执行过程时发生异常退出,也会因为异常能保证局部对象被析构从而保证资源被释放。auto_ptr就是基于这个理念而设计。

特点
  • 1.析构函数会删除它所拥有的对象,并且释放内存;auto_ptr析构的时候肯定会删除他所拥有的那个对象,所有我们就要注意了,一个萝卜一个坑,两个auto_ptr不能同时拥有同一个对象。像这样:
int* p = new int(0);
auto_ptr ap1(p);
auto_ptr ap2(p);

因为ap1与ap2都认为指针p是归它管的,在析构时都试图删除p, 两次删除同一个对象的行为在C++标准中是未定义的。所以我们必须防止这样使用auto_ptr.

  • 2.auto_ptr对指针完全占有,也就是说一个”裸“指针不能同时被两个以上的auto_ptr所拥有。 因此在拷贝构造与赋值时:

    • (1). 对智能指针进行赋值时,如ptest2 =ptest,ptest2会接管ptest原来的内存管理权,ptest会变为空指针,如果ptest2原来不为空,则它会释放原来的资源,基于这个原因,应该避免把auto_ptr放到容器中,因为算法对容器操作时,很难避免STL内部对容器实现了赋值传递操作,这样会使容器中很多元素被置为NULL。
缺陷

auto_ptr采用copy语义来转移指针资源,转移指针资源的所有权的同时将原指针置为NULL,这跟通常理解的copy行为是不一致的(不会修改原数据),而这样的行为在有些场合下不是我们希望看到的。

unique_ptr

unique_ptr是取代auto_ptr的产物,也是它的升级版。
unique_ptr 是一个独享所有权的智能指针,它提供了严格意义上的所有权,包括:

  1. 拥有它指向的对象
  2. 无法进行复制构造,无法进行复制赋值操作。即无法使两个unique_ptr指向同一个对象。但是可以进行移动构造和移动赋值操作
  3. 保存指向某个对象的指针,当它本身被删除释放的时候,会使用给定的删除器释放它指向的对象
功能

unique_ptr
可以实现如下功能:

  1. 为动态申请的内存提供异常安全
  2. 讲动态申请的内存所有权传递给某函数
  3. 从某个函数返回动态申请内存的所有权
  4. 在容器中保存指针
实验
#include<iostream>
#include<Windows.h>
#include<memory>
using namespace std;
class Test
{
public:
    Test(string s)
    {
        str = s;
        cout << "Test creat\n";
    }
    ~Test()
    {
        cout << "Test delete:" << str << endl;
    }
    string& getStr()
    {
        return str;
    }
    void setStr(string s)
    {
        str = s;
    }
    void print()
    {
        cout << str << endl;
    }
private:
    string str;
};
unique_ptr<Test> fun()
{
    return unique_ptr<Test>(new Test("789"));
}
int main()
{
    unique_ptr<Test> ptest(new Test("123"));
    unique_ptr<Test> ptest2(new Test("456"));
    ptest->print();
    ptest2 = std::move(ptest);//不能直接ptest2 = ptest
    if (ptest == NULL)
        cout << "ptest = NULL\n";
    Test* p = ptest2.release();
    p->print();
    ptest.reset(p);
    ptest->print();
    ptest2 = fun(); //这里可以用=,因为使用了移动构造函数    
    ptest2->print();
    return 0;
}

在这里插入图片描述

unique_ptr 和 auto_ptr用法很相似,不过不能使用两个智能指针赋值操作,应该使用std::move; 而且它可以直接用if(ptest == NULL)来判断是否空指针;release、get、reset等用法也和auto_ptr一致,使用函数的返回值赋值时,可以直接使用=, 这里使用c++11 的移动语义特性。另外注意的是当把它当做参数传递给函数时(使用值传递,应用传递时不用这样),传实参时也要使用std::move,比如foo(std::move(ptest))。它还增加了一个成员函数swap用于交换两个智能指针的值。

share_ptr

share_ptr是共享型智能指针。
资源可以被多个指针共享,它使用计数机制来表明资源被几个指针共享。可以通过成员函数use_count()来查看资源的所有者个数。
除了可以通过new来构造,还可以通过传入auto_ptr, unique_ptr,weak_ptr来构造。当我们调用release()时,当前指针会释放资源所有权,计数减一。当计数等于0时,资源会被释放。

成员函数

use_count 返回引用计数的个数
unique 返回是否是独占所有权( use_count 为 1)
swap 交换两个 shared_ptr 对象(即交换所拥有的对象)
reset 放弃内部对象的所有权或拥有对象的变更, 会引起原有对象的引用计数的减少
get 返回内部对象(指针), 由于已经重载了()方法, 因此和直接使用对象是一样的.
缺陷
share_ptr虽然已经很好用了,但是有一点share_ptr智能指针还是有内存泄露的情况,当两个对象相互使用一个shared_ptr成员变量指向对方,会造成循环引用,使引用计数失效,从而导致内存泄漏。

#include <iostream>  
using namespace std;  
#include <memory>  
  
class B;  
  
class A  
{  
public:  
    shared_ptr<B> ptrA_B;  
public:  
    A()  
    {  
        cout << "调用class A的默认构造函数" << endl;  
    }  
    ~A()  
    {  
        cout << "调用class A的析构函数" << endl;  
    }  
};  
  
class B  
{  
public:  
    shared_ptr<A> ptrB_A;  
public:  
    B()  
    {  
        cout << "调用class B的默认构造函数" << endl;  
    }  
    ~B()  
    {  
        cout << "调用class B的析构函数" << endl;  
    }  
};  
  
int main()  
{  
    shared_ptr<B> ptrB = make_shared<B>();  
    shared_ptr<A> ptrA = make_shared<A>();  
    ptrA->ptrA_B = ptrB;  
    ptrB->ptrB_A = ptrA;  
}  

在堆区中构建的class A和class B对象未析构,内存未被释放,这就造成了内存泄漏。
在这里插入图片描述

class A中包含着指向堆区构建的class B对象的引用计数指针,而class B中也包含着指向堆区构建的class A对象的引用计数指针,这样就构成了下面一个环形结构:
在这里插入图片描述

这样的话,对于class A对象来说,每当class A对象生命结束时,指向在堆区构建的class B对象的shared_ptr指针就会调用class B的析构函数结束class B对象的声明,但此时class B对象中也包含有指向“在堆区构架的class A对象”的shared_ptr指针,也得执行对class A对象的析构,如此往复进入了死循环。

实例
int main()
{
    string *s1 = new string("s1");
    shared_ptr<string> ps1(s1);
    shared_ptr<string> ps2;
    ps2 = ps1;
    cout << ps1.use_count()<<endl;  //2
    cout<<ps2.use_count()<<endl;    //2
    cout << ps1.unique()<<endl; //0
    string *s3 = new string("s3");
    shared_ptr<string> ps3(s3);
    cout << (ps1.get()) << endl;    //033AEB48
    cout << ps3.get() << endl;  //033B2C50
    swap(ps1, ps3); //交换所拥有的对象
    cout << (ps1.get())<<endl;  //033B2C50
    cout << ps3.get() << endl;  //033AEB48
    cout << ps1.use_count()<<endl;  //1
    cout << ps2.use_count() << endl;    //2
    ps2 = ps1;
    cout << ps1.use_count()<<endl;  //2
    cout << ps2.use_count() << endl;    //2
    ps1.reset();    //放弃ps1的拥有权,引用计数的减少
    cout << ps1.use_count()<<endl;  //0
    cout << ps2.use_count()<<endl;  //1
}

weak_ptr

weak_ptr是用来解决shared_ptr相互引用时的死锁问题,如果说两个shared_ptr相互引用,那么这两个指针的引用计数永远不可能下降为0,资源永远不会释放。它是对对象的一种弱引用,不会增加对象的引用计数,和shared_ptr之间可以相互转化,shared_ptr可以直接赋值给它,它可以通过调用lock函数来获得shared_ptr。

weak_ptr是什么

weak_ptr 是为了配合 shared_ptr 而引入的一种智能指针,它指向一个由 shared_ptr 管理的对象而不影响所指对象的生命周期,也就是将一个 weak_ptr 绑定到一个 shared_ptr 不会改变 shared_ptr 的引用计数。
不论是否有 weak_ptr 指向,一旦最后一个指向对象的 shared_ptr 被销毁,对象就会被释放。
从这个角度看,weak_ptr更像是shared_ptr的一个助手而不是智能指针。

weak_ptr如何使用

创建
创建一个 weak_ptr 指针,有以下 3 种方式:

  1. 可以创建一个空 weak_ptr 指针,例如:
 `std::weak_ptr<int> wp1;`
  1. 凭借已有的 weak_ptr 指针,可以创建一个新的 weak_ptr 指针,
    例如:
std::weak_ptr<int> wp2 (wp1);

若 wp1 为空指针,则 wp2 也为空指针;反之,如果 wp1 指向某一 shared_ptr 指针拥有的堆内存,则 wp2 也指向该块存储空间(可以访问,但无所有权)。

  1. weak_ptr 指针更常用于指向某一 shared_ptr 指针拥有的堆内存,因为在构建 weak_ptr
    指针对象时,可以利用已有的 shared_ptr 指针为其初始化。例如:
1. std::shared_ptr<int> sp (new int);
2. std::weak_ptr<int> wp3 (sp);

由此,wp3 指针和 sp 指针有相同的指针。再次强调,weak_ptr 类型指针不会导致堆内存空间的引用计数增加或减少。

weak_ptr模板类提供的成员方法

和 shared_ptr、unique_ptr 相比,weak_ptr 模板类提供的成员方法不多,表 1 罗列了常用的成员方法及各自的功能。
表 1 weak_ptr指针可调用的成员方法
在这里插入图片描述

再次强调,weak_ptr 模板类没有重载 * 和 -> 运算符,因此 weak_ptr 类型指针只能访问某一 shared_ptr 指针指向的堆内存空间,无法对其进行修改。

参考资料

【1】https://www.cnblogs.com/WindSun/p/11444429.html
【2】https://blog.youkuaiyun.com/weixin_45590473/article/details/113057545
【3】C++11 weak_ptr智能指针(一看即懂)http://c.biancheng.net/view/7918.html

小白进阶
大学生到工程师的打怪升级之路
持续更新

AI应用安全 - Prompt注入攻击 随着大模型的爆火,各行各业都在使用大模型进行智能化改造。但是如何做一个可靠的大模型应用,就需要考虑各种安全问题。本文主要介绍一种常见的安全问题,即prompt注入攻击,并介绍一些防范手段。Prompt Injection Attack(提示注入攻击)是针对大型语言模型(LLM)的一种新兴安全威胁,攻击者通过精心构造的输入提示(prompt)来操纵模型行为,使其产生非预期输出或执行恶意操作。它主要包括两种注入方式,一是直接注入,而是间接注入。 阅读详情

相关推荐

C#与Lua交互原理

以前每一次研究一些新知识并且有所收获的时候,都想写一篇博客来分享这种自己的收获。 一直没有写主要是因为自己水平太菜了,怕写出来贻笑大方,最近想通了,想写就写下来,就算对别人毫无用处,还可以自己没事翻翻,省得自己都忘了。当然如果能对你有一丝丝的帮助,那真是再好不过了 。本文将针对C#与Lua的调用原理阐述一些个人的心得 。 Lua开发环境搭建 有关于VS &amp...

Hui Ye的博客 1万+

智能指针与STL查漏补缺(1)

目录一、智能指针的本质原理1、为什么需要智能指针2、智能指针的本质工作原理3、智能指针演示代码实战4、总结二、auto_ptr的使用1、auto_ptr的常规使用2、auto_ptr的成员方法3、auto_ptr的弊端三、unique_ptr的使用之构造函数四、unique_ptr的其他成员详解1、修改器2、观察器3、元素访问4、非成员函数五、unique_ptr的对比和总结1、unique_ptr比auto_ptr的优势2、unique_ptr的不足和使用注意事项3、unique_ptr总结 一、智能指针

小嵌同学的博客 1061

安卓APP通过CH340实现USB串口通信与设备检测

本文详细介绍了安卓APP通过CH340芯片实现USB串口通信与设备检测的完整流程。从CH340芯片的基础原理到开发环境搭建,再到串口通信的具体实现和错误处理,提供了全面的技术指导。文章还分享了USB热插拔处理、自动重连策略以及性能优化等实战技巧,帮助开发者高效完成安卓与嵌入式设备的通信开发。

weixin_42531925的博客 381

智能指针的原理及实现

本质是利用对象的生命周期来管理资源(内存资源、文件描述符、文件、锁等)

huncho的博客 1389

Crush 终端 LLM 工具安装与使用指南:把 AI 编程助手装进你的命令行

喜欢命令行的开发者需要离线/轻量级 AI 助手的场景希望自定义模型与工具链的高级用户通过LSP + MCP + 多模型支持,Crush 不仅能写代码,还能理解项目、调用工具、连接服务,真正成为你的“终端编程搭档”。

weixin_44058951的博客 1616

ESP-IDF的安装及其在VScode中编译环境的搭建

从安装目录的\Espressif\frameworks\esp-idf-v5.3.2\examples路径中拷贝一个工程到项目中,比如拷贝\get-started下的hello_world文件夹。安装时可能会遇到如下问题,提示:"e:\ssc\software\ESP-IDF\v5.3.2\Espressif\tools\idf-python\3.11.2\python.exe -m pip" is not valid. (ERROR_INVALID_PIP)接着等待安装完成即可,其他步骤同方式1。

Freddy_Ssc的博客 4373

c++指针最全总结(附源码和详细总结)

哈喽,我又来啦😄 hello😄 我是「 YR_T 」 众所周知 c++相对于其它语言的 优势就在与c++有「 指针 」 可能你之前有学习过指针 可是 你真的把指针彻底搞懂了吗🤔 如果还没有,那再来复习一下💡 ...

我的博客 2万+

深入解析DMR协议中的4-CPFSK调制技术与实现

本文深入解析了DMR协议中采用的4-CPFSK调制技术。该技术凭借其连续相位、恒包络的特性,在有限的12.5kHz信道带宽内实现了稳健的通信,有效对抗干扰并提升功放效率,是DMR数字对讲机清晰、稳定通信的核心保障。文章详细阐述了其原理、实现细节及在协议栈中的协同作用。

weixin_29306875的博客 230

【c++】指针

目录 1.1指针的基本概念 1.2指针变量的定义和使用 1.3指针所占内存空间 1.4空指针和野指针 1.5const修饰指针 1.6指针和数组 1.7指针和函数 1.8指针、数组、函数 1.1指针的基本概念 作用:可以通过指针间接访问内存 1.2指针变量的定义和使用 1.定义指针 语法:数据类型 *指针变量名;eg:int *p; 让指针记录变量a的地址 p=&a; 2.使用指针 可以通过解引用(指针前面加个*)的方式来找到指针指...

m0_58454229的博客 8883

C#对接EtherNet/IP协议 完整版|罗克韦尔AB PLC通信+CIP核心概念全解析

你做罗克韦尔(AB) PLC工业上位机开发,是唯一的首选协议,没有之一!EtherNet/IP(Ethernet Industrial Protocol)是基于标准以太网的工业级通信协议,由罗克韦尔自动化主导开发,是ODVA(开放设备网络供应商协会)主推的工业以太网标准,也是目前全球应用最广泛的工业以太网协议之一。原生适配罗克韦尔AB PLC:Micro800、CompactLogix、ControlLogix、Micro850等全系AB PLC原生标配EtherNet/IP,无需额外配置,开箱即用;

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 895

stable diffusioncontrolNet 预处理器/模型的下载及安装使用教程

首先说明,controlNet 的模型 不同于stable diffusion 模型,这一点一定要区分清楚。下面提供多个ControlNet 预处理器+ 专用模型的百度网盘下载链接,都是由群友整理贡献,但各自包含的版本不同,大家可自行选择。推荐下载紫色链接内的模型,fp16版文件更小,稍微新一些的controlnet插件还添加了对control-lora的支持(注意,要求controlnet插件的版本比12月16号新(1.1.423以上)才能正常识别),推荐下载;

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 3388

C++内存操作与MVP架构:从memcpy原理到项目实战

内存操作是C/C++编程的核心基础,理解内存函数如memcpy、memmove的工作原理,能帮助开发者编写更高效、安全的底层代码。这些函数通过直接操作内存地址和字节数,实现数据的快速复制、移动和比较,其性能优化涉及对齐访问、SIMD指令等底层机制。在软件工程实践中,良好的架构设计同样至关重要,MVP(Model-View-Presenter)模式通过分离业务逻辑、数据模型和界面展示,提升了代码的可测试性和可维护性。本文将memcpy等内存函数与MVP架构结合,探讨在C++项目中如何兼顾底层性能与上层设计,实

weixin_30680385的博客 413

safetymonitorapi

Summary of SA8653 Safety Monitor API Introduction This document details Safety Monitor APIs for the SA8653 QNNX platform, covering dual interfaces of APSS and SAIL. It defines core data structures and enumerations for subsystems, fault severity and health

qq_39257814的博客 1591

【C++基础】10. 指针

指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。不同数据类型的指针都是一个代表内存地址的长的十六进制数。唯一的不同是,指针所指向的变量或常量的数据类型不同。指针变量声明的一般形式为:type 是指针的基类型,它必须是一个有效的 C++ 数据类型;用来声明指针的星号 * 与乘法中使用的星号是相同的,但在这个语句中,星号用来指定一个变量是指针;var-name 是指针变量的名称。实例:有效的指针声明:int *ip;/* 一个整型的指针 */double *dp;

普罗米修斯的博客 3416

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

假人有限元模型

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

C++指针(pointer)

C++指针(pointer) 在计算机科学中,指针(Pointer),是编程语言中的一类数据类型及其对象或变量,用来表示或存储一个存储器地址,这个地址的值直接指向(points to)存在该地址的对象的值。 指针的概念 指针(pointer)是一个特殊的变量,它里面存储的数值被解释为内存里的一个地址。 指针是操作系统内存的重要途径。指针的值是指针本身存储的数值,这个值将被编译器当作一个地址,而不是一个一般的数值。指针所指向的内存区就是从指针的值所代表的那个内存地址开始的,长度为sizeo..

cnds123的专栏 1万+

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

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

C++指针详解(附难点易错点解析及注意事项)

本文系统地讲解了C/C++中指针的概念、使用及注意事项。首先,介绍了内存的分区(栈区、堆区、全局/静态存储区、常量存储区)及其特点。接着,详细解释了指针的定义、创建与释放、取址符和解引用符的使用,并通过代码示例展示了指针的操作和常见错误。文章还指出了指针的难点,如多级指针、数组与指针的关系、函数与指针的结合等,并列举了易错点,如野指针、悬垂指针、内存泄漏等。最后,提出了使用指针时的注意事项,如初始化指针、避免解引用空指针、使用智能指针等,以帮助读者更好地掌握指针的使用。

Xcq20230729的博客 1734

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

最详细的讲解C++中指针的使用方法(通俗易懂)

指针的定义与使用 函数的缺陷:一个函数只能返回一个值,就算我们在函数里面写多了return语句,但是只要执行任何一条return语句,整个函数调用就结束了。 数组可以帮助我们返回多个值,但是数组是相同数据类型的结合,对于不同数据类型则不能使用数组 使用指针可以有效解决这个问题,使用指针我们想反回几个值就能返回几个值,想返回什么类型就可以返回什么类型的值。 在程序设计过程中,存入数据还是取出数据都需要与内存单元打交道,计算机通过地址编码来表示内存单元。指针类型就是未了处理计算机地址数据的,计算机将内存

galaxyrt的博客 6万+

C++ 指针大全:从基础到进阶,一篇快速上手!

指针是 C++ 中最强大但也最具挑战性的特性之一。它直接操作内存地址,赋予了程序员极高的灵活性和控制力,但也带来了内存泄漏、悬垂指针等风险。无论是初学者还是资深开发者,理解指针的核心概念和应用场景都是掌握 C++ 的关键。 本文将带你从 **基础概念** 到 **进阶应用**,全面解析 C++ 中指针的使用场景,并结合现代 C++ 的最佳实践,帮助你高效、安全地使用指针。

m0_59246703的博客 2641

C++中的 指针

C++中的指针

qq_24472227的博客 1765

C++中的指针详解

在这个例子中,swap函数通过指针参数接收两个整数的地址,并交换它们所指向的内存地址中的值。指针是一个变量,它存储的是另一个变量的内存地址,而不是值本身。需要注意的是,在进行指针运算时要确保指针的合法性和有效性,避免出现越界访问等问题。在这个例子中,p是一个指向整数的指针变量,它存储的是变量num的内存地址。这里的“数据类型”表示指针所指向的变量的类型,“*”表示这是一个指针变量,“指针变量名”是我们给指针变量取的名字。在这个例子中,*p表示指针p所指向的内存地址中的值,即变量num的值。

yuxingwu9872的博客 4658

笔记

笔记 自用

qq_40709990的博客 670

C++指针(超详解)

指针的定义使用符号,表示指针类型。你可以通过运算符获取变量的地址。int a = 10;//定义一个整型变量//定义一个整型指针,指向变量a的地址其中int*的作用是声明一个指向整型(int)的指针,p是指针变量,&是取地址符,所以,上述代码的意思是将整型变量a的地址用取出赋值给指针变量p。int a = 10;//打印p指向的地址空间return 0;指针数组:是一个数组,每个元素都是一个指针。示例中ptrArr是一个包含3个指针的数组。数组指针:是一个指针,它指向一个数组。示例中。

qq_51753728的博客 4491

c++ 指针详解

使用指针遍历数组 ;指针的概念与理解; 指针的含义;指针的创建与初始化 ;指针的基本操作;指针的解引用和取地址;指针的算数操作 ;指针相减 ;const指针;指向const的指针;指针的数组和数组的指针;数组的指针地址;指针的指针;const_cast ;reinterpret_cast;

m0_62870588的博客 4万+

C++中的指针

指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。 本质上, 指针和普通的变量没有什么区别, 只是它的值稍微特殊一点, 是一个地址, 通过这个地址我们就可以访问到实际的值。 **指针即地址,指针即地址, 指针即地址**, 记住这句话, 就能非常容易理解指针。 ...............

1374

c++指针详解

第二,它是一个指针,该指针的类型是TYPE*,该指针指向的类型是TYPE,也就是数组单元的类型,该指针指向的内存区就是数组第0号单元,该指针自己占有单独的内存区,注意它和数组第0号单元占据的内存区是不同的。&a的运算结果是一个指针,指针的类型是a的类型加个*,指针所指向的类型是a的类型,指针所指向的地址嘛,那就是a的地址。"的第一个字符的地址,即'H'的地址。要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区。

浪子回头 1767

C++指针详解

指针是啥 众所周知,你在程序中向计算机申请一个变量(如int a),计算机会分配给你的变量一个空间。用int a举例子,计算机就给你了一个名叫a的房子,只能在里面放int类型的值。当然,你可以直接写a=10,这样计算机会帮你找到名叫a的房子,把10放进去。 那么这个房子在哪呢?就有了地址,每个变量都会有一个地址(即它在内存中的位置),指针,便是一根棍子,指着这个位置...

and1403的博客 384
上一篇: 学习C++不能不看的RAII机制,C++内功修炼!
下一篇: C++内功修炼干货,进大厂必须会的C++左值与右值,最适合小白看的文章!
CodeBowl
博客等级 码龄5年 7664粉丝 67原创
评论 42
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值