1. 概述
2. 指针和引用的区别
通过下面一段代码可以清楚看出指针和引用的区别:
#include <iostream>
using namespace std;
int main() {
int num = 222;
int *pnum = #
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来回收。
普通指针和智能指针之间只允许显示转换。
网友评论