短字符串和字符数组

// 字符串数组的定义
varStr1, str2: array of [0..6] of AnsiChar; //在delphiXE中Char是双字节,这里使用AnsiChar是为了和书中保持一致。
// 为了解决字符串类型不丰富的问题,delphi中引入了字符串,其中有Shortstring,ANSIString, WideString。
// 为了与传统pascal字符串相兼容,ShortString使用紧缩格式。它最多只能容纳255个标准ASCII字符。
varstr1, str2: string[7];// 下面时字符数组和字符串的比较
varA: array[0..6] of AnsiChar;B: String[7];
beginA := 'Delphi7';B := 'Delphi7';
end;
A[0] A[1] A[2] A[3] A[4] A[5] A[6] A[7]
A D e l p h i 7
B 7 D e l p h i 7
  ShowMessage('a Sizeof' + IntToStr(SizeOf(a))); // 7ShowMessage('b Sizeof' + IntToStr(SizeOf(b))); // 8ShowMessage('a Length' + IntToStr(Length(a))); // 7ShowMessage('b Length' + IntToStr(Length(b))); // 7ShowMessage('a Low' + IntToStr(Low(a))); // 0ShowMessage('b Low' + IntToStr(Low(b))); // 0ShowMessage('a High' + IntToStr(High(a))); // 6ShowMessage('b High' + IntToStr(High(b))); // 7// 字符数组和字符串并不兼容。

字符串

  • 这里讨论长字符串(AnisString)和宽字符串(WideString), 在delphi中默认情况下string类型就是AnsiString类型。

  • ANSIstring采用非紧缩格式。ANSIstring字符串可以在使用是动态分配内存。(这个东西不是字符串常量)

  • 当我们声明了长字符串变量,实际上分配了32位(4字节)的内存空间存储一个指针,该指针指向存储实际字符串的内存地址。

  • 当字符串变量为空时,此指针值为nil,字符串内容本身不需占用额外的存储空间。当字符串非空时,此指针为动态分配的内存块的首地址,该内存块存储了相应的字符串内容(包括字符串值,一个32位(4字节)的长度指示符和一个32位的引用计数器)

  • 存储字符串是在堆中分配的。

  • 因为长字符串变量为隐式指针,因为多个长字符串变量可以指向相同的内容而不需要存储字符串的多个副本。只要一个长字符串变量被释放或赋予了新值,则原字符串的引用计数自动减1,而新字符串(如果存在)的引用计数自动递增1。如果某个长字符串的引用计数递减到0,则其占用的内存被释放。当改变长字符串时,而且仅当引用计数器大于1时才生成该字符串的一个副本,此即为生存期管理 的写时复制(copy-on-write)语义。

  • 从本质上说,AnsiString类型与一维动态字符数组类似,他们的主要差别在于

varA: string;B: AnsiChar;N: integer;
beginSetLength(A, 6);A := 'Delphi';B := A[0]; // 错误,不能访问A[0]N := Length(A); // N = 6B := A[1]; // B := 'D';N := SizeOf(A); // N = 4, 返回A的内存大小,而不是字符串本身占用的内存大小
end;
    1. 虽然使用相同的引用计数技术,但AnsiString类型与一维动态字符数组的索引方式不同。

  1. A的内容(p值)实际为A[1]的地址。32位引用计数、字符串长度以及最后的A[7]都是由Delphi自动维护的。程序不能进行操作。AnsiString类型变量的索引下标从1到长度值。字符串在尾部添加一个Null字符(这个字符其实是#0,不是真正意义上的Null,真正意义上了Null表示空,C语言的字符串是以'\0'为结尾的,'\0'就是#0)是为了与C语言null结尾的字符串相兼容。所以可以将长字符串赋值给某个null结尾的字符串变量。

  1. 一维动态数组存储字符串时,其分配机制有些差异,但是正是这些差异使得我们创建的数据类型不同。

    varA: array of Char;B: Char;N: integer;
    beginSetLength(A, 5);A[0] := 'D';A[1] := 'e';A[2] := 'l';A[3] := 'p';A[4] := 'h';A[5] := 'i';A := 'Delphi'; // 错误,不能将字符串类型赋值给一维动态数组B := A[0];  // 正确,A[0] = 'D';N := Length(A); // N = 5;N := Sizeof(A); // N = 4, 返回A的内存大小,而不是字符串本身所占内存大小
    end;

delphi 字符串详解相关推荐

  1. Delphi 关键字详解[整理于 橙子 的帖子]

    Delphi 关键字详解[整理于 "橙子" 的帖子] absolute //它使得你能够创建一个新变量, 并且该变量的起始地址与另一个变量相同. var Str: string[3 ...

  2. python 字符串替换_Python基础教程,第四讲,字符串详解

    本节课主要和大家一起学习一下Python中的字符串操作,对字符串的操作在开发工作中的使用频率比较高,所以单独作为一课来讲. 学完此次课程,我能做什么? 学完本次课程后,我们将学会如何创建字符串,以及如 ...

  3. python字符串是什么_python字符串详解

    字符串详解 在python中引号引起来的就是字符串 字符串是用来存储少量数据 索引 索引(下标) 通过索引可以精确的定位到某个元素 name = "meat" meat 每一个字母 ...

  4. 判断字符串格式_Python基础教程,第四讲,字符串详解

    本节课主要和大家一起学习一下Python中的字符串操作,对字符串的操作在开发工作中的使用频率比较高,所以单独作为一课来讲. 学完此次课程,我能做什么? 学完本次课程后,我们将学会如何创建字符串,以及如 ...

  5. MS SQL Server 数据库连接字符串详解

    MS SQL Server 数据库连接字符串详解 问题 : 超时时间已到.在从池中获取连接之前超时时间已过.出现这种情况可能是因为所有池连接都已被使用并已达到最大池大小. 解决办法 1. 在代码里面 ...

  6. EditPlus正则表达式替换字符串详解

    EditPlus正则表达式替换字符串详解 发布时间:April 8, 2007 分类:Regular <PHP 实现多服务器共享 SESSION 数据> <利用javascript在 ...

  7. Python基础语法day02字符串详解和列表

    今天是python基础语法入门第二天,大概总共会有四天左右.四天后就是对于python的numpy库的详细文章.那话不多说,我们开始. 目录 字符串详解 字符串独有功能 检测头尾字符 判断输入结果是否 ...

  8. C语言 字符数组 和 字符串 详解

    C语言 字符数组 和 字符串 详解 用来存放字符的数组称为字符数组,例如: char a[10]; //一维字符数组 char b[5][10]; //二维字符数组 char c[20]={'c', ...

  9. python中的字符串详解(附实现文字跑马灯效果)

    python中的字符串详解 1.什么是字符串 ​ 相信大家对字符串应该是再熟悉不过了吧,因为日常生活中的一句话,或是路边的一则广告,其实它都相当于一个字符串,而顾名思义,字符串也就是一串串的由零个或多 ...

最新文章

  1. SQLI DUMB SERIES-5
  2. 计算机在线声音,电脑怎么在线录音
  3. linux 虚函数调用性能,C++虚函数和多态
  4. 【控制】傅里叶系列(一)傅里叶级数 (Fourier series) 的推导
  5. 信息系统项目管理师:第6章:项目进度管理-章节重点汇总
  6. ruby简单的基本 6
  7. python的std函数_Python numpy.nanstd函数方法的使用
  8. 基于Prometheus的.NET 4.x应用服务监控
  9. mongoDB mac 安装 小白必备
  10. 【SpringMVC框架】注解的处理器映射器和适配器配置
  11. 环形线圈车辆检测器突破了LOOP-LOCK
  12. Windows远程桌面单/多用户同时登录
  13. EXCEL VBA编程入门三:VBA开发环境认识
  14. java请求菜鸟快递接口返回乱码
  15. mex文件用matlab能打开吗,MATLAB通过mex文件调用C/C++程序
  16. 鸿蒙os2021升级日程,消息称华为EMUI 11.1三月上线:更... - @是Ustinian鸭 的微博精选 - 微博国际站...
  17. 十月英语——坚持的力量
  18. tinyproxy王卡免流配置_【免流教程】王卡动态tiny免流教程
  19. 机票售票系统/飞机票购票系统的设计与实现
  20. 武汉星起航跨境—亚马逊新产品上架如何将产品卖出去?

热门文章

  1. 火狐浏览器打不开页面的问题
  2. 自动登录Github官网,cookie验证简单模拟登录
  3. 5张图教你搭建Redis的cluster
  4. pytorch matmul和mm和bmm区别
  5. 德风科技完成A轮8000万融资,招商局创投与创新工场联合领投
  6. 在list集合指定位置添加元素
  7. HTTP篇-----HTTP的基础知识
  8. 数据中心服务器冷却技术,数据中心各种冷却技术的应用与发展
  9. 关于java使用jacob进行语音播报时报错:com.jacob.com.ComFailException: Can‘t get object clsid from progid
  10. 深度学习实践计算机视觉