(BYTE*)p+m_nNextOffset是一个一级指针,但是我们知道它是指向的这个地址是放着一个指针(这个指针指向下一个节点)的,(void**)((BYTE*)p+m_nNextOffset) 是指向节点指针的指针;通过两次星号运算得到节点;&((BYTE*)p+m_nNextOffset) 就是另外一种情况了;
(BYTE*)p+m_nNextOffset的值表示的是一个地址;但是本身却是一个相加的结果(即是一个表达式);
我们是不能对一个表达式去取地址的;

解决方案 »

  1.   

    在MFC中出现: 
    void** CSimpleList::GetNextPtr(void* p) const 

    assert(p != NULL); 
    return (void**)((BYTE*)p+m_nNextOffset);//返回二级指针,为什么不是return (void**)&((BYTE*)p+m_nNextOffset)?? 
                                            //(BYTE*)p+m_nNextOffset是一个一级指针,指针的指针不是&((BYTE*)p+m_nNextOffset)吗? 
    } 这个地方看不懂?为什么是(BYTE*)p呢?
      

  2.   

    嘎嘎。说一下我的看法
    (BYTE*)p+m_nNextOffset可以看成一个一级指针,也可以看成二级指针。就像一个指向二维数组的指针,可以看成一级指针,那么它指向的就是一个一位数组,也可以看成二级,它指向的就已数组中的元素了。
    (void**)((BYTE*)p+m_nNextOffset)
    GetNextptr函数通过偏移量m_nNextOffset取得pNext指针的地址,而参数p指向的是CThreadData类型数据的指针,GetNextptr函数将p的地址加上偏移量就得到了CThreadData中的pNext指针的地址。。

    int a[][]
    int**p=a
    *p=a[0]
    void p1=(void**)(*p+1);
    p1此时指向的是存放a[0][1]地址指针的指针