本帖最后由 slowgrace 于 2009-09-19 11:02:59 编辑

解决方案 »

  1.   

    *(void**)pDst = (void*)pSrc
    对这类的转换比较迷糊,大概是这样的:(void*)pSrc是将pSrc转换为void类型的指针。
    *(void**)pDst,先是(void**)pDst,然后再对(void**)pDst做取值运算。(void**)pDst也是将pDst转换为void类型的二级指针,在VB里你可以把(void**)pDst考虑成字符串指针。对字符串指针求值就得到了字符串数据的真实地址。
      

  2.   

    在C/C++中 void* 代表任意类型指针, void** 代表指针的指针,也可以理解为指向指针的指针。 你这段代码的实际意思是为 拷贝或者转换指针地址的意思。用实际C++ 代码可以还原出这段代码的意思。 int a = 100;
    int b = 200;
    int c =0;void *pv = (void*)&a; // p = a 的指针
    void **ppv = &pv;     // ppv = a 的指针地址
    c = *(*ppv) ;   // c=100, 
    int *p1 = &b;  // p1 = b的指针*ppv = (void*)p1 ; // 这时 ppv = b的指针的地址 等同 *(void**)ppv = (void*)p1;
    c = *(*ppv) ;  // c = 200
      

  3.   

    **是传说中的“指针的指针”,即该指针变量中所保存的内容是另一个指针。理解的时候,可以先抛开括号中用于表示强制类型转换的内容,单独这样看*pDst = pSrc。*(void**)pDst = (void*)pSrc             ||
                 ||
                 \/       
          
    *(类型2)pDst = (类型1)pSrc             ||
                 ||
                 \/       
          
    *(指向“void类型指针”的指针)pDst = (void类型指针)pSrc             ||
                 ||
                 \/       将“指针pSrc的值”保存到“指针pDst所指向的内存区域”中,因为pDst是指针,而*pDst中保存的内容也是一个指针,因此pDst的类型就是指针的指针,即void**
      

  4.   

    谢谢豆子,明白了。同一内容发了两个帖,有点晕。想起来那个同时和两个世界冠军下象棋的ANYWAY,你们就不能回一下那边的帖子么?我连续回复3次不能发言了。
      

  5.   


    谢谢胡侃的详细解释,用这个思路来理解问题挺好的。不过,有一点我好像和你理解的不一样:int b=200;/****你的理解****/
    int *p1 = &b; //(void *)b 相当于先用这个语句得到一个整型指针
    (void *)p1    //再将这个整型指针转化为void *指针/****我的理解****/
    int *p1 = b; //(void *)b 相当于先用这个语句得到一个整型指针
    (void *)p1    //再将这个整型指针转化为void *指针
    其实也就是这个帖子10楼的疑问。如果pSrc是long型变量,那(void*)pSrc是表示下面哪个意思: (1)把pSrc的值当做一个指针。该指针的内存地址等于pSrc的值 
    (2)还是把pSrc的地址取出来当做一个指针?该指针的内存地址等于pSrc的地址。我觉得是(1),你觉得是(2)。
      

  6.   

    19楼的代码用错语法高亮了,重贴一下。int b=200;/****你的理解****/
    int *p1 = &b; //(void *)b 相当于先用这个语句得到一个整型指针
    (void *)p1    //再将这个整型指针转化为void *指针/****我的理解****/
    int *p1 = b; //(void *)b 相当于先用这个语句得到一个整型指针
    (void *)p1    //再将这个整型指针转化为void *指针