pchar()强制转换问题

cooling 2004-04-16 09:20:52
var
str: String;
pch1, pch2: Pchar;
begin
str := 'ABCDEF';
pch1 := Pchar(Str);
pch2 := @str;
showmessage(inttostr(ord(pch1[0])));//65
showmessage(inttostr(ord(pch2[0])));//204
end;
...全文
52 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhuangjunx 2004-04-17
  • 打赏
  • 举报
回复
up
halfdream 2004-04-17
  • 打赏
  • 举报
回复

一个STRING简单看来这样分配..(忽略一些细节)

当使用PCHAR类型转换的时候,返回的是串数据的地址..
当使用@符的时候,返回的是引用部分的首地址...


(栈分配) (堆分配)
---------- ---------------
| 引用--|----------------->|串数据 |
---------- ---------------

cooling 2004-04-17
  • 打赏
  • 举报
回复
pStr, tpStr 是这么定义的。

pStr: PChar;
tpStr: String[10];

结果是一片乱码
cooling 2004-04-17
  • 打赏
  • 举报
回复
我现在的函数是这么写的

function GetWordWrap(var pSrc: PChar; pDst: PChar; iMax: Integer): Integer;
var
i: Integer;
begin
Result := 0;
for i := 1 to iMax do //这里出现问题,当我一跟踪的话,i 一直是 34 ,不知道为什么?
begin
pDst^ := pSrc^;
if (pSrc^ = #0) then Break;
if (pSrc^ = #10) then
begin
inc(pSrc, 2);
pDst^ := #0;
Break;
end;

inc(pDst);
inc(pSrc);
inc(Result);
end;

if (Ord(pDst^) > 128) then
begin
pDst^ := pSrc^;
inc(pSrc);
inc(pDst);
end;
pDst := #0;
end;

调用:


while (GetWordWrap(pStr, @tpStr[0], 6) > 0) do
begin
yy := yy + 3 + Abs(Canvas.Font.Height);//输出位置向下
Canvas.TextOut(xx, yy, tpStr);
end;
insert2003 2004-04-17
  • 打赏
  • 举报
回复
呵呵
楼主对指针与地址的概念不是很清楚?
pch1 := Pchar(Str);
pch2 := @str;
当然是不一样的。
@str指向这个字符串指针的地址。。。
dext 2004-04-17
  • 打赏
  • 举报
回复
@str并不是这个字符串的地址,而是指向这个字符串指针的地址。
你的那个字符串可以用WideString嘛!
cooling 2004-04-17
  • 打赏
  • 举报
回复
我想写个函数实现下面的功能。

var
pStr: PChar;
tpStr: String;
begin
pStr := Str;//Str 为任意的一个字符串,可以是中文,英文或中英混合
tpStr := getSubStr(60, pStr);//pStr 也能被改变
end;

function getSubStr(iMax: Integer; var pCh: PChar);
{截取前面的iMax个字符,防止截断半个中文, pCh是实参}
begin
//我不知道怎么处理
end;


请大家帮忙哪,我自己写的函数,截断后出现乱码啊。
fj218 2004-04-17
  • 打赏
  • 举报
回复
str := 'ABCDEF';
pch1 := Pchar(Str);
pch2 := @str[1];
这样就对了。
@str并不是这个字符串的地址,而是指向这个字符串指针的地址。
zhangchen107190 2004-04-16
  • 打赏
  • 举报
回复
pch2:-->pch1
yurenjf 2004-04-16
  • 打赏
  • 举报
回复
pch1 := Pchar(Str);
pch2 := pointer(str);
这样就可以了
yurenjf 2004-04-16
  • 打赏
  • 举报
回复
pch1 := Pchar(Str);
pch2 := @str;
这两句的意义不同啊
cooling 2004-04-16
  • 打赏
  • 举报
回复

两个为什么会不一样呢??????

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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