1.指针是保存内存地址的变量。 int *pAge=0; 值为零的指针被称为空指针。所有指针在定义时都应该被初始化。没有初始化的指针称为失控指针。 int age=50; pAge=&age; 以上是为指针赋值的完整过程。 2.对于变量,类型会告诉编译器需要多少存储器去装载。但对于指针,类型并不这样做,所有指针均是4个字节。 3.使用间接引用运算符(*)来引用指针。当一个指针被间接引用时,就读取其所保存的地址处的值。 4.指针有以下三种用途: i.处理自由存储区的数据; ii.访问类的成员数据和函数; iii.通过引用的方式向函数传递变量。 5.局部变量和函数形参位于栈中,寄存器则用于内存管理(如保存栈顶指针和指令指针),代码区位于代码区,全局变量区,其余的内存空间作为自由存储区,称为堆。 栈在函数返回时会自动清除。自由存储区在程序结束之前不会自动清除,所以在占用之后必须主动释放。 6.C++中使用关键字new来分配自由存储区中的内存。new的返回值是内存的地址,它必须被赋给一个指针。如: unsigned short *pPointer=new unsigned short; 当不在使用一块内存时,使用关键字delete,它的作用是释放内存。 7.内存泄漏。 指针本身是一个局部变量,当声明指针的函数返回时,指针的作用域也就结束了,因此被丢弃了。然而由new申请的内存不会自动释放,于是这块内存就不能被其他数据使用,这种情况就称为“内存泄漏”。因此要记得使用delete来释放内存。释放后最好将指针赋值为0,变为空指针。 另一种造成内存泄漏的情况是:在没有删除一个指针之前就对其重新赋值。如: unsigned short int *pPointer=new unsigned short int; *pPointer=72; pPointer=new unsigned short int; pPonter=84; 这时保存72的内存空间变得不可用,也没办法再去释放它。应该是再次使用时,先释放。 8.也可以在自由存储区内为类的对象分配内存。如: Cat *pCat=new Cat; 这条语句调用了默认构造函数(无参数的构造函数)。删除这类指针时,在内存释放之前会调用对象的析构函数。 也就是说,内存分配是在类对象的构造函数中进行的,而内存删除则是在类对象的析构函数中进行的。 9.每个类的成员都有一个隐藏的指针:this指针。该指针指向每一个单独的对象,它保存了对象的地址。 10.迷途指针(或称失控指针、悬浮指针):指对一个指针调用delete时(这样会释放它的内存)却并没有把它设置为空时产生的。若此时并没有重新赋值就试图再次调用它时,就会引起不可预料的结果。 好的解决办法是在删除一个指针后,把它设置为空指针(0)。 11.在指针的类型之前和之后可以使用关键字const,也可以在这两个位置上同时使用。 const int *pOne; int * const pTwo; const int * const pThree; pOne是一个指向整型常量的指针,该指针指向的值是不能被改变的。 pTwo也是一个指向整型的常指针,它指向的整数可以改变,但这个指针不能指向其他变量。 pThree是一个指向整型常量的指针,它指向的值不能被改变,也不能指向其他变量。 保持正确的窍门是观察关键字的右边是什么,如果是类型,那么值就是常量,如果是变量名,那么指针变量本身就是常量。 12.一个指针可以与另一个指针相减。

评论