转:简单类型指针的与复杂类型指针定义以及分配的问题

指针是体现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句。
 
//下面仅仅是定义一个类型,不会产生变量,所以不存在分配空间的问题
struct data
{
    int i;
    int j;
};

void main(void)
{
    struct data dat1; //定义一个struct data类型的变量,和int i同理。
    printf("%d\n", sizeof(struct data)); //8个字节
    printf("%d\n", sizeof(dat1));        //8个字节

    struct data* pdat1;//定义一个struct data类型的指针,和int *pi 同理。
    printf("%d\n", sizeof(pdat1));        //4个字节,就是一个指针的空间,pdat1并没有结构体变量的信息。

    pdat1 = (struct data*)malloc(sizeof(struct data)); //申请一个空间,把该空间地址给pdat1.
    printf("%d\n", sizeof(*pdat1));      //8个字节

    struct data dats1[2]; 
    printf("%d\n", sizeof(dats1));     //16个字节,两个data变量,不是data指针。
    dats1[0].i = 20;  //可以直接使用数组里面的结构体变量
    dats1[0].j = 30;
    
    struct data* dats2[2]; //指针数组,包含两个指针,而不是结构体变量
    printf("%d\n", sizeof(dats2));  //8个字节,两个指针的大小
    dats2[0]->i = 20; //错误!还没有给dats2[0] 指针分配空间
    dats2[0]->i = 20; //错误!还没有给dats2[0] 指针分配空间
    dats2[0] = (struct data*)malloc(sizeof(struct data)); //分配空间
    dats2[0]->i = 20; //ok
    dats2[0]->i = 20; //ok
 
    
}

本文转自:http://www.cppblog.com/hustsaser/articles/56432.htmlhttp://blog.csdn.net/yinidream/article/details/6761662

posted @ 2012-09-13 20:18  lscheng  阅读(1001)  评论(0编辑  收藏  举报