提个幼稚的问题,delphi string变量和‘’之间的字符和pchar有什么区别?? 提个幼稚的问题,delphi string变量和‘’之间的字符和pchar有什么区别??还有字符数组等等 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 ‘’之间不是字符,还是字符串。多个pchar是字符数组。字符串其实就是字符数组。 string变量是一个内存安全的字符串结构单元;''这样的字符串是字符串常量;pchar是一个按char描述的数据指针。 一:各种字符串 字符串是Object Pascal所有数据类型中最有用的类型。许多函数以字符串为传递参数。由于在Delphi中字符串的定义和使用有各种方式,包括Pascal中典型的字符串(String),Delphi支持的长字符串(ANSIString),类似于C语言的字符数组(Array of Char),指向字符的指针(Pchar)等。下面的文章就跟谈谈这些类型在定义和应用中的区别和注意事项。 1. 传统的Pascal字符串 在Pascal中,典型的字符串是一定长度的字符序列。每一字符串有一设定的长度(缺省值为255),下面是一个例子: Var Address:String; Code:String[50]; Address是一长度为255的字符串,Code的最大长度为50。 传统的Pascal字符串长度不能超过255。 可以用字符串连接操作"+"把字符串连接在一起: Result:=String1+String2; 2. Delphi中的长字符串 Delphi除了支持传统的Pascal短字符串还支持长字符串。长字符称为ANSIString。长字符串动态分配内存,即用字符串时才分配字符串所需内存,所以其长度不受限制。在Delphi中你如果用String1:String作类型说明,则String1既可能是短字符串也可能是长字符串,这取决于编译器中$H开关的设置。默认值为$H+,代表ANSI长字符串,VCL中的组件使用ANSI长字符串。长字符串以null结束,这就说明长字符串与C语言中的以null结束的字符串完全兼容。 可以通过SetLength函数设置字符串的最大长度: SetLength(String1,100);用TrimLeft,TrimRight和Trim函数分别来消除字符串开头,结尾和首尾的空白区。 3. 类似于C的字符数组 可以用以0为起点的数组来存储以null结束的字符串。如下定义: Var Name:Array[0..50] of Char; 4. Pchar指针 如果Delphi中的Exended Syntax 已经设置(缺省值),以0为起点的字符数组就和指向字符的指针Pchar完全兼容,因为以0为起点的字符数组名即指向该字符数组首字符的指针。可以将字符串直接付值给Pchar指针。例如: var P: PChar; begin P := 'Hello world'; end; 这样P就指向存储字符串'Hello world'并以null结束的一块内存。 许多Windows的应用程序接口API函数要求用Pchar类型作参数。Pchar指针在使用是首先用GetMem(var P: Pointer; Size: Integer)函数申请分配内存,程序结束时用FreeMem(var P: Pointer[; Size: Integer])函数释放内存。例如: Var WinDir,SysDir:Pchar; Begin GetMem(WinDir,256);{为指针分配内存} GetWindowsDirectory(WinDir,128);{将Windows安装目录放至WinDir} ShowMessage('Windows directory is'+WinDir);{显示结果} End; 二:字符串转换 以上介绍了Delphi中的四类字符串的定义和使用。由于各类函数对字符串参数类型要求不一,这就需要进行字符串类型转换。 1. 可以用StrPas将以null结束的字符串转换为Pascal短字符串。StrpCopy则完成相反的转换。 2. 因为长字符串以null结束,所以可以用强制类型转换将长字符串转换成Pchar类型。用法是:Pchar(s),s是一个长字符串。强制类型转换返回一个指向长字符串首字符的指针,并且所指字符串以null 结束。例如: Var Caption,Message:string; Caption:='Hello World!'; Mssage:='This is a test of long string'; MessageBox(0,Pchar(Message),Pchar(Caption),MB_OK); 小结:在使用Delphi中的字符串时,要时刻清楚该字符串的类型,以免引起混淆。在理解字符串时要把字符串与指针,内存分配联系起来,加强理解。 string是char数组的扩展,兼容char数组它实质是pchar指针,指向的数据是扩展类型的char数组string的数据结构相当于 Tstring = record refcount: Integer;// 引用此时 为0时delphi会自动将tstring回收 length : integer;// 长度 chars : array[1..length] of char; //***---->string=@chars end; string = @TString.chars; //当然不能这样写,只是表达这种意思 其实PChar是和C语言中的字符串指针兼容的,如果你写的程序要和C互调,最好转换。要是纯Delphi调用就可以用string了。还有string支持从PChar复制字符串。 同意5楼,其实你开cpu调试看一下就明白了。如果设string=‘aa’;那么在内存中string实际放的是‘aa’的地址,跳到这个地址,在‘aa’的前面放的是‘aa’的长度 新手请教关于SQL语句的执行问题!!! 求助~~~关于动态创建的控件问题...UP者都有分 问问子串转换成日期型是什么函数?谢谢! 哪里有XP样的图标下? 请问有人知道windows中带的程序的关于是调用的哪些文件吗? 收到了BORLAND寄来的奖品,送分庆祝,请斑竹不要介意! 学习计算机的女孩子该往何去:( 替换无类型文件中的字符串 请教版主及高手们:如何实现类似ACDSEE的ZIP文件内容浏览??谢谢!!!! 问个问题,inherited有啥用?? delphi群,欢迎和喜欢delphi的朋友一起成长,进步 VCL框架评价向来是很高的,但今天我搞个小玩意儿却有了点想法,但愿是我不对
字符串是Object Pascal所有数据类型中最有用的类型。许多函数以字符串为传递参数。由于在Delphi中字符串的定义和使用有各种方式,包括Pascal中典型的字符串(String),Delphi支持的长字符串(ANSIString),类似于C语言的字符数组(Array of Char),指向字符的指针(Pchar)等。下面的文章就跟谈谈这些类型在定义和应用中的区别和注意事项。
1. 传统的Pascal字符串
在Pascal中,典型的字符串是一定长度的字符序列。每一字符串有一设定的长度(缺省值为255),下面是一个例子:
Var
Address:String;
Code:String[50];
Address是一长度为255的字符串,Code的最大长度为50。
传统的Pascal字符串长度不能超过255。
可以用字符串连接操作"+"把字符串连接在一起:
Result:=String1+String2;
2. Delphi中的长字符串
Delphi除了支持传统的Pascal短字符串还支持长字符串。长字符称为ANSIString。长字符串动态分配内存,即用字符串时才分配字符串所需内存,所以其长度不受限制。在Delphi中你如果用String1:String作类型说明,则String1既可能是短字符串也可能是长字符串,这取决于编译器中$H开关的设置。默认值为$H+,代表ANSI长字符串,VCL中的组件使用ANSI长字符串。长字符串以null结束,这就说明长字符串与C语言中的以null结束的字符串完全兼容。
可以通过SetLength函数设置字符串的最大长度:
SetLength(String1,100);用TrimLeft,TrimRight和Trim函数分别来消除字符串开头,结尾和首尾的空白区。
3. 类似于C的字符数组
可以用以0为起点的数组来存储以null结束的字符串。如下定义:
Var
Name:Array[0..50] of Char;
4. Pchar指针
如果Delphi中的Exended Syntax 已经设置(缺省值),以0为起点的字符数组就和指向字符的指针Pchar完全兼容,因为以0为起点的字符数组名即指向该字符数组首字符的指针。可以将字符串直接付值给Pchar指针。例如:
var
P: PChar;
begin
P := 'Hello world';
end;
这样P就指向存储字符串'Hello world'并以null结束的一块内存。
许多Windows的应用程序接口API函数要求用Pchar类型作参数。Pchar指针在使用是首先用GetMem(var P: Pointer; Size: Integer)函数申请分配内存,程序结束时用FreeMem(var P: Pointer[; Size: Integer])函数释放内存。例如:
Var WinDir,SysDir:Pchar;
Begin
GetMem(WinDir,256);{为指针分配内存}
GetWindowsDirectory(WinDir,128);{将Windows安装目录放至WinDir}
ShowMessage('Windows directory is'+WinDir);{显示结果}
End;
二:字符串转换
以上介绍了Delphi中的四类字符串的定义和使用。由于各类函数对字符串参数类型要求不一,这就需要进行字符串类型转换。
1. 可以用StrPas将以null结束的字符串转换为Pascal短字符串。StrpCopy则完成相反的转换。
2. 因为长字符串以null结束,所以可以用强制类型转换将长字符串转换成Pchar类型。用法是:Pchar(s),s是一个长字符串。强制类型转换返回一个指向长字符串首字符的指针,并且所指字符串以null 结束。例如:
Var
Caption,Message:string;
Caption:='Hello World!';
Mssage:='This is a test of long string';
MessageBox(0,Pchar(Message),Pchar(Caption),MB_OK);
小结:在使用Delphi中的字符串时,要时刻清楚该字符串的类型,以免引起混淆。在理解字符串时要把字符串与指针,内存分配联系起来,加强理解。
它实质是pchar指针,指向的数据是扩展类型的char数组
string的数据结构相当于
Tstring = record
refcount: Integer;// 引用此时 为0时delphi会自动将tstring回收
length : integer;// 长度
chars : array[1..length] of char; //***---->string=@chars
end;
string = @TString.chars; //当然不能这样写,只是表达这种意思
如果设string=‘aa’;
那么在内存中string实际放的是‘aa’的地址,跳到这个地址,在‘aa’的前面放的是‘aa’的长度