zoukankan      html  css  js  c++  java
  • 字符串及字符指针

    近来在学习字符串的一些操作,对字符串有些认识:

    1、字符串在使用时才动态分配的。

    2、程序在声明字符串变量时,实际分配的是32位的内存空间的一个指针。该指针指向存储实际字符串的内存地址。当字符串为空时,其指针值为nil。

    所以  str:='Borland Delphi';

           sizeof(str);返回的结果将是4,而不是字符串的长度。

    3、字符串的内容的内存在堆中分配。(但如果是如str:=Form1.Caption常量,则是在栈中分配)

    4、不同的字符串变量,如果是存储一样的内容,则内存中只存储一份内容。字符串变量的地址是一样的,采用引用计数技术。只有改变字符串内容时,才采用copy-on -write技术,分配另一内存进行存储。

    5、字符串与一维字符数组很相似。但区别在于字符串的下标是以str[1]开始,而且str[0]是不可访问的。并且以#0结尾。

     1procedure TForm2.Button1Click(Sender: TObject);
     2var
     3  a,b,c:string;
     4  p:Pint;
     5  q:Pchar;
     6begin
     7  memo1.Clear;
     8  with memo1.Lines do
     9  begin
    10    a:='Delphi';
    11    b:='Delphi';
    12    c:=a;
    13    p:=@a;
    14    q:=@a[1];//不能使用q:=@a[0];
    15     Add('a''s address:   '+inttostr(integer(@a)));
    16     Add('b''s address:   '+inttostr(integer(@b)));
    17     Add('c''s address:   '+inttostr(integer(@c)));
    18     Add('In a:   '+inttostr(integer(a)));
    19     Add('In b:    '+inttostr(integer(b)));
    20     Add('In c:    '+inttostr(integer(c)));
    21      Add('sizeof a:    '+inttostr(sizeof(a)));
    22      add('a''s adress'+inttostr(integer(p)));
    23    while q^<>#0 do
    24     begin
    25      add(q^+'  ;address'+inttostr(integer(q)));
    26      inc(q);
    27     end;
    28  end;//with lines
    29end;
    30

    执行的结果如下:

    一个很奇怪的结果是字符串a与b,c的地址竟然不同。如果将q=@a[1];这一语句去掉,则 a,b,c地址是一致的。为什么会改变呢?而且地址是低位的地址(已经不是'Delphi'的地址了)。难道在q=@a[1]时,复制了一份到另一内存空间?如果有哪位大侠知道,请教小弟一声。

    从字符指针,查询每个字符的地址可以看到,Delphi2009 的char是unicode的,每个字符占2个字节。

    b c 地址一致,是因为他们都指向'Delphi'字符串的堆地址。

  • 相关阅读:
    处理缺失值
    数据清理
    数据聚合
    ajax动态生成table
    MangeEmpHashMap
    Arraylist的雇员管理操作
    jsp获取一个对象和list对象
    Controller比较两个对象discs、outlets中的元素是否相等。相同则相应的checkbox为checked
    限制input text输入的类型(数字,字母,小数点)
    联合主键的映射运用
  • 原文地址:https://www.cnblogs.com/samsonleung/p/1290247.html
Copyright © 2011-2022 走看看