正文

《指针》学习笔记2006-10-12 21:39:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/colormoon/19260.html

分享到:

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.一个指针可以与另一个指针相减。

阅读(3217) | 评论(2)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册