指针 (50分)

  • 主题发起人 主题发起人 mouse_ingrief
  • 开始时间 开始时间
M

mouse_ingrief

Unregistered / Unconfirmed
GUEST, unregistred user!
下面这段程序编译通过,可以执行。
procedure TForm1.Button1Click(Sender: TObject);
var
x,y : Integer;
BitMap : TBitMap;
P : PByteArray;
Str: string;
begin
BitMap := TBitMap.create;
try
Str := ExtractFilePath(Paramstr(0)) + 'Blue hills.bmp';
BitMap.LoadFromFile(Str);
for y := 0 to BitMap.height - 1 do
begin
P := BitMap.ScanLine[y];
for x := 0 to BitMap.width - 1 do
P[x] := y;
end;
Canvas.draw(0,0,BitMap);
finally
BitMap.free;
end;
end;
我想问的是:P是指向数组的指针,那引用指针变量不是P^[x]这样吗?P[x] := y;中的P[x]是什么道理?
问题2:上面这段程序的效果是图片的左边的一截区域变成其他的图案,其他的部分不变。
就是for x := 0 to BitMap.width - 1 do
P[x] := y;
这几句,看不明白在干什么?
希望得到大家的帮助!谢谢!
 
应该是P^[x]
 
可是P[x]是正确的,所以我疑惑!
 
两种形式一样
 
to XWHope:
形式一样,怎么解释?
 
没有人了?在线等待。。。。。。
 
P[x]只是取本数组中的数据而不是通过指针所指向的地址取相对应的值.....
 
大家快来救急呀!
 
你要做啥
 
在高版本的Delphi中 p^.x 和 p.x 是等效的
 
高版本?我用的是delphi5.0.我觉得这不是本质,应该有什么道理!比如说默认属性什么的。
 
按照pascal语法应该是p^.x ,但实际上在delphi里p^.x 和 p.x 是等效的,所以p.x是p^.x的缩写,在pascal里 p.x是没有意义的
 
不好意思,自lich以下好像已经偷梁换柱了。
大家请先看一下我的问题。
下面这段程序编译通过,可以执行。
procedure TForm1.Button1Click(Sender: TObject);
var
x,y : Integer;
BitMap : TBitMap;
P : PByteArray;
Str: string;
begin
BitMap := TBitMap.create;
try
Str := ExtractFilePath(Paramstr(0)) + 'Blue hills.bmp';
BitMap.LoadFromFile(Str);
for y := 0 to BitMap.height - 1 do
begin
P := BitMap.ScanLine[y];
for x := 0 to BitMap.width - 1 do
P[x] := y;
end;
Canvas.draw(0,0,BitMap);
finally
BitMap.free;
end;
end;
我想问的是:P是指向数组的指针,那引用指针变量不是P^[x]这样吗?P[x] := y;中的P[x]是什么道理?
问题2:上面这段程序的效果是图片的左边的一截区域变成其他的图案,其他的部分不变。
就是for x := 0 to BitMap.width - 1 do
P[x] := y;
这几句,看不明白在干什么?
希望得到大家的帮助!谢谢!
 
一、关于程序:
1.PByteArray:
PByteArray 是指向 TByteArray 的指针
TByteArray 是 array[0..32767]of Byte
表示一个总数为 32767 的 byte 数组,数组中每个元素都是一个 byte (8bit)数据
2. P:PByteArray; 也就是说 @P 将获得一个 TByteArray 数组的首地址,如果 p^[0] 就相当于 TByteArray[0]
3.回到程序:P := BitMap.ScanLine[y]; 这行很重要,它是把一个内存地址指派给 P (实际上是 Bitmap 的 DIB 数据行,这个比较复杂,这里略过不谈),
P 收到一个地址后,就认为 @P 开始是一个 TByteArray 数组。于是:
4. for x := 0 to BitMap.width - 1 do P^[x] := y; 就是把 y 值送入这个 @p 开始的 TByteArray 数组。
这个 y 是从 0 开始到 BitMap.height - 1 ,是一个递增值,于是,图片数据就会被这个值修改。
5.图形数据中,24bit 格式图形,是 三个 byte 为一个像素点,所以这个程序对图片的修改,只有 30%,如果其它格式,按每像素占用的 byte 类推。
 
二、关于数据类型:
在帮助中特别提醒:PByteArray 通常用在动态内存分配中对 byte 进行存取操作。Delphi 的源代码我
没有见过,但我想它应该对这个类型进行了特别处理,类似于 SizeOf 这样的函数一样,所以才会在 P[x]
表示时,效果与 P^[x] 相同,但是否真的是编译器产生的魔法,还是楼上 lich 说的等效,偶也不知道。
 
谢谢小雨哥,解释很透彻,44分给你,其余的6分分给众家兄弟,以答谢对我的关注。
 
后退
顶部