【学习笔记】指针

2019-10-12  本文已影响0人  Lilium94

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; 
}

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

auto_ptr<double> pd(new double);
unique_ptr<double> pdu(new double);
shared_ptr<string> pss(new string);

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

上一篇下一篇

猜你喜欢

热点阅读