游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2017|回复: 4

谁可以帮忙分解一下这个产生指针的宏?

[复制链接]

83

主题

196

帖子

196

积分

注册会员

Rank: 2

积分
196
发表于 2008-1-28 21:00:00 | 显示全部楼层 |阅读模式
// 这里定义了一个产生指针的宏
#define MakePtr(cast, ptr, AddValue) (cast)((DWORD)(ptr)+(DWORD)(AddValue))

某看不懂
求助
谁可以帮忙分解一下
特别是后半部分

3

主题

121

帖子

121

积分

注册会员

Rank: 2

积分
121
QQ
发表于 2008-2-7 12:28:00 | 显示全部楼层

Re:谁可以帮忙分解一下这个产生指针的宏?

将ptr移动Addvalue再转换为cast

83

主题

196

帖子

196

积分

注册会员

Rank: 2

积分
196
 楼主| 发表于 2008-2-14 16:15:00 | 显示全部楼层

Re:谁可以帮忙分解一下这个产生指针的宏?

楼上的说的是MakePtr(cast, ptr, Addvalue)功能
但是(cast)((DWORD)(ptr)+(DWORD)(Addvalue))很难接受

1

主题

11

帖子

11

积分

新手上路

Rank: 1

积分
11
发表于 2008-2-15 15:11:00 | 显示全部楼层

Re:谁可以帮忙分解一下这个产生指针的宏?

测试一下来说明吧

#define MakePtr(cast, ptr, Addvalue) (cast)((DWORD)(ptr)+(DWORD)(Addvalue))

int main(int argc, char* argv[])
{
        int a[5] = {0, 1, 2, 3, 4};
        int *b;
        b = MakePtr(int*, a, 8);  //分解开来就是&a[0]加上8个字节,因为指针转换为了DWORD
                        //所以加上的是字节数,而不8个int类型大小
                        //然后得到a[2]的指针,最后转换为(int *),附给b
        cout<<"*b="<<*b<<endl;
        return 0;
}

86

主题

2251

帖子

2386

积分

金牌会员

Rank: 6Rank: 6

积分
2386
QQ
发表于 2008-2-17 15:07:00 | 显示全部楼层

Re:谁可以帮忙分解一下这个产生指针的宏?

因为指针的加减,根据指针类型的不同,获得不同的结果。如int*加1是前进4个byte,char*加1是前进1个byte。

  1. #include <stdio.h>

  2. int main() {
  3.         int* ip = 0;
  4.         char* cp = 0;
  5.         ip += 2;
  6.         cp += 2;
  7.         printf("%u\n", (unsigned int)ip);
  8.         printf("%u\n", (unsigned int)cp);
  9. }
复制代码


所以这个宏先转成DWORD,这样就不用担心指针类型如何了。前进的地址一定是addvalue*sizeof(DWORD)。然后转成cast类型。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-20 04:40

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表