guobinname_301 发表于 2012-12-12 12:43:55

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

请大侠帮忙解释#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 static/image/common/back.gif
[(*(list))->itemSize * (item)]这一部份好像是取数组元素。
((char *)&(*list)->itemList) 这一部分好像是 ...
怎么看起来就是得到 (*list)->itemList 他的指针这种情况是当sizeof((*list)->itemList) 等于
(*(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 static/image/common/back.gif
[(*(list))->itemSize * (item)]这一部份好像是取数组元素。
((char *)&(*list)->itemList) 这一部分好像是 ...
怎么看起来就是得到 (*list)->itemList 他的指针这种情况是当sizeof((*list)->itemList) 等于
(*(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

{:2_148:}谢谢大侠这么详细的指点。我明白了。

874176706 发表于 2013-1-1 21:32:25

==itemList数组的地址。(*list)->itemList是数组名,也是数组第一个元素的指针,它的类型为数组元素的类型,即const char *,是常值指针,不能改变数组名的值以及类型。而&(*list)->itemList)是取整个数组的指针,这个指针是一个数组类型,虽然两种指针的大小相等,但类型不同,(char*)&(*list)->itemList是将前面那个数组指针强制转化为char*型的,后面再加个[]就成了char型数组了。这么处理数组主要是为了改变数组的类型。{:2_130:}
页: [1]
查看完整版本: #define ITEMPTR(list,item) 的问题?