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


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

  • 相关阅读:
    兼容ie6浏览器窗口四角固定背景代码
    实用的js判断浏览器类型及版本
    测试
    C#动态获取鼠标位置的颜色
    对指定的网页进行截图
    C#中使用 SendMessage 向非顶端窗体发送组合键
    ProtelDXP练习作品51单片机最小系统
    对非顶端窗口截图
    C#直接操作并口
    单片机实现的数字钟
  • 原文地址:https://www.cnblogs.com/lscheng/p/2683928.html
Copyright © 2020-2023  润新知