• 指针(一)


    1、指针的本质:地址。指针是一个变量,一般4个字节大小,这个变量的value是一个内存地址。

    2、指针的类型:

    从语法的角度看,你只要把指针声明语句里的指针名字去掉,剩下
    的部分就是这个指针的类型。这是指针本身所具有的类型。让我们看看例一中各个指针的
    类型: 

    (1)int *ptr; //指针的类型是int * 

    (2)char *ptr; //指针的类型是char * 

    (3)int **ptr; //指针的类型是 int ** 

    (4)int (*ptr)[3]; //指针的类型是int(*)[3] 

    (5)int *(*ptr)[4]; //指针的类型是 int*(*)[4] 


    怎么样?找出指针的类型的方法是不是很简单?

    3、野指针、空指针、迷途指针(这些统统是指针悬挂的几种情况)

    (1)野指针:指针的值是不可控的。即指针指向了一块非法的内存空间,谁也不知道它指向哪里。野指针会引起程序崩溃,灰常可怕

    如何避免野指针:释放一个指针指向的内存空间,立马要赋值为NULL。

    (2)空指针:标准定义了NULL指针,它作为一个特殊的指针变量,表示不指向任何东西。大多数机型,内存是从1开始的,NULL就是0值,表示内存的0号编码。

    如何避免空指针错误:在使用指针之前,一个要检验它是否为空,即检验是否已经分配内存空间。

    例子:http://blog.csdn.net/duqi_2009/article/details/7360514

    (3)迷途指针:如果在使用指针过程中对指针进行了拷贝,然后其中一个拷贝被删除,则另外一个拷贝就成了悬挂指针

     char* g_pBuffer =(char*)0;
     int   g_nSize   =0;
     voidInitBuffer(int size,char * pBuffer)
     {
     
     if((char*)0 != g_pBuffer)
      {
     
      delete [] g_pBuffer;
     
      }
     g_nSize = size;
     g_pBuffer = pBuffer;
     
     }
     
     voidDumpBuffer()
     {
     
     if((char*)0 == g_pBuffer)
      {
     
      InitBuffer(100);
     
      }
     CFile file;
      file.Open(filename,CFile::modeWrite);
     file.WriteHuge(g_pBuffer,g_nSize);
     
     }
     
     voidUseBuffer()
     {
     
     char * pBuffer = new char[100];
     InitBuffer(100,pBuffer);
      delete[]pBuffer;
     DumpBuffer();
     
     }

    关注蓝色代码,在InitBuffer之后,pBuffer立刻被删除,而此时g_pBuffer还保存这个指针的一个备份,这个备份就成为一个悬挂的指针。因此在保存备份的时候一定要小心,否则就会出问题。

    4、指针辖域和指针移动

    int a ;int *p = &a;

    int b[20]; int *q = b;
    p和q的管辖范围不一样。

    指针是拥有自己的管辖范围的。

    指针必须在管辖范围内移动,否则指针越界。也是一个错误。

  • 相关阅读:
    ModuleNotFoundError: No module named 'pip'
    ModuleNotFoundError: No module named 'pandas'
    linux 中 tar.xz文件的解压
    centos7 中bamtools软件的安装
    centos 7 中 bash: pip: command not found...
    AttributeError: module 'importlib._bootstrap_external' has no attribute '_w_long'
    File "/bin/yum", line 30 except KeyboardInterrupt,
    ImportError: No module named Bio
    File "/usr/libexec/urlgrabberextdown", line 28 except OSError, e:
    ModuleNotFoundError: No module named '_sqlite3'
  • 原文地址:https://www.cnblogs.com/javaadu/p/11742718.html
Copyright © 2020-2023  润新知