搞不懂DELPHI的PCHR用法很怪,是否动用了强制类型转换

delphi_new 2008-04-12 10:10:35
procedure gettDictonry();
var dir:array[0..255] of char;
var sdir:string;
begin
GetWindowsDirectory(dir,255);
sdir:=strpas(dir);
showMessage(sdir);
end;

看到上面的代码的问题没有,至少我认为和正规的写法有出入

在GetWindowsDirectory这个函数的第一个参数要求是PCAHR类型,为何用dir数组也可以使用呢?
大家知道的请指教下,
...全文
142 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
我记得是@dir
lihuasoft 2008-04-13
  • 打赏
  • 举报
回复
一切变量名字、对象名字都是指针

不应该问为什么可以这样,而是要考虑为什么有的就不允许这样

另外,上面说的Write on Copy说错了,是我记错了,应该是Copy On Write
lihuasoft 2008-04-13
  • 打赏
  • 举报
回复

你这样理解吧:

拿GetWindowsDirectory()来说,这是一个Win32API函数---->它是用C语言写的---->在C里没有字符串的概念---->一般是这样声明:char*一个指针---->其实就是一个字符数组,或者说一个PChar指针。

GetWindowsDirectory()的第一个参数是要求是一个指针,而前面说的P、@A、@A[0]、以及A都是指针。

至于为什么array[5..255]不行,那是出于安全的考虑,因为只有在Delphi里才可以这样声明数组

至于为什么array of char不行,那是因为array of char使用了Write on Copy技术,类似于长字符串string类型,在第一个元素之前有引用计数、长度等信息存储,@A<>@A[0]
lxtnt 2008-04-13
  • 打赏
  • 举报
回复
PCAHR是一个指针,而在DELPHI中数组也看做作成指向第一个数组元素的指针


xuancaoer 2008-04-13
  • 打赏
  • 举报
回复
mark
delphi_new 2008-04-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 lihuasoft 的回复:]
Delphi(Pascal) code

{3楼代码在回贴时被CSDN搞坏,正确如下,注意是最小下标为0的定长Char型array}

var
P : PChar;
A : array[0..255] of char;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
P := A;
Showmessage(Format('@A=%p, @A[0]=%p, P=A=%p',[@A, @A[0], Pointer(P)]));
end;
[/Quote]


我以前在跟踪调试的时候也发现两者相等,但是DELPHI为什么要把PCHAR和array[0..n] of char (N为小于等于255的自然数)等同,为什么这么做呢,
不追根就底我心理不爽啊
delphi_new 2008-04-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 lihuasoft 的回复:]
Delphi(Pascal) code

{3楼代码在回贴时被CSDN搞坏,正确如下,注意是最小下标为0的定长Char型array}

var
P : PChar;
A : array[0..255] of char;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
P := A;
Showmessage(Format('@A=%p, @A[0]=%p, P=A=%p',[@A, @A[0], Pointer(P)]));
end;
[/Quote]


我以前在跟踪调试的时候也发现两者相等,但是DELPHI为什么要把PCHAR和array[0..n] of char (N为小于等于255的自然数)等同,为什么这么做呢,
不追根就底我心理不爽啊
lihuasoft 2008-04-13
  • 打赏
  • 举报
回复


{3楼代码在回贴时被CSDN搞坏,正确如下,注意是最小下标为0的定长Char型array}

var
P : PChar;
A : array[0..255] of char;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
P := A;
Showmessage(Format('@A=%p, @A[0]=%p, P=A=%p',[@A, @A[0], Pointer(P)]));
end;

lihuasoft 2008-04-13
  • 打赏
  • 举报
回复
可以这样理解:

PChar是一种特殊的 array[0..n] of char



var
P : PChar;
A : array[0..255] of char;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
P := A;
{看一下,是同一个地址}
Showmessage(Format('@A=%p, @A[0]=%p, P=A=%p',[@A, @A[0], Pointer(P)]));
end;



但是,如果:

var
A: array[5..255] of char;//或array of char
begin
P:= A;//这样就不行了
dl110 2008-04-12
  • 打赏
  • 举报
回复
这就是Pascal的高明之处.

16,748

社区成员

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

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