zoukankan      html  css  js  c++  java
  • C++ 指针

    C++ 指针

      简单记录下平时的学习中涉及到指针的注意点,其中有转别人的内容,自己再慢慢添加总结。

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

    13.对内存操作的考查主要集中在:
      (1)指针的理解;
      (2)变量的生存期及作用范围;
      (3)良好的动态内存申请和释放习惯。
    14       0xC0000005: Access Violation

       内存访问错误。应该是访问了不该访问的地方,可能是使用“野指针”访问造成的。比如访问一个已经释放了堆空间,或者退出函数后使用指向堆栈空间中变量的指针,声明了一个指针变量,然后没有new就进行使用。这种致命的问题一定要仔细解决彻底,不留后患。

  • 相关阅读:
    解决:Google代码achartengine曲线代码报错问题(转)
    操作SQLite数据库
    让服务器iis支持.apk文件下载的设置方法
    怎么在手机上查看sqlite db
    Android 3D滑动菜单完全解析,实现推拉门式的立体特效
    android自动更新程序,安装完以后就什么都没有了,没有出现安装成功的界面的问题
    那些年不错的Android开源项目
    PL/SQL Developer 连接新数据库
    Oracle 连接 Visual Studio 的工具
    利用SQLiteOpenHelper来管理SQLite数据库 (转)
  • 原文地址:https://www.cnblogs.com/kongtiao/p/2528313.html
Copyright © 2011-2022 走看看