寻大牛帮忙

wangcftxz 2011-08-23 05:31:31
typedef unsigned char TUInt8; // [0..255]
struct TARGB32 //32 bit color
{
TUInt8 b,g,r,a; //a is alpha
};
struct TPicRegion //一块颜色数据区的描述,便于参数传递
{
TARGB32* pdata; //颜色数据首地址
long byte_width; //一行数据的物理宽度(字节宽度); //abs(byte_width)有可能大于等于width*sizeof(TARGB32);
long width; //像素宽度
long height; //像素高度
};
//那么访问一个点的函数可以写为:
inline TARGB32& Pixels(const TPicRegion& pic,const long x,const long y)
{
return ( (TARGB32*)((TUInt8*)pic.pdata+pic.byte_width*y) )[x] ;
}


请问( (TARGB32*)((TUInt8*)pic.pdata+pic.byte_width*y) )[x]是什么意思?

谢谢!!!
...全文
289 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
至善者善之敌 2011-08-25
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 zhanxiaoqi 的回复:]
可以对该行语句进行拆分来分析,(TUInt8*)pic.pdata首先将pic.pdata由TARGB32* 转换为TUInt8 *
此时pic.pdata仍然指向它所指向的对象的首地址,即成员b的地址,可以看作(TUInt8*)p = (TUInt8*)pic.pdata;加上pic.byte_width*y表示将p从其指向的内存地址往后移动pic.byte_width*y * sizeof(……
[/Quote]

++1
zw1270644192 2011-08-25
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 zhanxiaoqi 的回复:]
可以对该行语句进行拆分来分析,(TUInt8*)pic.pdata首先将pic.pdata由TARGB32* 转换为TUInt8 *
此时pic.pdata仍然指向它所指向的对象的首地址,即成员b的地址,可以看作(TUInt8*)p = (TUInt8*)pic.pdata;加上pic.byte_width*y表示将p从其指向的内存地址往后移动pic.byte_width*y * sizeof(……
[/Quote]


++
wangcftxz 2011-08-25
  • 打赏
  • 举报
回复
非常感谢大家的支持,现在散分。
luciferisnotsatan 2011-08-24
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 zhanxiaoqi 的回复:]

可以对该行语句进行拆分来分析,(TUInt8*)pic.pdata首先将pic.pdata由TARGB32* 转换为TUInt8 *
此时pic.pdata仍然指向它所指向的对象的首地址,即成员b的地址,可以看作(TUInt8*)p = (TUInt8*)pic.pdata;加上pic.byte_width*y表示将p从其指向的内存地址往后移动pic.byte_width*y * sizeof……
[/Quote]
++
ningto.com 2011-08-24
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 zhanxiaoqi 的回复:]

可以对该行语句进行拆分来分析,(TUInt8*)pic.pdata首先将pic.pdata由TARGB32* 转换为TUInt8 *
此时pic.pdata仍然指向它所指向的对象的首地址,即成员b的地址,可以看作(TUInt8*)p = (TUInt8*)pic.pdata;加上pic.byte_width*y表示将p从其指向的内存地址往后移动pic.byte_width*y * sizeof……
[/Quote]
++, 说的很详细了
一叶之舟 2011-08-24
  • 打赏
  • 举报
回复
( (TARGB32*)((TUInt8*)pic.pdata+pic.byte_width*y) )[x]
就是x,y点对应的TARGB32 信息。这个点上的像素信息
zhanxiaoqi 2011-08-24
  • 打赏
  • 举报
回复
可以对该行语句进行拆分来分析,(TUInt8*)pic.pdata首先将pic.pdata由TARGB32* 转换为TUInt8 *
此时pic.pdata仍然指向它所指向的对象的首地址,即成员b的地址,可以看作(TUInt8*)p = (TUInt8*)pic.pdata;加上pic.byte_width*y表示将p从其指向的内存地址往后移动pic.byte_width*y * sizeof(TUInt8)个字节,如果pic.pdata前面不加(TUInt8*)就表示将pic.pdata指针指向的内存地址往后移动
pic.byte_width*y * sizeof(TARGB32)个字节了,从这里你就可以看出pic.pdata前面加(TUInt8*)的目的了。
进一步分析,TUInt8 * p1 = (TUInt8*)pic.pdata+pic.byte_width*y;
此时语句变成(TARGB32*)p1[x]; 由于[]运算符优先级高于(),所以上述语句可以看成(TARGB32*)(p1[x]);P1可以看作是指向一个数组元素类型为(TUInt8)的数组首地址,然后将p1指针往后偏移x*sizeof(TUInt8)个位置,此时指针数据类型仍然为TUInt8 *,此时再将指针强制转换为(TARGB32*)。
总结:上述过程无非就是通过数据类型转换来计算指针偏移的位置,最后又将数据类型进行还原。
shenyan008 2011-08-24
  • 打赏
  • 举报
回复
( (TARGB32*)((TUInt8*)pic.pdata+pic.byte_width*y) )[x]
这里TUInt8必须是一个字节宽度,不然是错误的。因为byte_width是字节宽度,而不是TUInt8的宽度。
pengzhixi 2011-08-24
  • 打赏
  • 举报
回复
再做一次转型而已。转回TARGB32*
wangcftxz 2011-08-24
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 pengzhixi 的回复:]

(TUInt8*)pic.pdata+pic.byte_width*y

将pdata指针转型为TUInt8* 然后取第 pic.byte_width*y个元素。就好比

TUInt8* ptr=pic.pdata;

ptr[pic.byte_width*y];
[/Quote]

谢谢

请问 (TARGB32*)((TUInt8*)pic.pdata+pic.byte_width*y) 怎么解释?
好人做到底啊
wintree 2011-08-24
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 pengzhixi 的回复:]

(TUInt8*)pic.pdata+pic.byte_width*y

将pdata指针转型为TUInt8* 然后取第 pic.byte_width*y个元素。就好比

TUInt8* ptr=pic.pdata;

ptr[pic.byte_width*y];
[/Quote]

++1
pengzhixi 2011-08-24
  • 打赏
  • 举报
回复
(TUInt8*)pic.pdata+pic.byte_width*y

将pdata指针转型为TUInt8* 然后取第 pic.byte_width*y个元素。就好比

TUInt8* ptr=pic.pdata;

ptr[pic.byte_width*y];
zw1270644192 2011-08-24
  • 打赏
  • 举报
回复
不是大牛 围观一下
turing-complete 2011-08-24
  • 打赏
  • 举报
回复
我也帮你顶一下,等待专家
wangcftxz 2011-08-24
  • 打赏
  • 举报
回复
没人理,自顶一下
木房子 2011-08-24
  • 打赏
  • 举报
回复
代替楼主说声谢谢,谢谢你的耐心和专业!

[Quote=引用 8 楼 zhanxiaoqi 的回复:]
可以对该行语句进行拆分来分析,(TUInt8*)pic.pdata首先将pic.pdata由TARGB32* 转换为TUInt8 *
此时pic.pdata仍然指向它所指向的对象的首地址,即成员b的地址,可以看作(TUInt8*)p = (TUInt8*)pic.pdata;加上pic.byte_width*y表示将p从其指向的内存地址往后移动pic.byte_width*y * sizeof(……
[/Quote]

64,674

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧