[DELPHI]字符/字符串学习(一)

news/2024/7/20 14:52:32 标签: 内存管理

以下内容引用"dephi5开发人员指南":

字符:用来代表单个字符的类型,Delphi有三种类型的字符:

AnsiChar:标准的1字节的ANSI字符

WideChar:2字节的Unicode字符

Char:相当于WideChar,但在Delphi以后版本中相当于WideChar.

注:一个字符在长度上并不代表是一个字节,所以不能程序中对字符长度进行硬编码,而应该使用Sizeof函数。

字符串:

字符串是代表一组字符的变量类型,每一种语言都有自己的字符串类型的存储和使用方法。
Pascal类型有下列几种不同的字符串类型来满足程序的要求:

AnsiString:这是Pascal缺省的字符串类型,它由AnsiCahr字符组成,其长度没有限制,与null结束的字符串相容

特点:

1:动态分配的并有自动回收功能

2:总是以null字符结束

3:复制字符串因为仅仅是复制了指针而不是复制实际的字符串而变得非常快

4:Delphi内存管理使用了Copy-on-write技术,一个字符串要等到修改结束,才释放一个引用并分配一个物理字符串

5:第一次声明AnsiString时,它是没有长度的,因此在字符串中就没有为字符分配空间。为了对字符
      串分配空间,用一行字母或另一个字符串对它进行赋值,或者用SetLength()过程

6:能像数组一样对字符串进行索引

7:Sizeof返回值是定义的长度加1,因为定长字符串会多出一个首字节来记忆字符串的实际长度。

 

ShortString:向后兼容,长度是255的字符

WideString:功能上类似于AnsiString,但它是由WideChar字符组成

WideString和AnsiString的不同主要在三个方面

1:WideString由WideChar字符组成,而不是由AnsiChar字符组成的,它们跟Unicode字符串兼容

2:WideString用SysAllocStrLen() API函数进行分配,它们跟OLE的BSTR字符串相兼容

3:WideString没有引用计数,所以将一个WideString字符串赋值给另一个WideString字符串时,就
需要从内存中的一个位置复制到另一个位置。这使得 WideString在速度和内存的利用上不如AnsiString有效

PChar:指向null结束的Char字符串的指针,类似于C的char * 或l p s t r类型。

特点:与AnsiString和WideString类型不同,PChar的内存不是由Object Pascal自动产生和管理的,要用Object Pascal的内存管理函数来为
PChar所指向的内存进行分配。 PChar字符串的理论最大长度是4GB

内存分配函数 内存释放函数
AllocMem()     FreeMem()
GlobalAlloc()  GlobalFree()
GetMem()       FreeMem()
New()              Dispose()
StrAlloc()        StrDispose()
StrNew()         StrDispose()
VirtualAlloc()   VirtualFree()

PAnsiChar:指向null结束的AnsiChar字符串的指针。

PWideChar:指向null结束的WideChar字符串的指针。

/*---------------------------------------------------------------------------------------------*/

D2009以上:Char-->WideChar   String-->UnicodeString

D2009以下:Char-->Char   String-->AnsiString

{------------------------------------------------------------------------------------------------------------------------------------------}

{*简单的说,在D2010中有3中字符串类型:
AnsiString:主要用来表示MBCS编码的ANSI字符串以及UTF-8字符串;
UnicodeString:(string为其别名),用来表示UTF-16编码的Unicode字符串;
WideString:用来表示UTF-16编码的Unicode字符串,和COM兼容;

其中,UnicodeString和WideString的区别在于,前者支持引用计数,而后者不支持,但兼容OLESTR。*}

转载于:https://www.cnblogs.com/moon25/archive/2009/11/04/1595756.html


http://www.niftyadmin.cn/n/1638004.html

相关文章

av_sample_get_buffer_size

转自http://blog.csdn.net/oldmtn/article/details/48048687 音频一般是采用成PCM格式,而计算PCM格式音频尺寸,就需要如下几个参数。 通道数,采样频率,采用格式。 通道数:个人理解,就是同时有个几个设备在…

SDL_AudioSpec结构体

参考http://www.dreamingwish.com/article/sdl_audiospec.html int freq DSP 频率 (每秒采样); 详情参考“讨论” SDL_AudioFormat format 音频数据格式;详情参考“讨论” Uint8 channels 声道数: 1 单声道, 2 立体声; 详情参考“讨论” Uint8 silence audio buffer…

错误信息 error: variably modified 'buf' at file scope char buf[bufsize];

Const的要求 a)定义常量 b)修饰函数的参数和返回值,甚至定义函数体 c)在C语言中它总是要占用内存的,而且它的名字是全局符。C编译器不能把const看成一个编译期间的常量 d)C语言默认const修饰的变量时外部链接,但是C默认的是内部链接 例子&am…

c++相对c是强类型语言

孤立地判定一个语言是弱类型还是强类型是没有意义的,因为在学术界还没有"strongly typed language"的统一的定义。我们只能说语言A相对于语言B是强类型的。笼统地将,强类型语言是能够禁止任何违反类型系统的代码的语言,或者说是能够…

文档/视图下主窗口屏幕居中

在CWinApp类的InitInstance()中添加如下代码 RECT rc; ::GetWindowRect( m_pMainWnd->m_hWnd, &rc ); ::SetWindowPos( m_pMainWnd->m_hWnd, HWND_TOP, ( GetSystemMetrics( SM_CXSCREEN ) - ( rc.right - rc.left ) ) / 2, ( GetSystemMetrics( SM_CYSCREEN ) - …

AAC音频格式(把AAC打包成ADTS)

1、AAC AAC(Advanced Audio Coding),中文名:高级音频编码,出现于1997年,基于MPEG-2的音频编码技术。由Fraunhofer IIS、杜比实验室、AT&T、Sony等公司共同开发,目的是取代MP3格式。2000年&…

生成静态页

using System.Text;    try{using (StreamWriter sw new StreamWriter(Server.MapPath("01.htm"), false, System.Text.Encoding.GetEncoding("GB2312"))){sw.WriteLine("" user2.Name "," user2.Pwd "");sw.Flush…

AAC音频码流解析

转自http://blog.csdn.net/leixiaohua1020/article/details/50535042?locationNum3&fps1 获取ADTS帧,根据buf的大小比7字节还小,返回错误-1.先判断同步字(两个字节)是否为前12位全为1.帧的大小(包括13位&#xf…