指针是体现C语言强大功能的灵魂,很多人对指针的用法总是很模糊,特别是什么时候该对指针分配空间,什么时候只需要定义下就行了。本文以一个小例子说明与指针有关的声明,定义,以及分配的问题。
1.简单指针类型
我们以char* 为例,在程序中我定义一个char*型指针pString;
char* pString = NULL;
pString = "yes, pString";
printf(pString);
程序输出结果:yes, pString
然后我们定义另外一个char*型指针并给它分配空间,并初始化;
char* qString = new char[6];
qString = "yes, qString" //这里,读者可能会想到越界了!
printf(qString);
程序输出结果:yes, qString
究竟出现了什么呢,我们对qString只分配了6字节的空间,为什么程序编译时不报错,且运行结果就是我们初始化qString的字符串。原因是qString在第二条语句执行后其值发生了变化,系统对qString进行了重新空间分配,导致qString的值发生了变化,即qString不再指向6字节空间,而是成为了初始化字符串的首地址。
以上,我们可以看出,对char*型指针,其空间的分配可以看作是系统自动完成的,读者不必关心。
2.稍复杂指针类型
我们以一个结构体指针为例来说明,在程序中我们定义一个结构体,并定义一个指向该结构体的指针;
typedef struct LNode
{
int data;
struct LNode* pNext;
}dataNode, *dataList;
dataList pData;
pData->data = 10;
pData->pNext = NULL;
程序只是一个简单的初始化工作,有没有问题呢。编译通过,但运行时就会产生异常。原因就是我们并没有对pData分配空间,在未对该指针分配空间前,该指针并没有实质性的内容所指向,这时,你不能对其任何成员赋值,否则就会产生异常。把dataList pData;这一句用dataList pData = new pData;替换就可以了。
总结,其实我们有很多学C++的同学们经常遇到这样的问题,我们定义一个类,然后定义一个指向该类对象的指针。
class myClass
{
.
.
}
myClass* pMyClass; //1
myClass* qMyClass = new myClass; //2
如果你的程序编译通过,但运行时指针产生异常越界等问题,你是否该考虑一下用1句还是2句。