c++学习笔记-------《c++自学通》第九章 指针

来源:互联网 发布:知乎 围棋打谱pc软件 编辑:程序博客网 时间:2024/05/21 18:00

1.一个指针也是一个变量,只不过它保存的内容是另一块内存空间的地址。所有的指针在说明时都应该初始化为某些值,如果不知道要赋什么值,应该置为0。一个被置为0的指针为空指针,一个没有进行初始化的指针被称为失控指针

 

2.目标访问运算符“*”也叫间接访问运算符,当一个指针被间接引用,将读取它所指向的内存中的数据

 

3.指针通常的用处:

  ①访问位于自由存储区内的数据:通常开辟一个自由存储区的时候,用一个指针指向开辟的空间,紧接着要判断是否分配成功,因为有时候在内存紧张的时候,会分配失败。

  ②访问类的成员数据和函数:可以不定义一个类的对象,而是定义一个指向这个类的指针,通过成员指针运算符“->”访问类中的公共的成员

  ③通过引用传递的方式给函数传递变量:当需要在被调用函数中就改变数据的值的话,就要用到引用传递了,引用传递有两种方法,一直是利用指针,一种是利用引用

 

4.通常程序员要管理内存中的五个区域:

  ①全局变量区:

  ②自由存储区:也叫做堆,要想利用者部分的区域,必须用new运算符开辟。后把开辟的内存空间的地址交给一个指针,再进行是否分配成功的判断

  ③寄存器:用于一些内部处理,如保存栈顶指针,指令指针等,一般用户访问不到

  ④代码区:程序代码运行的区域

  ⑤栈:局部变量和函数形参位于栈中

局部变量的问题是他们的寿命是有限的,当函数返回后他们就消失了,而全局变量的缺陷是在程序中访问他们不受限制,代码难以理解和维护,所以把数据保存在自由存储区可以解决这两个问题。自由存储区在程序结束之前都不会被清除,所以在占用一块自由存储空间之后将它释放是程序员的责任

 

5.new返回值是一个内存地址,它必须被赋予一个指针,内存空间是有限的,如果new无法再自由存储区中分配新的内存空间,它将返回null,也就是空指针,所以每次新申请的内存空间都要检查返回值是否为null

 

6.当使用delete删除一个指针的时候,其实是释放这个指针指向的内存空间,将这块空间交还给自由存储区,而这个指针本身还存在,可以对他进行重新赋值。对delet过一次的指针再次使用delete可能会使程序崩溃,所以当删除一个指针之后,应把它置为0,即空指针,后再删除,而删除一个空指针是安全的

 

7.当一个程序结束时,在这个程序中开辟的自由存储区内的内存会自动释放,但是在一个函数结束的时候则不会这样,即使new是为于这个函数内部

 

8.内存丢失:在没有删除一个指针前又将这个指针指向了另一个新开辟的位于自由存储区内的内存空间,则第一块空间由于没有释放,而且没有指针指向它而导致无法再次使用

 

9.可以定义一个常量指针,const要紧跟指针名,它一旦指向了一个对象就不能改变

   也可以定义一个指向常量的指针,const放在声明语句的最前面,它的意思是,指针不允许改变它所指向的对象的值(因为这个对象被说明为常量)

 

10.内存的动态分配与静态分配

内存的静态分配和动态分配的区别主要是两个:

        一是时间不同。静态分配发生在程序编译和连接的时候。动态分配则发生在程序调入和执行的时候。

      二是空间不同。堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配由函数malloc进行分配。不过栈的动态分配和堆不同,他的动态分配是由编译器进行释放,无需我们手工实现。