天嵌 ARM开发社区

 找回密码
 注册
查看: 2878|回复: 5

#define ITEMPTR(list,item) 的问题?

[复制链接]
guobinname_301 发表于 2012-12-12 12:43:55 | 显示全部楼层 |阅读模式
请大侠帮忙解释#define ITEMPTR(list,item)        &(((char *)&(*list)->itemList)[(*(list))->itemSize * (item)])
中的&(((char *)&(*list)->itemList)[(*(list))->itemSize * (item)])到底什么意思?
请大侠们解释的详细一点。
 楼主| guobinname_301 发表于 2012-12-12 12:53:26 | 显示全部楼层
[(*(list))->itemSize * (item)]这一部份好像是取数组元素。
((char *)&(*list)->itemList) 这一部分好像是取地址。
&(((char *)&(*list)->itemList) 再加一个&,好像是指针的指针。
&(((char *)&(*list)->itemList)[(*(list))->itemSize * (item)])全部加起来好像是取itemList[]的地址。
不知道这样理解对不对?请大侠们指点。
回复

使用道具 举报

embedsky_lhh 发表于 2012-12-12 14:23:27 | 显示全部楼层
本帖最后由 embedsky_lhh 于 2012-12-12 14:25 编辑
guobinname_301 发表于 2012-12-12 12:53
[(*(list))->itemSize * (item)]这一部份好像是取数组元素。
((char *)&(*list)->itemList) 这一部分好像是 ...

怎么看起来就是得到 (*list)->itemList[item] 他的指针这种情况是当sizeof((*list)->itemList[0]) 等于
(*(list))->itemSize下成立的
(*list)->itemList
&(*list)->itemList  这是(*list)->itemList 的指针
((char *)&(*list)->itemList) ;把指针类型强制转换成char*型

[(*(list))->itemSize * (item)] 就是取其长的char*指针的(*(list))->itemSize * (item)偏移。

然后 再最前面加& 就是取其地址


回复

使用道具 举报

embedsky_lhh 发表于 2012-12-12 14:23:27 | 显示全部楼层
本帖最后由 embedsky_lhh 于 2012-12-12 14:26 编辑
guobinname_301 发表于 2012-12-12 12:53
[(*(list))->itemSize * (item)]这一部份好像是取数组元素。
((char *)&(*list)->itemList) 这一部分好像是 ...

怎么看起来就是得到 (*list)->itemList[item] 他的指针这种情况是当sizeof((*list)->itemList[0]) 等于
(*(list))->itemSize下成立的
(*list)->itemList
&(*list)->itemList  这是(*list)->itemList 的指针
((char *)&(*list)->itemList) ;把指针类型强制转换成char*型

[(*(list))->itemSize * (item)] 就是取其长的char*指针的(*(list))->itemSize * (item)偏移。

然后 再最前面加& 就是取其地址

如果要把它分解成方法的的话 我想可以这样

s_addr ITEMPTR(My_List *list,TYPE item)
{
        char *pCh= (char *)&(*list)->itemList;
       return (s_addr) &pCh[(*(list))->itemSize * (item)];

}在下抛砖引玉,还希望大家跟帖,讨论指正,
回复

使用道具 举报

 楼主| guobinname_301 发表于 2012-12-12 16:15:14 | 显示全部楼层
谢谢大侠这么详细的指点。我明白了。
回复

使用道具 举报

874176706 发表于 2013-1-1 21:32:25 | 显示全部楼层
==itemList数组的地址。(*list)->itemList是数组名,也是数组第一个元素的指针,它的类型为数组元素的类型,即const char *,是常值指针,不能改变数组名的值以及类型。而&(*list)->itemList)是取整个数组的指针,这个指针是一个数组类型,虽然两种指针的大小相等,但类型不同,(char*)&(*list)->itemList是将前面那个数组指针强制转化为char*型的,后面再加个[]就成了char型数组了。这么处理数组主要是为了改变数组的类型。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号-2 )

GMT+8, 2025-6-18 03:11 , Processed in 2.039169 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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