一个C/C++程序员最容易犯的错误!

本文通过一个具体的代码示例,深入探讨了C语言中指针运算的常见误区,特别是关于指针加减运算的对象类型问题,并提供了正确的解决方案。

首先让我们看一段代码:

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) );

嘿嘿!一目了然吧!?

 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值