大家来讨论一下pascal的几种字符串的 数据结构 1.ANSIString,WideString;2.Char[]动态数组,静态数组;3.PChar4.const不全的话请大家补充。讨论点:1.内存中的存储结构,存取算法2.那些用Unicode,那些用ASSIC 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 楼主提的这个讨论比较有意思我来补充一点:还有ShortString、string 通常定义的string就是ansistring,当然也可以能过改变编译指示字的开关来改成widestring;string粗看起来也象是char数组,因为你可以用string[2]索引来访问字串中的内容.使用string的好处是你不必自己定义字符串的长度,所以你可以很轻松的将'aaa'赋给string,或是'adfasdfadsf'赋给string,不过string索引是不会检查边界的,这就意味着你可以用vars:string;s:='aa';showmessage(s[100]);//并不会出错而且a:string[2]与setleng(a,2)也是有区别的。a:string[2]默认是从0-2,setleng是从1-2;如果你事先用了string[2],在后面使用setleng来改变范围则是不起作用的.widesring与ansistring的区别是一个是双字节存放,一个是单字节存放。比如a:string;b:widestring;a:='中国';b:='中国'showmessage(a[1]+a[2]);//显示中showmessage(b[1]);//显示中因为一个汉字是由二个字节组成的。a:array[0..5] of char; //动态b:array[1..5] of char; //静态a可以赋于'abc','a','abcdef',只要不超过6位,而b却要一次把5位全赋值,b:='abc';//就会出错,要b:='abcde';//这才能行。并且动态的字符数组值默认为#0,而静态的却没有默认值,比如a[0]:='a';a[1]:='b';a[3]:=c';showmessage(a);//显示ab,这里必须要给0,和1下标赋值。不然出现的结果会出人意料,具体怎么回事还不清楚。b[1]:='a';b[2]:='b';b[4]:='c';showmessage(b);//显示ab,cw(可见这里是让5位来显示的)pchar类型的长度也是动态的,因为pchar本身只是一个指针,赋给它的字符串只是临时存放在内存中,然后返回首地址给pchar;vara:pchara:='abcdefg1234567';showmessage(inttostr(length(a))); //显示14showmessage(a); //显示abcdefg1234567a:='123456';showmessage(inttostr(length(a))); //显示6showmessage(a); //显示123456这里可以看到使用pchar比使用字符数组更加方便,不过有一点麻烦的是二个pchar的相加,必须要先转换:vara,b:pchar;a:='abc';b:='12345';showmessage(a+b);//这是编译不过的,因为在这里a和b是二个指针,如果用showmessage(a^+b^);//可以通过。当是返回的是a1这是因为每个指针只是指向了该字串的首地址。所以用^取的只是首字符。showmessage(string(a)+string(b));//显示abc12345,所以只有通过强制转换才行。const定义的是常量,根据编译指示字的开关,const有二种意思,一种是指设为const的值不能被改变,第二种是指设为const的变量为静态变量,即退出过程(函数),值仍然存在,同时用const的好处是可以给数组初始化。比如:consta:array[0..4] of char='ac';b:array[1..4] of char='abcd';short与long指能赋于的字符长度不同ansi与wide指读取字符时的长度不同这里我只是简单说一下,并不是很完整的。如有错误请指出 string补充一下1.作为数组使用时首位元素是1不是02.setlength函数用于string类型时只分配内存,内存值不作初始化 线程的问题 用Delphi做一个影院售票管理系统 INDY控件的问题 关于文字处理控件求助 Office助手~~~~~~~~~~ 菜单 求助关于记录的存储问题 请问openpicturedialog的用法? 双击关联文件,启动程序,打开关联文件在delphi里是如何实现的? DELPHI怎么读取其它程序QWidget类里的数据? 有一个WebBrowser空间在Pagecontrol控件上,当Pagecontrol控件增加一页时。。。 调查:有多少人在项目中用OOP的思想进行Delphi开发 如何把以下两个函数的定义从VC中转成DELPHI中的定义
我来补充一点:
还有ShortString、string
string粗看起来也象是char数组,因为你可以用string[2]索引来访问字串中的内容.使用string的好处是你不必自己定义字符串的长度,所以你可以很轻松的将'aaa'赋给string,或是'adfasdfadsf'赋给string,不过string索引是不会检查边界的,这就意味着你可以用
var
s:string;
s:='aa';
showmessage(s[100]);//并不会出错
而且a:string[2]与setleng(a,2)也是有区别的。a:string[2]默认是从0-2,setleng是从1-2;
如果你事先用了string[2],在后面使用setleng来改变范围则是不起作用的.widesring与ansistring的区别是一个是双字节存放,一个是单字节存放。比如
a:string;
b:widestring;
a:='中国';b:='中国'
showmessage(a[1]+a[2]);//显示中
showmessage(b[1]);//显示中
因为一个汉字是由二个字节组成的。a:array[0..5] of char; //动态
b:array[1..5] of char; //静态
a可以赋于'abc','a','abcdef',只要不超过6位,而b却要一次把5位全赋值,
b:='abc';//就会出错,要b:='abcde';//这才能行。
并且动态的字符数组值默认为#0,而静态的却没有默认值,比如
a[0]:='a';
a[1]:='b';
a[3]:=c';
showmessage(a);//显示ab,这里必须要给0,和1下标赋值。不然出现的结果会出人意料,具体怎么回事还不清楚。
b[1]:='a';
b[2]:='b';
b[4]:='c';
showmessage(b);//显示ab,cw(可见这里是让5位来显示的)
pchar类型的长度也是动态的,因为pchar本身只是一个指针,赋给它的字符串只是临时存放在内存中,然后返回首地址给pchar;
var
a:pchar
a:='abcdefg1234567';
showmessage(inttostr(length(a))); //显示14
showmessage(a); //显示abcdefg1234567
a:='123456';
showmessage(inttostr(length(a))); //显示6
showmessage(a); //显示123456
这里可以看到使用pchar比使用字符数组更加方便,不过有一点麻烦的是二个pchar的相加,必须要先转换:
var
a,b:pchar;
a:='abc';
b:='12345';
showmessage(a+b);//这是编译不过的,因为在这里a和b是二个指针,如果用
showmessage(a^+b^);//可以通过。当是返回的是a1这是因为每个指针只是指向了该字串的首地址。所以用^取的只是首字符。
showmessage(string(a)+string(b));//显示abc12345,所以只有通过强制转换才行。const定义的是常量,根据编译指示字的开关,const有二种意思,一种是指设为const的值不能被改变,第二种是指设为const的变量为静态变量,即退出过程(函数),值仍然存在,同时用const的好处是可以给数组初始化。比如:
const
a:array[0..4] of char='ac';
b:array[1..4] of char='abcd';short与long指能赋于的字符长度不同
ansi与wide指读取字符时的长度不同这里我只是简单说一下,并不是很完整的。如有错误请指出
1.作为数组使用时首位元素是1不是0
2.setlength函数用于string类型时只分配内存,内存值不作初始化