有点奇怪,关于CSimpleList类

Sandy_Y 2008-05-13 11:44:05
在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)吗?
}
...全文
92 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
liuy518329 2011-01-22
  • 打赏
  • 举报
回复
嘎嘎。说一下我的看法。。。
(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]地址指针的指针。。。
missile1226 2008-11-18
  • 打赏
  • 举报
回复
在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呢?
phisherr 2008-09-23
  • 打赏
  • 举报
回复
(BYTE*)p+m_nNextOffset是一个一级指针,

但是我们知道它是指向的这个地址是放着一个指针(这个指针指向下一个节点)的,

(void**)((BYTE*)p+m_nNextOffset) 是指向节点指针的指针;通过两次星号运算得到节点;



&((BYTE*)p+m_nNextOffset) 就是另外一种情况了;
(BYTE*)p+m_nNextOffset的值表示的是一个地址;但是本身却是一个相加的结果(即是一个表达式);
我们是不能对一个表达式去取地址的;

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧