1.指针和引用的区别
(1)非空的区别。引用不能为空。
(2)可修改区别。引用一旦被初始化,就会一直指向初始化的对象。
(3)合法性区别。在编程时,使用指针之前应该检测其是否为空值。
(4)应用区别。指针多用于可能会不指向任何对象的情况
2.函数指针
int (*(* f)(int int)(int));//f是一个函数指针,它指向参数是两个int的函数,该函数的返回值是另一个函数,即函数2,函数2的参数是int,返回值是int
3.指针数组和数组指针
int (* ptr)[];//是一个指向整型数组的指针
int * ptr [];//是指针数组
int * (ptr []);//同上
int ptr[];//是一个普通的数组
4.迷途指针
当delete一个指针后,而没有将其设为空值,实际上仅仅是编译器释放内存,但指针依然指向原来的空间,导致不可预测的错误。
5.
malloc/free是库函数,new 和delete是操作符。都可以用来动态地申请和释放内存。对象需要在创建和销毁之时执行构造函数和析构函数,库函数不再编译器控制权限之内,不能完成这样的工作。所以需要new/delete
6.智能指针
auto_ptr<T>ptr(new T);
auto_ptr放在容器里是不安全的
7.This指针
(1)this在成员函数的开始前构造,在成员的结束后清除。
(2)不占用对象的空间
(3)this因编译器不同而有不同的放置位置。可能是堆,栈,也可能是寄存器。
易错点:
int * p;
*p=5;//错误,没有分配内存
int *a;
int b=0;
int * c=&b;
*a=*c;//是拷贝而不是指向,系统在拷贝是临时给了个随机地址,函数结束后不收回,造成内存泄漏。
char c[]="hello world";//分配一个局部数组,对应内存中的栈,函数返回后不应该再访问;
char *c="hello world";//分配一个全局变量,但是是静态存储区
*c='t';//是会发生错误的