我也提一个指针操作的问题!如何使用两个指针指向内存中相同数据的不同位置! ( 积分: 50 )

  • 主题发起人 主题发起人 草原牧歌
  • 开始时间 开始时间

草原牧歌

Unregistered / Unconfirmed
GUEST, unregistred user!
如何使用两个指针指向内存中相同数据的不同位置!
比如:P1,P2: pointer;
MemStream:= TMemoryStream.create;
Bitmap.SaveToStream(MemStream);
getMem(P1,Integer(MemStream.size));
MemStream.seek(0,{从开始读,常量忘记了,soFromBeginning好象是});
MemStream.read(P1^,MemStream.size);
//这时p1指向一片内存。
//我想让p2指向这片内存中的 bmp图象数据部分
//在c中这很容易 p2= p1
p2= p2+(bmpheader+bmpfileheader);
//在d中怎么做呢?d中的指针完全不同与c
 
如何使用两个指针指向内存中相同数据的不同位置!
比如:P1,P2: pointer;
MemStream:= TMemoryStream.create;
Bitmap.SaveToStream(MemStream);
getMem(P1,Integer(MemStream.size));
MemStream.seek(0,{从开始读,常量忘记了,soFromBeginning好象是});
MemStream.read(P1^,MemStream.size);
//这时p1指向一片内存。
//我想让p2指向这片内存中的 bmp图象数据部分
//在c中这很容易 p2= p1
p2= p2+(bmpheader+bmpfileheader);
//在d中怎么做呢?d中的指针完全不同与c
 
对于这种语法问题
1.按照你的逻辑写出
2.编译
3.调试错误,通过添加若干个强制转换即可.
 
Delphi某些方面真是不如c好使,用以前我们pascal老师的话说,pascal的指针太烂了!
如今看来,这话真不过分!有想法都无法实现!
to zjan521
你认为这是语法问题吗?
 
delphi是不很方便,但一样可以的:
p2 := Pointer(DWORD(p1)+(bmpheader+bmpfileheader));

p2 := p1;
inc(p2,bmpheader+bmpfileheader);
另外,你们pascal老师那句话也是太烂了!
 
指针只不过是表示内存地址的数字 :)
 
更正一下,
p2 := p1;
inc(p2,bmpheader+bmpfileheader);
应为
p2 := p1;
inc(pbyte(p2),bmpheader+bmpfileheader);
 
来自:tt.t, 时间:2005-5-15 21:28:53, ID:3074448
delphi是不很方便,但一样可以的:
p2 := Pointer(DWORD(p1)+(bmpheader+bmpfileheader));

p2 := p1;
inc(p2,bmpheader+bmpfileheader);
另外,你们pascal老师那句话也是太烂了! [red](这句好)[/red]
 
回顾了一下pascal,有一个方法:
每一个指针都是用无符号的整形来表示其 指向的地址的。
当然能把 pascal 的指针向c一样来加,只是要转换成整形来操作,否则就会出错误!
对于:
--来自:tt.t, 时间:2005-5-16 12:37:12, ID:3074891
--更正一下,
--p2 := p1;
--inc(p2,bmpheader+bmpfileheader);
--应为
--p2 := p1;
--inc(pbyte(p2),bmpheader+bmpfileheader);
我没测试过,不敢说inc(pbyte(p2),bmpheader+bmpfileheader)
是否正确,但我想是不对的,因为不能对指针进行加法操作,pbyte 应是 type pbyte= ^byte,他仍然是个指针
而: p2 := Pointer(DWORD(p1)+(bmpheader+bmpfileheader))
是绝对正确的!

to tt.t 你认为呢?

--另外,你们pascal老师那句话也是太烂了!
(说这个话的人是个博士,很年轻,说话自然有不负责的成分,他估计做梦也不会想到,他当初的一句话,我们还引发一场争论!他当我们老师仅仅2个月,下面的话不是在维护他!而是要客观的谈一下!)
难道还有哪个支持指针操作的语言,指针操作不如pascal的吗?如果有,那么它就不是很烂(与c比较),如果没有,那么所有支持指针操作的语言都比pascal强,那pascal的指针显然是最烂的了,评价一个语言要客观!
我学过c,java,delphi 最后还是选择了 delphi,难道我使用一个自己充满感情的语言(delphi),还要象c++程序员那样指责 delphi吗?显然不是.
在c中甚至可以用指针来操作复杂对象的内部成员,看看msdn中用c(不是 c++)代码访问的示例就知道它有多强大了!
所以,我引用了他的一句话来形容一下,并不表示其他意思,客观的说才是最重要的!
 
to 草原牧歌,
兄弟,是你说话不够客观了。
指针其实就是个数字,对机器来说没有这个概念。强大不强大只是你用起来觉得爽不爽而已。为什么有的语言里面你用的觉得很爽(比如你说的c),有的你用的觉得不爽(比如你说的op)?这是因为c和op不是一个时代的产物。更本就是应用在两个领域里的东西。c出现的时代,程序设计的主导思想还是面向过程的,主要应用于系统编程,要是c语言的指针操作不灵活那它也没有存在的必要了,直接用汇编的了。所以c的指针的灵活性是历史原因。而op出现的时代呢,思想上已经进化到了面向对象,主要应用于应用编程,指针的灵活性已经没有那个必要了,op有op强大的地方。所以op指针的不灵活,也是历史照成的。没有比较的意义,就好像非要问关公和秦琼谁更厉害,小李的飞刀和屠龙刀哪个更猛。
结论就是:这个都拿来比较,你们那个老师真的很无聊,你也跟着很无聊。
 
to yubufeng
-- 结论就是:这个都拿来比较,你们那个老师真的很无聊,你也跟着很无聊。
那你岂不是也无聊了一回吗? (:
而且我一直用pascal 和c做比较,似乎没用到oop什么的吧!
而且,确实在很多地方用指针来操作,很自然的就想到了c语言怎样怎样就可以实现了(我估计学过c的都有这个毛病)!自然的就想到怎样把c中可以轻易实现的转换成pascal的,不是我非要比较,是遇到非比不可的问题了!
 
算了算了,那句话没什么可争论的,只是不同得人有不同的看法罢了,
大富翁应该只是讨论技术问题的地方,不是灌水吵架的场所。
没必要为这种问题争吵,tw问题都可以谈,一句话算什么。
to 草原牧歌,
inc(pbyte(p2),bmpheader+bmpfileheader)

是没问题的
delphi支持对指针的inc操作,
如一个结构
type
pr =^tr
tr = record
a: integer;
b: integer;
end;
var
ppr: pr;
ppr指向一段数据:((1,2),(3,4))的首地址,即指向(1,2)
inc(ppr);
的结果是ppr指向了第二组数据(3,4),依此类推。
 
另外,其实delphi对指针的运用确实不如c灵活,我认为是为了保证语言的优美和安全、稳定。其实只要你愿意,完全可以用指针实现很多操作,只是那是不符合d的规范的,会造成代码的可读性、可维护性降低。当然为了实现这些有时甚至需要用到basm。
另外,麻子说得很正确,pointer只是一个数据罢了,和dword或是integer没什么本质的区别都是一段4字节的数据,只是编译器将他们做了不同处理而已。真正的指针只存在于脑子里,你把它作为指针他就是指针,想让他作为数据她就是数据。此外,象数组、对象、过程、函数也都是指针表示的。
 
正确,inc是可以,我忘了inc不仅仅是加一个整数,而是加一个类型的字节大小!
to tt.t谢谢你的参与,让我思路开阔了不少!
帮忙看一下这个问题:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3076164
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
694
import
I
后退
顶部