指针(一)

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的管辖范围不一样。

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

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

 

posted @ 2012-03-19 19:53  javaadu  阅读(91)  评论(0编辑  收藏  举报