如何使用 Pointer 修改 string

s11ss 2009-11-08 02:10:45
procedure TForm1.Button1Click(Sender: TObject);
var
p: Pointer;
s: string;
begin
s := 'a23';
p := PChar(s);
Byte(p^) := Ord('1');//想要实现 s[1] := '1',但这里报错
ShowMessage(s);
end;
...全文
103 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Seamour 2009-11-08
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 s11ss 的回复:]
那为什么 s[1] := '1' 可以呢?
[/Quote]
看反汇编就知道了,str[N] 为 l-value 时会调用 system._UniqueString*,把常量字符串变成了变量。所以 str[N] 为 l-value 时效率非常低
mdejtod 2009-11-08
  • 打赏
  • 举报
回复
S是变量,在任何情况下你都可以直接修改,但是
p := PChar(s);
这之后,P就是一个常量指针,常量指针所指的内容不可被修改,但是指针的指向地址可以修改
而指针常量的话,则是指针本身是常量,指向的地址不可以变化,但是指向的地址所对应的内容可以变化
var
p: PChar;
s: string;
begin
s := 'a23';
p := PChar(s);
GetMem(p,Length(S));
CopyMemory(p,PChar(s),Length(s));
P[0] := '1';
s := p;
ShowMessage(s[1]);
FreeMem(p,Length(s));
end;
搞不明白楼主为什么要绕一个圈子来实现这功能。。。。。
希望我没搞错,水平有限。。。
s11ss 2009-11-08
  • 打赏
  • 举报
回复
那为什么 s[1] := '1' 可以呢?[Quote=引用 5 楼 seamour 的回复:]
s指向的是常量字符串,当然不能直接写了

[/Quote]
Seamour 2009-11-08
  • 打赏
  • 举报
回复
s指向的是常量字符串,当然不能直接写了
s11ss 2009-11-08
  • 打赏
  • 举报
回复
谢谢,不过不管用啊 :([Quote=引用 3 楼 huoxin8226 的回复:]
  p := PChar(s)+1;
  PByte(p)^:= Ord('1');
试试看
[/Quote]
huoxin8226 2009-11-08
  • 打赏
  • 举报
回复
p := PChar(s)+1;
PByte(p)^:= Ord('1');
试试看
s11ss 2009-11-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 preserve 的回复:]
是编译通不过么?
Byte(p^)换成PByte(p)^试试
[/Quote]编译能通过,换成这个PByte(p)^以后编译也能通过,但运行时还是报错,还是 Access Violation.
preserve 2009-11-08
  • 打赏
  • 举报
回复
是编译通不过么?
Byte(p^)换成PByte(p)^试试

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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