`

Delphi、PChar和Char数组的比较

阅读更多

Delphi、PChar和Char数组的比较

string和Char数组都是一块内存, 其中存放连续的字符. string保存具体字符的内存对用户
是透明的, 由Delphi管理它的分配, 复制和释放, 用户不能干预(其实也可以, 不过是通过
非法途径). Char数组就不必说了吧?
PChar是一个指针, 它的大小只有32位. 定义时由Delphi自动填0. 要将PChar作为字符串
使用的话必须自己分配内存用完必须自己释放. PChar型字符串由#0表示字符串结尾
Delphi所提供的相关PChar字符串的操作都是判断#0来决定字符串的结尾的。
因为PChar是指针,所以它能指向任何地方(也就是说它不一定非要指向字符串不可).
把一个String赋值给PChar只是将String中保存具体字符串的内存的地址给PChar
变量. 当然也可以把Char数组第一个元素的地址给PChar.
至于 哪个占用内存小, Char数组<PChar(指分配过字符串的)<string(除了具体字符串外
还 包含字符串长度)
如果空字符串那么PChar<String<array [0..n] of Char
从速度来说毫无疑问string最慢, 例如:
作为参数传递(非var调用时)给过程时string将整个字串的副本传递过去, PChar将指针
本身的副本传递过去(32位), Char数组和PChar一样, 传递的是第一个元素的地址副本.
不过就灵活性来说string最高, 而且Delphi支持的函数最多. 另外可以将String作为
Buffer使用(因为它当中可以包含字符0).

amo (2000-9-20 1:35:26)
----------------------------------------------------------------------------------
在Delphi2.0以后的版本中,
string分两种,
一种是与Pascal传统string相兼容,叫ShortString,
它的存储结构如下:
+---------------------+
| 1Byte | 字符串内容 |
+---------------------+
0 1 ......
其中第一个字节为字符串的长度。
所以ShortString所能包括的字符串长度不能大于255。
另一种是叫长字符串AnsiString, 它就是一个指向字符串的指针,不过具体的存储有些特别。
它的存储结构如下:
+-----------------------+
| 4B | 4B | 字符串内容 |
+-----------------------+
-8 -4 0 ......
其中,AnsiString指向字符串第一个字符,
在第一个字符的反方向第1到第4的4个字节表示字符串长度,第5到第8的4个字节表字符串被引用的次数。

pchar就是纯指向字符串(#0字符结尾)的指针,与C语言中的char *是一样的。

char数组也是指向字符串的指针,它与pchar的区别在于:
1.char数组(均指非动态数组)一旦定义好,它的长度就固定了;
2.char数组的地址是常量,不能另赋其它值,不能象pchar一样,
如: sPchar:pchar; sArray1,sArray2:array[0..80]of char;
sPChar:=sArray2; sPChar;=sArray1;
但不能sArray2:=sArray1;
char数组就相当于const char *

要说速度最快当然是纯指针操作的pchar与char数组最快啦
所谓占内存最少,效率更高,
不知老兄你想进行什么方面的应用,
一般对string,pchar或char数组,不用考虑这些。

对编程而言,如果在Delphi或C++Builder中使用,可尽量使用AnsiString,
Borland公司对它已经进行了非常完美的内部处理,
使用非常方便。
如果涉及到Windows API或混合编程等,接口部分一般使用pchar。

char数组使用的比较少了,因为多数可以用char数组的地方,
现在比较流行的作法是定义一个ansistring, 再用setlength来设定它的长度。

lycwg (2001-1-12 11:53:20)
------------------------------------------------------------
三、字符串string 字符数组与指向字
  符串的指针pchar的区别与联系
  这3者的基本概念相同,但有一些非常细微的差别,在编程时稍不注意就会出错,需高度重视。
  1、使用指向字符串的指针,如果不是以0结尾,运行时就会出现错误。为了避免这种错误,需要在字符串结尾人工加入0 即char(0),或用strpcopy函数在字符串结尾自动加0。
  例1: 指向字符串的指针,如果不是以0结尾,运行时会出现错误:
  {s[0]=3 s[1]='n' s[2]='e' s[3]='w'}
  var
  s:string;
p:pchar;
  begin
  s:='new';
  label1.caption:=s; {new}
 label2.caption:=intTostr(integer(s[0]));{3是字符串的长度}
  p:=@s[1];{不是以0结尾,莫用pchar型指针}
   label3.caption:=strpas(p); {运行时出现错误}
  end;

  例2:在字符串结尾人工加入0即char(0),可使用指向字符串的指针。
  {s[0]=4 s[1]='n' s[2]='e' s[3]='w' s[4]=0;}
  {p-->'new'}
  var
s:string;
p:pchar;
  begin
  p:=@s[1];
  s:='new'+char(0); {以0结尾,可用pchar型指针}
  label1.caption:=strpas(p); {new}

注意:

procedure GetMem(var P: Pointer; Size: Integer);

//分配动态内存

function StrPas(const Str: PChar): string;

//将PChar转换为String

分享到:
评论

相关推荐

    Delphi String类型和PChar类型使用的区别.rar

    Delphi 以实例演示String类型和PChar类型使用的区别,演示了PChar静态分配空间和PChar动态分配空间:  procedure TForm1.Button1Click(Sender: TObject);  var  PStr:array [0..100] of Char;  begin  StrPCopy...

    delphi中String,PChar,PByte,Array of Char,Array of Byte 互相转换

    delphi中String,PChar,PByte,Array of Char,Array of Byte 之间的互相转换

    Delphi7升级到Delphi 2010、Delphi XE、Delphi XE2总结

    Delphi7升级到Delphi 2010、Delphi XE、Delphi XE2总结 !最后有个项目要移植到64位,所以这个很有用。在2010中PChar已经不再表示PAnsiChar而是表示PWideChar,如果依然这样写,运行时很可能会得到一个内存访问错误。...

    java调用delphi动态库的实例

    java调用delphi动态库的实例 通过实际例子可以掌握这两种语言的结合方法

    Delphi SHA256加密签名

    通过Delphi XE 封装的SHA256加密签名的DLL,并提供DLL的调用demo

    Delphi moveFileEx文件移动示例.rar

    Delphi移动文件,其实就是模拟了剪切文件再粘贴文件的效果,比较简单的例子,核心的代码也没几行:  begin moveFileEx(pchar(OpenDialog1.FileName),pchar('C:\' extractfilename(opendialog1.FileName)),MOVEFILE_...

    Delphi 注册和删除热键举例.rar

    Delphi 注册HotKEY热键功能,程序功能包括注册热键、删除热键,比较初级的Delphi自定义热键的例子,仅供Delphi初学者参考,编译请在Delphi7环境下进行。下面来分享两者的具体实现代码:  以下是注册热键的功能,...

    Delphi上传文件(复制)一例.rar

    Delphi上传文件一例附程序源码,实际上是一个复制文件的例子,设置文件的源路径,再重新定义需要复制后的路径,点击“确定”即可上传复制文件到新目录下。以下是核心的代码:  if (Trim(Edit1.Text)<>'')and(Trim...

    Delphi中的字符与字符串.rar

    介绍了delphi中的Char、AnsiChar、WideChar、PChar和PWideChar,并且给出了测试工程代码。

    用delphi开发的通用动态库调用程序(带源码)

    用delphi开发的通用动态库调用,实现了pchar,int,boolean类型的参数调用与返回;

    delphi非常好的 取得硬件ID

    delphi非常好用的获得硬件ID。 uses u_MD5, Windows, ShellApi, Classes, SysUtils; {$I u_Const.pas} {$IFDEF NEWVER} //for Delphi2009 or higher function GetDllVer:PAnsiChar; stdcall; export; function ...

    Delphi通过主机名获取IP

    很简单的一个例子,用delphi2010编写的,网上有的例子会出现网上的教程是Pchar(IPAddress) 这样会提示 Incompatible types: 'Char' and 'AnsiChar' 处理 解决办法1:参数格式不变,使用的时候麻烦一点。先把...

    delphi2-delphi2010 全支持 dcu 装换 pas

    * All char types(AnsiChar, Char, WideChar) * All boolean types(Boolean, ByteBool, LongBool, WordBool) * Enumerated type, subrange of enumerated type and set of enumerated type For examples: type ...

    Delphi2009、Delphi2010的GBK繁体转简体函数

    Delphi2007之前的API繁简转函数在Delphi2009版本出现后不能用,原因在于之前版本的String默认为AnsiString,而Delphi2007之后的String默认为WideString,同样,PChar指针也就为PAnsiString,所以调用Windows API函数...

    测试Delphi的批量打印功能.rar

    测试Delphi的批量打印功能,这个批量打印据说用着很顺手,可批量打印文件,同时你也可研究下,Delphi开发环境下,如何实现批量打印功能。相关代码:  procedure TForm1.Button1Click(Sender: TObject);  var  i:...

    Delphi 使用winexec执行备份还原注册表.rar

    Delphi 备份还原注册表,使用了winexec来执行pchar命令,注册表简单备份程序,也可根据备份文件还原注册表内容,在对注册表进行一些重大设置之前,备份注册表是安全这举,这是一个好习惯,若是设置出了问题,还可...

    Delphi如何一次删除dbgrid多条记录的例子.rar

    Delphi演示如何一次删除网格数据表dbgrid中的多条记录,小技巧不过挺实用,希望对大家的Delphi编程有所帮助。以下是实现一次删除多条记录的相关代码供参考:  if DBGrid1.SelectedRows.Count >1 then s:= '真的要...

    Delphi5开发人员指南

    4.1 理解Delphi环境和项目的体系结构 79 4.2 构成Delphi 5项目的文件 79 4.2.1 项目文件 80 4.2.2 单元文件 80 4.2.3 窗体文件 80 4.2.4 资源文件 81 4.2.5 项目选项及桌面设置文件 81 4.2.6 备份文件 81 4.2.7 包...

    Delphi 网络远程唤醒

    基于Delphi的网络远程唤醒代码,网络上的代码错误很多,这是修改好的可执行源代码,经过测试,能正常唤醒支持网络唤醒的计算机。该代码非常实用。 procedure WakeUp(SAddr: string); var WSAData: TWSAData; ...

    delphi资源-MessageDLG

    MessageBox对话框是比较常用的一个信息对话框,其不仅能够定义显示的信息内容、信息提示图标,而且可以定义按钮组合及对话框的标题,是一个功能齐全的信息对话框信息提示图标,而且可以定义按钮组合及对话框的标题,...

Global site tag (gtag.js) - Google Analytics