- 浏览: 139492 次
- 性别:
文章分类
最新评论
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 618接口:Interface Delphi中接口的关键字 ... -
Delphi中票据凭证的精确打印
2011-04-06 15:13 1022一、概述 在银行,税务,邮政等行业的实际工作中,经常涉及到在 ... -
Delphi编程中流的应用
2011-05-25 11:19 839一、流的概念 流简单说是建立在面向对象基础上的一种 ... -
Pascal与C的指针
2011-05-26 13:49 1069大家都认为,C语言 ... -
Delphi编程的一些资料1
2011-06-16 10:40 776手机 SMS PDU 格式参考手册 1.相关的GSM AT指 ... -
Delphi编程的一些资料2
2011-06-16 10:43 756算法步骤: 一、地址 ... -
Delphi编程的一些资料3
2011-06-16 10:46 822一、一般命令 AT+CGMI ... -
Delphi编程的一些资料4
2011-06-16 10:48 824七、追加服务命令 AT+CCFC 呼叫继续 ... -
Delphi编程的一些资料5
2011-06-16 10:53 809十三、SIM卡工具箱命令 AT+STSF ... -
短信文本模式下的解码方法
2011-06-16 10:57 834接收短信有两种编码格式: 1.中英文混合的为unicode 2 ... -
通过注册表获取当前所有串口号
2011-06-16 15:49 2752usesWindows, Messages, SysUtils ... -
Delphi 分隔GSMModem接收到的短信字符串
2011-06-20 10:37 1125Delphi 分隔GSMModem接收到的短信字符串 ... -
Delphi流的操作
2011-06-22 14:34 842Delphi流的操作 一、流的概念 流简单说是建立在面 ... -
Delphi 判断数据库表是否存在
2011-06-26 12:54 1150//根据表名和一个数据库连接判断表是否存在 function ... -
Delphi ListView基本用法大全
2011-08-22 17:27 1418Delphi ListView基本用法大全 //增加项或列( ... -
Delphi2010 无效的类别字符串, ProgID: "ADOX.Catalog"问题
2012-07-18 09:56 2152程序中用ADOX创建的Access数据库,一直运行正常,其 ... -
Delphi 禁用TEdit右键菜单及复制粘贴
2012-07-19 11:24 1405Delphi 禁用TEdit右键菜单及复制粘贴简的单方法 ... -
Delphi TStrings取得Ini文件键值对
2012-07-20 07:37 1365Delphi TStrings取得Ini文件键值对的简单 ... -
Delphi 压缩Access数据库
2012-07-21 12:21 1693由于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 之间的转换是非常直观的。然而,在实际应用中需要注意一些细节,例如: - 当使用指针时,确保它们指向的有效...
在Delphi编程环境中,这样的转换操作是至关重要的,特别是在涉及到RS232和RS485串口通信以及SOCKET网络通讯时。这是因为串口通信和网络通讯中的数据通常是以16进制的形式传输和解析的。 首先,我们来理解一下16进制...
PChar和PWideChar是字符指针类型,分别指向Char和WideChar数组的首地址。在Delphi中,PChar通常用于存储和传递C风格的字符串,即以空字符'\0'结尾的一系列Char。而PWideChar则用于Unicode字符串,它可以处理更广泛的...
首先,`PChar`是Delphi中的一个基本类型,它是一个无符号整型指针,通常用来表示字符数组的起始地址,即C语言风格的字符串。`PChar`可以被看作是一个指向单个`Char`类型的指针,而`Char`在Delphi中是Unicode字符,...
通过以上详细的对应关系介绍,我们可以看出,尽管Delphi和C++在数据类型的命名和使用上存在一定的差异,但大多数情况下都可以找到直接或间接的对应关系。这对于进行跨语言编程或代码移植时非常有用,能够帮助开发者...
Delphi作为一种强大的开发工具,在进行程序设计时,正确地管理内存对于确保程序的稳定性和性能至关重要。本文将深入探讨Delphi中的内存分配机制,包括常用的内存管理函数及其应用场景,帮助开发者更好地理解如何有效...
在本文中,我们将深入探讨一些重要的Delphi字符串函数,这些函数可以帮助你高效地处理和比较字符串。 1. **StrComp**: - `StrComp(const Str1, Str2: PChar): Integer` 函数用于比较两个PChar类型的字符串,即C...
例如,字符串可以转换为`PChar`,然后通过`StrCopy`函数复制到字符数组,或者直接通过`PChar`进行转换。 4. **DLL的用途**: - 共享代码:DLL使开发者可以在多个应用程序之间复用相同的代码,提高开发效率。 - ...
C++有自定义的指针、引用、模板类等,而Delphi则有其独特的记录、接口、动态数组等。例如,C++的`int`在Delphi中可能是`Integer`,`void*`需要转换为`Pointer`,类指针可能需要转换为Delphi的接口。对于模板类,通常...
在Delphi编程环境中,获取本机的IP地址和计算机名称是常见的网络编程需求。通过使用WinSock库,我们可以轻松实现这一功能。WinSock是Windows Socket接口的简称,它为应用程序提供了一种标准的方法来实现网络通信。在...
这个函数存在于 `WinAPI.Windows` 单元中,它接受一个字符数组和一个大小变量作为参数,用于存储计算机名称。在 Delphi 代码中,我们创建了一个 `GetHostName` 函数,该函数调用 `GetComputerName` 并将结果转换为...
### Delphi指针详解 #### 引言 在编程领域,指针的使用极大地扩展了程序的功能性和灵活...理解并掌握Delphi中的指针机制,能够帮助开发者更好地控制内存资源,提高程序性能,特别是在底层编程和系统级开发中尤为重要。
总结,Delphi 的指针机制虽然在语法上与 C 语言有所不同,但功能上同样强大,提供了类型安全的指针操作,包括类型指针、无类型指针、解除引用、取地址、指针运算、动态内存管理、字符数组运算和函数指针等,使得...
FileBuf: array[1..10] of Char; // 定义一个包含10个字符的数组 A: String; begin If OpenDialog1.Execute then begin MyFile := TMemoryStream.Create; MyFile.LoadFromFile(OpenDialog1.FileName); MyFile....
本篇将详细阐述Delphi中的指针概念和应用,帮助开发者深入理解这一关键特性。 1. **类型指针的定义** 在Delphi中,类型指针用于指向特定数据类型的变量。例如,如果要定义一个指向整型的指针,可以写作: ```...
// PChar 可以看作 ^Char begin ptr := @a; Inc(ptr); // 等价于 C 的 ptr++ Inc(ptr, 2); // 等价于 C 的 ptr += 2; end; ``` #### 七、动态内存分配 在 C 语言中,使用 `malloc()` 函数分配内存,`free()` ...
CreateFile(PChar(Format('\\\\.\\%c:', [Char(DriveNo + 'A' - 1)])), GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0), IOCTL_STORAGE_QUERY_PROPERTY, @...
然后,将每个磁盘的信息存储在一个数组或列表中,这样便于后续的处理和显示。 ```delphi type TDiskInfo = record DriveLetter: Char; TotalBytes: Int64; UsedBytes: Int64; FreeBytes: Int64; end; var ...