《21天学会C++》第8章阐述指针学习笔记

1、C++一个强大而低级的工具是,可以使用指针来直接操纵计算机内存,这也是C++相对于JAVA、C#和Visual Basic等语言的优点之一。

2、什么是指针?指针是存储内存地址的变量。

3、能够使用指针以及在底层操纵内存是C++被选择用于编写嵌入式和实时应用程序的原因之一。

4、指针定义的时候一定要初始化,没有被初始化的指针被称为失控指针,是很危险的。 int *pAge=0; pAge被初始化为0,值为0的指针被称为空指针。

5、指针和数组名:在C++中,数组名是一个常量指针,指向数组的第一个元素。例如 int Number [5];Number 就是一个指向数组Number第一个元素Number[0]的指针,因而 Number+4 是一种访问Number[4]的合法方式。

6、数组指针和指针数组:

                 int NumbersOne[500];

                 int *NumbersTwo[500];

                 int *NumbersThree=new int[500];

其中:NumbersOne是一个包含500个int对象的数组,NumbersTwo是一个包含有500个int指针的数组,NumbersThree是一个指针,指向一个包含500个int对象的数组。

7、什么时候使用指针:指针常被用于完成以下3种任务,①管理自由存储区域的数据②访问类的成员数据和函数③按引用传递参数(指针传递变量被称为按引用传递)

8、桟和自由存储区(堆):5个内存区域:全局变量空间、代码空间、堆栈、寄存器、自由存储区(堆)

全局变量位于全局名称空间中,代码位于代码空间中,局部变量和函数参数位于堆栈中,寄存器用于内部管理工作,比如记录桟顶指针和指令指针,余下的所有内存都被作为自由存储区,通常被称为堆。

9、自由存储区的优点是:您从中分配的内存将一直可用,直到您明确指出不再需要—将其释放。如果在函数中分配自由存储区域的内存,在函数返回后该内存仍然可用。

这也是自由存储区的缺点:如果您忘了释放内存,那么被占据而没有使用的内存讲随着时间的积累越来越多,导致系统崩溃。

为什么采用这种内存访问方式而不是全局变量的优点是,只有能够访问指针的函数才能够访问它指向的数据。这样,只有将包含指针的对象或指针本身传递给函数,函数才能修改指针指向的数据,从而减少了使用全局变量时函数能够修改数据而又无法跟踪变更的情况发生。

10、如何分配自由存储区域的内存:在C++中,使用关键字new来分配自由存储区域的内存,比如在自由存储区域中创建一个unsigned short变量,可以这么做:

    unsigned short  int * pPointer; pPointer =new unsigned short int;

这样就开辟了一个空间了,pPointer将指向一自由存储区域中的一个unsigner short int,可以将一个值赋给它指向的内存区域:*pPointer =72;

new的返回值是一个地址,所以要把new的返回值赋给一个指针。

使用关键字delete归还内存:

使用new分配的内存不会被自动释放,为了防止内存泄露,要用关键字将分配的内存归还给只有存储区域。如:delete pPointer;删除指针时实际上是释放了起地址存储在指针中的内存,相当于把指针指向的内存归还给了自由存储区域,该指针依然存在,还可以重新赋值。

11、内存泄露:内存泄漏也称作“存储渗漏”,用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元。直到程序结束。(其实说白了就是该内存空间使用完毕之后未回收)即所谓内存泄漏。

再谈内存泄露:还有一种可能导致内存泄露的严重情形是,重新给指针赋值之前没有释放它原来指向的内存。

1 unsignede short int* pPointer=new unsignerd short int;
2 *pPointer=72;
3 pPointer=new unsigned short int;//这一行会导致内存泄露
4 *pPointer=84;

第3行,4行将导致内存泄露,因为第3行之后原来的内存块(存储的值为72)将不可用,因为指向该内存块的指针已经在第三行被重新赋值,现在无法访问原来存储72的那个内存块了,在程序结束前也无法将其释放,因而造成内存泄露。

添加一行释放指针的代码就好了。

 unsignede short int* pPointer=new unsignerd short int;
*pPointer=72;
delete pPointer;//释放原来指向的内存块
pPointer=new unsigned short int;
 *pPointer=84;

注意:程序中的每个new 都应该有对应的delete。

12、在自由存储区域上创建对象:

就像可以创建指向整形的指针一样,也可以创建指向任何数据类型(包括类)的指针。例如,有一个Cat类,则可以声明一个指向Cat类的指针,并在自由存储区域中实例化一个Cat对象:

Cat *pCat= new Cat;

13、迷途指针:将delete用于指针(从而释放它指向的内存),然后并没有将它设置为空时会引发迷途指针,造成不可预料的后果。

所以delete用于指针后往往要将其设置为0(空指针)。

即:  Cat *pCat =new Cat;

        delete pcat;

        pCat=0;.//delete用于指针后往往要将其设置为0(空指针)

14、使用Const指针:声明指针时,可以在类型前或后使用关键字const,也可以在这两个位置都使用:
const int *pOne;

int *const pTwo;

const int* const pThree;

①pOne是一个只想整形变量的指针,它指向的值是不能修改的。

②pTwo是一个指向整型的变量指针,它指向的值可以修改,但是pTwo不能指向其他变量。

pThree 是一个指向整型常量的常量指针,它指向的值不能修改,且这个指针也不能只想其他变量。

记忆技巧:const右边是类型,则值是常量;const 右边是指针变量,则指针本身是常量,不能指向其他变量。



原文地址:https://www.cnblogs.com/xiaobailongvictory/p/4700501.html