指针是体现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句。