CoGetClassObject(CLSID_AdExten, CLSCTX_SERVER, NULL, IID_IClassFactory, (void**)&m_pFactory); CoGetClassObject(CLSID_AdExten, CLSCTX_SERVER, NULL, IID_IClassFactory, (void*)m_pFactory); --------------------------------------1 请教为什么要使用二级指针?2 上面两种方式有什么不同?3 刚注册没分,明天我加上100分,谢谢各位帮助

解决方案 »

  1.   

    第一个函数,指针的内容不用你分配,你可以把m_pFactory = NULL的指针地址传给函数,函数帮你分配内容,你只要用就好
    第二个函数,指针的内容你必须先分配好,函数只帮你填充指出指向的内容说白了就是第一个函数返回的是指针
      

  2.   

    因为那个参数是一个输出参数。
    一般情况下,要输出一个int型的值,可以用int*来指定一个位置让被调函数写入值。
    现在是要返回一个指针,同上理,这个参数就用了指针的指针。
      

  3.   

    对于函数参数,一级指针只能修改指针指向的内容
    而第一种情况,需要修改指针本身,所以函数参数就需要使用二级指针,这样就可以在函数里把这个指针指向一个需要的Factory指针...
      

  4.   

    如果我们想在另外的一个程序中改变某个指针的值,则必须用二级指针实现.其实指针作为函数的参数时,只需要遵循一个原则就可以.即:一定要传递你要操作的对象的地址. void getMemory(char *p, int num) 
        { 
           *p = (char *) malloc(num); 
        } 
        int main(int argc, char **argv) 
        { 
           char *str = NULL; 
           getMemory(&str, 100); 
           strcpy(str, "hello!"); 
           puts(str); 
            
           exit(0); 
        } 
       
           
        因为我们想动态申请空间,并把申请的空间的地址赋值给主程序中的指针变量,主程序必须传递该指针的地址(即二级指针).之所以要如此,是由于C语言参数的传递是按值的.即形参是一个临时变量,我们不能通过改变形参的值达到改变实参的值的目的.这其实跟我们在C语言课中强调的传值还是传指针是一个道理. 
         
        让我们来分析一下上面的程序.在子程序中,我们想改变的是主程序中指针的值,也就是100(假设是这样)处的内存地址中的值.那么,我们在子程序中就应该操作的是地址100.子程序中我们的指针变量p假设在内存的150处,则150处的值是主程序中的str指针的地址100.也就是p=100. 而*p = ?就是直接改变100处的值.看明白了没有!     也许你会说,如果形参声明为char * p, *p不也是直接操作地址为100处的值吗?这个问题问的非常的好,刚开始我也不是很明白,总觉得是一样的道理.但是当我在调试上面的程序时才使我恍然大悟,原来如此. 哈哈!  
        从数字上来说,他们的确是一样的,但是他们的类型不一样啊. 
         
        char *p;   //*p的类型为字符串,当然p的值也是100 
        *p = (char *) malloc(num);  
        这种情况编译都不会通过,左右类型不匹配.     char **p; //*p类型仍然是指针 
        *p = (char *) malloc(num); 
        左右都是指针类型,这才是正确的     为了在子程序中实现修改指针本身的值,对形参*一次之后必须仍为指针变量.所以需要用二级指针.     几级指针其实不是问题的关键,重点是类型匹配问题.类型将告诉编译器该类型所占据的字节数. 
         
    二级指针具有一定的优越性,特别在地址读写中