- 浏览: 133302 次
- 性别:
文章分类
最新评论
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中的接口和抽象类
2010-12-06 16:30 552接口:Interface Delphi中接口的关键字 ... -
Delphi中票据凭证的精确打印
2011-04-06 15:13 973一、概述 在银行,税务,邮政等行业的实际工作中,经常涉及到在 ... -
Delphi编程中流的应用
2011-05-25 11:19 764一、流的概念 流简单说是建立在面向对象基础上的一种 ... -
Pascal与C的指针
2011-05-26 13:49 983大家都认为,C语言 ... -
Delphi编程的一些资料1
2011-06-16 10:40 705手机 SMS PDU 格式参考手册 1.相关的GSM AT指 ... -
Delphi编程的一些资料2
2011-06-16 10:43 700算法步骤: 一、地址 ... -
Delphi编程的一些资料3
2011-06-16 10:46 767一、一般命令 AT+CGMI ... -
Delphi编程的一些资料4
2011-06-16 10:48 764七、追加服务命令 AT+CCFC 呼叫继续 ... -
Delphi编程的一些资料5
2011-06-16 10:53 756十三、SIM卡工具箱命令 AT+STSF ... -
短信文本模式下的解码方法
2011-06-16 10:57 774接收短信有两种编码格式: 1.中英文混合的为unicode 2 ... -
通过注册表获取当前所有串口号
2011-06-16 15:49 2690usesWindows, Messages, SysUtils ... -
Delphi 分隔GSMModem接收到的短信字符串
2011-06-20 10:37 1067Delphi 分隔GSMModem接收到的短信字符串 ... -
Delphi流的操作
2011-06-22 14:34 788Delphi流的操作 一、流的概念 流简单说是建立在面 ... -
Delphi 判断数据库表是否存在
2011-06-26 12:54 1030//根据表名和一个数据库连接判断表是否存在 function ... -
Delphi ListView基本用法大全
2011-08-22 17:27 1332Delphi ListView基本用法大全 //增加项或列( ... -
Delphi2010 无效的类别字符串, ProgID: "ADOX.Catalog"问题
2012-07-18 09:56 2048程序中用ADOX创建的Access数据库,一直运行正常,其 ... -
Delphi 禁用TEdit右键菜单及复制粘贴
2012-07-19 11:24 1360Delphi 禁用TEdit右键菜单及复制粘贴简的单方法 ... -
Delphi TStrings取得Ini文件键值对
2012-07-20 07:37 1328Delphi TStrings取得Ini文件键值对的简单 ... -
Delphi 压缩Access数据库
2012-07-21 12:21 1599由于Access数据库在反复使用过程中会自动增大,Del ...
相关推荐
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 之间的互相转换
Delphi7升级到Delphi 2010、Delphi XE、Delphi XE2总结 !最后有个项目要移植到64位,所以这个很有用。在2010中PChar已经不再表示PAnsiChar而是表示PWideChar,如果依然这样写,运行时很可能会得到一个内存访问错误。...
java调用delphi动态库的实例 通过实际例子可以掌握这两种语言的结合方法
通过Delphi XE 封装的SHA256加密签名的DLL,并提供DLL的调用demo
Delphi移动文件,其实就是模拟了剪切文件再粘贴文件的效果,比较简单的例子,核心的代码也没几行: begin moveFileEx(pchar(OpenDialog1.FileName),pchar('C:\' extractfilename(opendialog1.FileName)),MOVEFILE_...
Delphi 注册HotKEY热键功能,程序功能包括注册热键、删除热键,比较初级的Delphi自定义热键的例子,仅供Delphi初学者参考,编译请在Delphi7环境下进行。下面来分享两者的具体实现代码: 以下是注册热键的功能,...
Delphi上传文件一例附程序源码,实际上是一个复制文件的例子,设置文件的源路径,再重新定义需要复制后的路径,点击“确定”即可上传复制文件到新目录下。以下是核心的代码: if (Trim(Edit1.Text)<>'')and(Trim...
介绍了delphi中的Char、AnsiChar、WideChar、PChar和PWideChar,并且给出了测试工程代码。
用delphi开发的通用动态库调用,实现了pchar,int,boolean类型的参数调用与返回;
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 ...
很简单的一个例子,用delphi2010编写的,网上有的例子会出现网上的教程是Pchar(IPAddress) 这样会提示 Incompatible types: 'Char' and 'AnsiChar' 处理 解决办法1:参数格式不变,使用的时候麻烦一点。先把...
* 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 ...
Delphi2007之前的API繁简转函数在Delphi2009版本出现后不能用,原因在于之前版本的String默认为AnsiString,而Delphi2007之后的String默认为WideString,同样,PChar指针也就为PAnsiString,所以调用Windows API函数...
测试Delphi的批量打印功能,这个批量打印据说用着很顺手,可批量打印文件,同时你也可研究下,Delphi开发环境下,如何实现批量打印功能。相关代码: procedure TForm1.Button1Click(Sender: TObject); var i:...
Delphi 备份还原注册表,使用了winexec来执行pchar命令,注册表简单备份程序,也可根据备份文件还原注册表内容,在对注册表进行一些重大设置之前,备份注册表是安全这举,这是一个好习惯,若是设置出了问题,还可...
Delphi演示如何一次删除网格数据表dbgrid中的多条记录,小技巧不过挺实用,希望对大家的Delphi编程有所帮助。以下是实现一次删除多条记录的相关代码供参考: if DBGrid1.SelectedRows.Count >1 then s:= '真的要...
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的网络远程唤醒代码,网络上的代码错误很多,这是修改好的可执行源代码,经过测试,能正常唤醒支持网络唤醒的计算机。该代码非常实用。 procedure WakeUp(SAddr: string); var WSAData: TWSAData; ...
MessageBox对话框是比较常用的一个信息对话框,其不仅能够定义显示的信息内容、信息提示图标,而且可以定义按钮组合及对话框的标题,是一个功能齐全的信息对话框信息提示图标,而且可以定义按钮组合及对话框的标题,...