美文网首页
【学习笔记】指针

【学习笔记】指针

作者: Lilium94 | 来源:发表于2019-10-12 15:30 被阅读0次

    1. 概述

    2. 指针和引用的区别

    通过下面一段代码可以清楚看出指针和引用的区别:

    #include <iostream>
    using namespace std;
    
    int main() {
    
        int num = 222;
        int *pnum = &num;
        int &rnum = num;
        cout<<"&num: "<<&num<<endl;
        cout<<"&pnum: "<<&pnum<<endl;
        cout<<"pnum: "<<pnum<<endl;
        cout<<"&rnum: "<<&rnum<<endl;
    
        return 0;
    }
    

    Result:
    &num: 0x7ffee152bac8
    &pnum: 0x7ffee152bac0
    pnum: 0x7ffee152bac8
    &rnum: 0x7ffee152bac8

    这说明引用只是给变量取了一个别名,他们本质上是一样的。而指针本身是一个变量,编译时会分配内存,指针的值就是它指向的变量的地址。

    3. 常量指针和指针常量

    常量指针:指向常量的指针,*号在const后面,指针所指的值不变。
    指针常量:指针本身是一个常量,*号在const前面,指针指向的地址不可以改变。

    int num1 = 111;
    int num2 = 222;
    const int *cpnum = &num1; //常量指针
    int * const pcnum = &num1; //指针常量
    *cpnum = 222 //错误,不能修改指针所指的值
    pcnum = &num2; //错误,不能修改指针常量所指的地址
    cpnum = &num2; //OK
    *pcnum = 555; //OK
    

    4. 一级指针和二级指针

    5. 指针传参

    6. 函数指针

    7. 智能指针

    定义

    智能指针是一个表现像指针但是有很多额外特性的类。普通指针的问题是即使程序员记得删除申请的空间,也有可能造成内存泄漏的情况(更何况忘记的情况呢)。见下面的代码段:

    void remodel(std::string & str) {
        std::string * ps = new std::string(str); 
        ...
        if (weird_thing())
        throw exception(); //如果这时抛出异常,那么ps所指向的空间则无法被释放。
        str = *ps;
        delete ps;
        return; 
    }
    

    这时,我们就可以用智能指针来解决这个问题。
    智能指针:

    • C++98 solution: auto_ptr,不允许指针共享object,后赋值指针会抢夺object的所有权,原指针则变成野指针。
    • C++11 solution: 废弃了auto_ptr,新增了以下两种方案。
      • unique_ptr:只允许指向一个object ,编译器不允许指针指向同一块内存,所以它比auto_ptr更安全。
      • shared_ptr:通过reference counter可以处理多个指针指向同一对象的情况。
    • weak_ptr (暂不讨论)
      那么如何创建一个智能指针的实例呢:
      首先,要加上头文件#include <memory>
    auto_ptr<double> pd(new double);
    unique_ptr<double> pdu(new double);
    shared_ptr<string> pss(new string);
    

    智能指针系统自动回收分配的资源,无需手动写delete来回收。
    普通指针和智能指针之间只允许显示转换。

    相关文章

      网友评论

          本文标题:【学习笔记】指针

          本文链接:https://www.haomeiwen.com/subject/iqjjoqtx.html