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