`

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 之间的转换是非常直观的。然而,在实际应用中需要注意一些细节,例如: - 当使用指针时,确保它们指向的有效...

    Delphi字符串16进制互相转换

    在Delphi编程环境中,这样的转换操作是至关重要的,特别是在涉及到RS232和RS485串口通信以及SOCKET网络通讯时。这是因为串口通信和网络通讯中的数据通常是以16进制的形式传输和解析的。 首先,我们来理解一下16进制...

    Delphi中的字符与字符串.rar

    PChar和PWideChar是字符指针类型,分别指向Char和WideChar数组的首地址。在Delphi中,PChar通常用于存储和传递C风格的字符串,即以空字符'\0'结尾的一系列Char。而PWideChar则用于Unicode字符串,它可以处理更广泛的...

    delphi指针实例

    首先,`PChar`是Delphi中的一个基本类型,它是一个无符号整型指针,通常用来表示字符数组的起始地址,即C语言风格的字符串。`PChar`可以被看作是一个指向单个`Char`类型的指针,而`Char`在Delphi中是Unicode字符,...

    delphi和c++的数据类型对应

    通过以上详细的对应关系介绍,我们可以看出,尽管Delphi和C++在数据类型的命名和使用上存在一定的差异,但大多数情况下都可以找到直接或间接的对应关系。这对于进行跨语言编程或代码移植时非常有用,能够帮助开发者...

    delphi内存分配完全总结

    Delphi作为一种强大的开发工具,在进行程序设计时,正确地管理内存对于确保程序的稳定性和性能至关重要。本文将深入探讨Delphi中的内存分配机制,包括常用的内存管理函数及其应用场景,帮助开发者更好地理解如何有效...

    Delphi字符串函数大全

    在本文中,我们将深入探讨一些重要的Delphi字符串函数,这些函数可以帮助你高效地处理和比较字符串。 1. **StrComp**: - `StrComp(const Str1, Str2: PChar): Integer` 函数用于比较两个PChar类型的字符串,即C...

    Delphi 调用VC生成的DLL

    例如,字符串可以转换为`PChar`,然后通过`StrCopy`函数复制到字符数组,或者直接通过`PChar`进行转换。 4. **DLL的用途**: - 共享代码:DLL使开发者可以在多个应用程序之间复用相同的代码,提高开发效率。 - ...

    C++的头文件转换为delphi定义

    C++有自定义的指针、引用、模板类等,而Delphi则有其独特的记录、接口、动态数组等。例如,C++的`int`在Delphi中可能是`Integer`,`void*`需要转换为`Pointer`,类指针可能需要转换为Delphi的接口。对于模板类,通常...

    在Delphi中获取本机的IP地址和计算机名称

    在Delphi编程环境中,获取本机的IP地址和计算机名称是常见的网络编程需求。通过使用WinSock库,我们可以轻松实现这一功能。WinSock是Windows Socket接口的简称,它为应用程序提供了一种标准的方法来实现网络通信。在...

    用Delphi写的获取本机IP和机名

    这个函数存在于 `WinAPI.Windows` 单元中,它接受一个字符数组和一个大小变量作为参数,用于存储计算机名称。在 Delphi 代码中,我们创建了一个 `GetHostName` 函数,该函数调用 `GetComputerName` 并将结果转换为...

    delphi指针大全

    ### Delphi指针详解 #### 引言 在编程领域,指针的使用极大地扩展了程序的功能性和灵活...理解并掌握Delphi中的指针机制,能够帮助开发者更好地控制内存资源,提高程序性能,特别是在底层编程和系统级开发中尤为重要。

    Delphi指针使用文档

    总结,Delphi 的指针机制虽然在语法上与 C 语言有所不同,但功能上同样强大,提供了类型安全的指针操作,包括类型指针、无类型指针、解除引用、取地址、指针运算、动态内存管理、字符数组运算和函数指针等,使得...

    Delphi_用流来读取TXT文件

    FileBuf: array[1..10] of Char; // 定义一个包含10个字符的数组 A: String; begin If OpenDialog1.Execute then begin MyFile := TMemoryStream.Create; MyFile.LoadFromFile(OpenDialog1.FileName); MyFile....

    delphi指针大全.pdf

    本篇将详细阐述Delphi中的指针概念和应用,帮助开发者深入理解这一关键特性。 1. **类型指针的定义** 在Delphi中,类型指针用于指向特定数据类型的变量。例如,如果要定义一个指向整型的指针,可以写作: ```...

    浅谈Delphi的指针

    // PChar 可以看作 ^Char begin ptr := @a; Inc(ptr); // 等价于 C 的 ptr++ Inc(ptr, 2); // 等价于 C 的 ptr += 2; end; ``` #### 七、动态内存分配 在 C 语言中,使用 `malloc()` 函数分配内存,`free()` ...

    delphi获取硬盘序列号源码

    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检测各磁盘容量,柱状图显示..rar

    然后,将每个磁盘的信息存储在一个数组或列表中,这样便于后续的处理和显示。 ```delphi type TDiskInfo = record DriveLetter: Char; TotalBytes: Int64; UsedBytes: Int64; FreeBytes: Int64; end; var ...

Global site tag (gtag.js) - Google Analytics