指针(一)
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的管辖范围不一样。
指针是拥有自己的管辖范围的。
指针必须在管辖范围内移动,否则指针越界。也是一个错误。