首页
社区
课程
招聘
[求助]这行代码该如何理解?
2006-8-4 11:22 4119

[求助]这行代码该如何理解?

2006-8-4 11:22
4119
DWORD Arry[10];
DWORD NArray;

int i;
for (i = 0; i < (int)iCound; i++)
        ((DWORD*)(*(DWORD*)(NArry)))[i] = Arry[i];

For循环中的((DWORD*)(*(DWORD*)(NArry)))[i] = Arry[i];如何理解啊。
我初学,被这个((DWORD*)(*(DWORD*)(NArry)))搞晕了。

[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

收藏
点赞0
打赏
分享
最新回复 (9)
雪    币: 2367
活跃值: (756)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
小虾 10 2006-8-4 15:22
2
0
DWORD Arry[10];
DWORD NArry;
DWORD dwTmp;

int i;
for (i = 0; i < (int)iCound; i++)
{
  dwTmp = *(DWORD*)NArry;
  (DWORD*)dwTmp[i] = Arry[i];
}
雪    币: 218
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ahaisoft 2006-8-4 18:14
3
0
谢谢版主。
我就是对这一前一后的*号搞不清什么意思呢,能帮我解答一下吗?
或者说,在masm中是如何表达的呢?
雪    币: 2367
活跃值: (756)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
小虾 10 2006-8-4 19:45
4
0
xor esi,esi
@@:
mov eax,offset NArry
mov edx,offset Arry
mov eax,[eax]  ;eax = *(DWORD*)NArry
mov edx,[edx+esi*4] ;edx = Arry[i]
mov [eax+esi*4],edx
inc esi
cmp esi,iCound
jnz @b
雪    币: 235
活跃值: (41)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
alpsdew 4 2006-8-4 20:45
5
0
记得看数据结构的时候,讲到算式的表达,用栈来实现。
楼主不妨试试:

  碰到一个“(”就压栈,碰到“)”就出栈,那么这个“(”和“)”就是匹配的!

不知道说的对不对
^_^
愚见
雪    币: 218
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ahaisoft 2006-8-5 00:27
6
0
谢谢小虾版本的代码!

实在不好意思,我是刚刚接触C。虽然上面的masm代码我能明白,
可是我还是不清楚象这样一行eax = *(DWORD*)NArry;代码,=号右边是如何计算的。象这样DWORD*的情况,*号在类型右边,我翻遍了手头的C书籍,也没见这样写的。
mov eax,[NArry];就是这个意思吧?以变量NArry中值为地址取DWORD值?
请问,象DWORD*这种情况,和()的使用,分别代表什么意思呢?

另外,alpsdew的回答我没看明白。
雪    币: 2134
活跃值: (14)
能力值: (RANK:170 )
在线值:
发帖
回帖
粉丝
Aker 4 2006-8-5 05:37
7
0
NArray是个指针,指针所指的地方里面存的值也是指针,你这样想就懂了
雪    币: 235
活跃值: (41)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
alpsdew 4 2006-8-5 10:01
8
0
我的意思和楼上的是一样的!

我觉得关键就是那几个括号的理解,我原来的方法是告诉你括号是怎么匹配的。

弄明白之后,先看(dword*),是个强制类型转换,把它后面的内容变成dword型指针;再看(*(DWORD*)(NArry))里的(DWORD*)也是这样的意思,它把NArry强制转换为dword型指针,加上*(可以做“取值”运算符),表示取NArry指向的地址的内容。

我也是个菜鸟^_^
雪    币: 216
活跃值: (70)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
analog 2 2006-8-5 10:52
9
0
改写下程序吧:
DWORD Arry[10], temp;
DWORD* NArray;
NArry = &temp;虽然改变了原意,但助于理解

int i;
for (i = 0; i < (int)iCound; i++)
  ((DWORD*)(*NArry))[i] = Arry[i];
              ||
  ((DWORD*)temp)[i] = Arry[i];
这句应该简单明了了,把temp变量中的值作为一个指针x,从地址x开始的iCound个dword大小的内存赋值
雪    币: 218
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ahaisoft 2006-8-5 11:52
10
0
呵,谢谢大家,这下我明白了。
游客
登录 | 注册 方可回帖
返回