基础问题(20分)

  • 主题发起人 主题发起人 lovellybaby
  • 开始时间 开始时间
L

lovellybaby

Unregistered / Unconfirmed
GUEST, unregistred user!
var b:array[0..4] of byte;
p:pchar;
--------------------------
b[0]:=97;//a
b[1]:=98;//b
b[2]:=99;//c
b[3]:=100;//d
b[4]:=101;//e

p:=@b;
为什么p的值是abcdel,这样才能简洁的得到p的正确值?
 
关注ing,我也试了,结果是‘abcdel?’.
 
P 是Pchar类型的指针,指向一个以0结尾的字串
不巧的很,数组中的元素也是顺序排放的,所以才有你的结果
abcde,
要想取得一个字母,这样子
P[0]:第一个a
P[1]:第二个b
。。。
p[4]:第5个e
p[5]。。。。。。这些就是随机数了
 
var
b:array[0..4] of byte;
p:pchar;
i : Integer;
begin
b[0]:=97;//a
b[1]:=98;//b
b[2]:=99;//c
b[3]:=100;//d
b[4]:=101;//e

p:=@b;

ShowMessage(IntToStr(ord(p[0])));
ShowMessage(IntToStr(ord(p[1])));
end;
-------------------------------------------------------------------------------
先把object pascal 好好看看,打好基础。
 
???
为什么我的就没有那个“l”呢
 
D的类型处理本身就是个难点。foxphone2003的代码对我也有用。
 
赞同lanyun2 兄
var b:array[0..5] of byte;
p:pchar;
begin
FillChar(b, SizeOf(b), 0);
b[0]:=97;//a
b[1]:=98;//b
b[2]:=99;//c
b[3]:=100;//d
b[4]:=101;//e
p:=@b;
ShowMessage(p);
end;
 
明显你写的有问题嘛
b[4]下一个内存单元的数据你确定是什么嘛?
如果不是0(#0)那必然要错
这样写才行
procedure TForm1.btn1Click(Sender: TObject);
var
B:array[0..5] of byte;
P:PChar;
begin
B[0]:=97;//a
B[1]:=98;//b
B[2]:=99;//c
B[3]:=100;//d
B[4]:=101;//e
B[5]:=0;//#0
P:=@B;
Caption:=P;
end;
 
你的p:=@b;是把b数组的地址赋给了p,而p是pchar型,就把97,98等看成了asc码,转为字符为:abcde 了,因为没有结束符号,在e之后就会出现随机符.要想得到abcde,把数组改为[0..5],原后赋值b[5]:=0就可以了,答案就是abcde了.
 
LIUCHONG 的解释很正确
 
b[5]:=0这个我也知道,但是各位这样的写法优雅吗?
我只需4个字节的空间为什么还要多申请一个?
现在的问题是在转换类型的时候自动向字串的下一个地址赋0,而不需要这样不好的做法。
 
另外e后的字符不是随机的,在我的机器上永远是l,不管是重新启动程序或是系统。
Why?
 
这个不是优雅不优雅的问题,而是必须
字符串必须以#0结束

至于你后面的字符永远是L这个也未知,因为理论上那个位置的内存是什么
只有天知道
 
FillChar(b, SizeOf(b), 0)这句本质就是添充0,且没有手动在未位效果好(既细微的效率问题)
 
下面是我知己认为比较优雅的方法
var
b:array[0..4] of Byte;
p:Pointer;
i:Integer;
begin
p:=GetMemory(SizeOf(byte)*(length(b)+sizeof(Byte)));
b[0]:=97;
b[1]:=98;
b[2]:=99;
b[3]:=100;
b[4]:=101;
p:=@aa;
pchar(p)[Length(b)]:=#0;
ShowMessage(pchar(p));
FreeMemory(p);

----------------------------------
它不需要扩充Byte数组的维数而是用临时指针代替。这样做的好处是拥有灵活性,试想如果数组是作为函数参数传入的话或者是个Const,那么这种发法就是简洁优雅的。
本人拙建,希望和各位交流。我们程序员之说以没日没夜的学习技术其实是自己低层技术未
打牢。其实真正掌握了核心其他技术只是堆砌。咳,我的路还很长那...[:)]
 
这个哪里有什么优雅之出啊
还不是人为在数组后加个#0用以表示字符串结束
 
有没有看过Vcl源码?那有什么神奇,还不是调用了Win API
 
能不能问问楼主您的程序中给P GetMemory是不是必须的?
我的理解是:
P是一个指针,所谓指针嘛,就是一个地址,或者简单说是一个32位的整数
P[0]其实就是P的本来地址
P[1]是P的本来地址后移一个单位,就是那个整数+1.
对P的GetMemory不应该用吧?
请斧正!!!
 
我的如果按lovellybaby说的会有便宜错误
 
GetMemory是可以不用的,对于指针的初始化已隐含在赋值操作中。
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
I
回复
0
查看
606
import
I
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部