首先让我们看一段代码:
void GetCtrlRectViaParent( LPRECT lprc, HWND hwndDlg, UINT idCtrl )
{
POINT pt;
HWND hwndCtrl = GetDlgItem(hwndDlg, idCtrl);
GetWindowRect( hwndCtrl, lprc );
memcpy( &pt, lprc, sizeof(POINT) );
ScreenToClient( hwndDlg, &pt );
memcpy( lprc, &pt, sizeof(POINT) );
memcpy( &pt, lprc + sizeof(POINT), sizeof(POINT) );
ScreenToClient( hwndDlg, &pt );
memcpy( lprc + sizeof(POINT), &pt, sizeof(POINT) );
}
类似上面那个函数——大家有没有发现问题呢?错在哪里?粗略咋一看,并没有不对的地方啊!奇怪了,可就是当执行时,100%出错!为什么呢?如果你找不到错误来,那么请你再回去看看指针那一章。否则,下面那一段就不用看了。^_^
哇哇!晕了,找了半天还是没找出来吗?头疼了吧?
还让我告诉你吧! lprc + sizeof(POINT) 就这一段!注意了,指针虽然就是一个地址!并且一个地址也就是一个DWORD!显然一个DWORD+sizeof(POINT)得出来的结果当然也就是我们想要的新位址!不可,如果你真这么想,那就说明你对C的指针掌握的还不够火厚!
1、指针的加减时,并不是简单的位址加减,而是它指向的数据类型的加减!不信你试试!
2、如果要操作指针的新位址,我们应该这样做:(void*)(((DWORD)lprc) + sizeof(POINT))。
测试代码:
MsgInfo( "%d, %d, %d, %d, %d, %d, %d", lprc,&(lprc->left),&(lprc->top), sizeof(POINT), lprc + sizeof(POINT), &(lprc->right), lprc + sizeof(RECT) );
嘿嘿!一目了然吧!?
本文通过一个具体的代码示例,深入探讨了C语言中指针运算的常见误区,特别是关于指针加减运算的对象类型问题,并提供了正确的解决方案。
2119

被折叠的 条评论
为什么被折叠?



