文档章节

关于动态数组、静态数组转换为字符串的一些问题 - 给 "厨师" 的回复

涂孟超
 涂孟超
发布于 2014/09/26 15:37
字数 749
阅读 2
收藏 0
点赞 0
评论 0
问题来源: http://www.cnblogs.com/del/archive/2008/05/21/1192113.html#1204252

首先, 只有字符类型的数组才可以直接转换为字符串!
//这是静态数组的例子:
var
  Arr: array[0..9] of Char;
  s: string;
  p: PChar;
  i: Integer;
begin
  {给 Arr 赋值: A B C D E F G H I J}
  for i := Low(Arr) to High(Arr) do
    Arr[i] := Chr(65+i);

  {把 Char 数组赋给 string}
  s := Arr;
  ShowMessage(s); {ABCDEFGHIJ}

  {把 Char 数组赋给 PChar}
  p := PChar(string(Arr));
  ShowMessage(p); {ABCDEFGHIJ}

  {直接把 Char 数组赋给 PChar, 会有意想不到的结果, 因为缺少 #0 结束}
  p := Arr;
  //p := @Arr;    {或者这样}
  //p := @Arr[0]; {再或者这样}
  ShowMessage(p); {ABCDEFGHIJ未知数据}
  {这种方式偏偏是我们在使用 API 函数时用得最多的, 但 API 函数都会返回给 #0 结束的, 所以没有问题}
end;


//这是动态数组的例子:
var
  Arr: array of Char;
  s: string;
  p: PChar;
  i: Integer;
begin
  {给 Arr 赋值: A B C D E F G H I J}
  for i := 0 to 9 do
  begin
    SetLength(Arr, i+1);
    Arr[i] := Chr(65+i);
  end;

  Pointer(s) := Arr;
  //Pointer(s) := @Arr[0]; {或者这样}
  ShowMessage(s); {ABCDEFGHIJ}

  p := PChar(Arr);
  //p := @Arr[0]; {或者这样}
  ShowMessage(p); {ABCDEFGHIJ}
end;

 
 
 
 
 

 

 

  
要想彻底理解上面的操作, 需要知道静态数组与动态数组指针问题.
var
  ArrS: array[0..9] of Char; {静态数组}
  ArrD: array of Char;       {动态数组}
  i: Integer;
begin
  {设置动态数组大小, 并给两个数组赋值}
  SetLength(ArrD, 10);
  for i := 0 to 9 do
  begin
    ArrS[i] := Char(65+i);
    ArrD[i] := Char(97+i);
  end;

  {测试赋值结果}
  ShowMessageFmt('%s, %s', [ArrS[0], ArrD[0]]); {A, a}

  {静态数组变量的指针(而非变量本身)和它的第一个元素的指针是同一个}
  ShowMessageFmt('%p, %p', [@ArrS[0], @ArrS]);  {0012FDE2, 0012FDE2}

  {动态数组变量本身(而非变量的指针)就是一个指针, 它和第一个元素的指针也是同一个}
  ShowMessageFmt('%p, %p, %p', [ArrD, @ArrD[0], @ArrD]); {00E7C970, 00E7C970, 0012FDEC}
end;

 
 
 
 
 

 

 

  
另外, 动态数组的构造和静态数组完全不同, 它和 String 的构造 倒是有些相似.

每个动态数组第一个元素前还有 8 个字节, 没 4 个字节记录一个整数;

最前面 4 个字节是用于生存管理的引用计数(当引用计数为 0 时数组自动释放);

第一个元素之前的 4 个字节记录数组的长度. 测试如下:
var
  Arr1,Arr2: array of Char; {定义两个动态数组, 其中一个是为了测试引用计数}
  i: Integer;  {用于指针运算}
  p: PInteger; {用于读取动态数组前面的两个 32 位整数}
begin
  SetLength(Arr1, 10); {设置数组长度}
  Arr2 := Arr1;        {增加一个引用}
  i := Integer(Arr1);  {获取数组地址(这也是数组第一个元素的位置)}

  {获取动态数组的长度}
  i := i-4;
  p := PInteger(i);
  ShowMessage(IntToStr(p^)); {10}

  {获取动态数组的引用计数}
  i := i-4; {再减 4}
  p := PInteger(i);
  ShowMessage(IntToStr(p^)); {2}
end;

 
 
 
 
 

 

 

  

本文转载自:http://www.cnblogs.com/del/archive/2008/05/21/1204264.html

共有 人打赏支持
涂孟超
粉丝 12
博文 2004
码字总数 14107
作品 0
深圳
程序员
阿拉伯人用阿拉伯数字吗?——记一次用String#format格式化字符串趟到的雷

要生成一个字符串,其中夹杂着一些动态变化的整数,我们一般是用String.format方法来完成,但是,如果用的不恰当,你可能是得不到正确的整数字符串的。 事情从一个线上崩溃说起,从崩溃堆栈来...

ZxLee ⋅ 2017/09/25 ⋅ 0

Groovy 2.0 新特性之:静态类型检查

Groovy 2.0 刚刚发布,其中一项最大的改进就是支持静态类型检查。今天我们将对这个新特性进行全方位的介绍。 静态类型检查 Groovy 天生就是一个动态编程语言,它经常被当作是 Java 脚本语言,...

红薯 ⋅ 2012/06/30 ⋅ 7

嵌入式开发之C基础学习笔记06--数组和指针(非常重要,难点)

C语言进阶学习 数组 1)数组的使用 2)字符串(String):数组(尤其是一维数组)最常用的地方——————>C语言中字符串就是一维数组 数组: 定义:具有相同类型的数据的有序集合,并用唯一的...

吴锦涛 ⋅ 2012/12/14 ⋅ 0

Java Magic. Part 4: sun.misc.Unsafe

原文地址 译文地址 译者:许巧辉 校对:梁海舰 Java是一门安全的编程语言,防止程序员犯很多愚蠢的错误,它们大部分是基于内存管理的。但是,有一种方式可以有意的执行一些不安全、容易犯错的...

dexterman ⋅ 2014/07/18 ⋅ 0

【C++探索之旅】第一部分第九课:数组威武,动静合一

内容简介 1、第一部分第九课:数组威武,动静合一 2、第一部分第十课预告:文件读写,海阔凭鱼跃 数组威武,动静合一 上一课《【C++探索之旅】第一部分第八课:传值引用,文件源头》中,我们...

frogoscar ⋅ 2016/02/29 ⋅ 0

javascript(七) 内建对象

内建对象 全局属性: Infinity 表示正无穷大的数值 NaN 非数字值 undefined 未定义的值 decodeURI() 对encodeURI()转义的字符串解码。 decodeURIComponent() 对encodeURIComponent()转义的字...

年少爱追梦 ⋅ 2016/05/31 ⋅ 0

commons-beanutils

概述 commons-beanutil开源库是apache组织的一个基础的开源库,为apache中许多类提供工具方法,学习它是学习其他开源库实现的基础。 Commons-beanutil中包含大量和JavaBean操作有关的工具方法...

wuchongchang ⋅ 2011/09/15 ⋅ 0

C++ Primer Plus(四)——复合类型

只能在定义数组时才能初始化,不能将一个数组赋值给另一个数组,但可以使用下标分别赋值给数组元素,但可以将一个string对象赋值给另一个string对象 如果只对数组的一部分初始化,其他元素自...

吃一堑消化不良 ⋅ 2015/11/06 ⋅ 0

sqlite 在 android中使用注意事项

1、模糊查询的陷阱 1 cursor = db.rawQuery("select * from song where song_title like '?%' ", selectionArgs); 这行代码中由于占位符 ? 在单引号内,因此不会被当做占位符,而是对?进行了...

小克898 ⋅ 2012/12/19 ⋅ 2

JavaScript笔记(一):基础知识

一.基本语法 1.1HTML中执行JavaScript的方法 另外一种方式 1.2.浏览器调试JavaScript代码 谷歌浏览器F12打开控制台。 找到Console可以直接输入JS代码执行 如console.log(a)可以输出变量a的值...

第四单元 ⋅ 2017/09/11 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

用SQL命令查看Mysql数据库大小

要想知道每个数据库的大小的话,步骤如下: 1、进入information_schema 数据库(存放了其他的数据库的信息) use information_schema; 2、查询所有数据的大小: select concat(round(sum(da...

源哥L ⋅ 42分钟前 ⋅ 0

两个小实验简单介绍@Scope("prototype")

实验一 首先有如下代码(其中@RestController的作用相当于@Controller+@Responsebody,可忽略) @RestController//@Scope("prototype")public class TestController { @RequestMap...

kalnkaya ⋅ 47分钟前 ⋅ 0

php-fpm的pool&php-fpm慢执行日志&open_basedir&php-fpm进程管理

12.21 php-fpm的pool pool是PHP-fpm的资源池,如果多个站点共用一个pool,则可能造成资源池中的资源耗尽,最终访问网站时出现502。 为了解决上述问题,我们可以配置多个pool,不同的站点使用...

影夜Linux ⋅ 57分钟前 ⋅ 0

微服务 WildFly Swarm 管理

Expose Application Metrics and Information 要公开关于我们的微服务的有用信息,我们需要做的就是将监视器模块添加到我们的pom.xml中: 这将使在管理和监视功能得到实现。从监控角度来看,...

woshixin ⋅ 57分钟前 ⋅ 0

java连接 mongo伪集群部署遇到的坑

部署mongo伪集群 #创建mongo数据存放文件地址mkdir -p /usr/local/config1/datamkdir -p /usr/local/config2/data mkdir -p /usr/local/config3/data mkdir -p /usr/local/config1/l......

努力爬坑人 ⋅ 58分钟前 ⋅ 0

React Native & Weex 区别

JS引擎 Weex使用V8, React native使用JSCore JS开发框架 ( Js Framework ) Weex基于vue.js(2W+ star)。小巧轻量的前端开发框架,组件化,数据绑定,2.0引入virtual dom。 ReactNative使用...

东东笔记 ⋅ 今天 ⋅ 1

UIkit 分页组件动态加载简单实现

1. 问题描述 使用过UIkit分页组件的都清楚,UIkit的分页不能动态刷新数据,也就是不能在点击下一页的时候,动态从后台加载数据,并且刷新页数以及该页数上的数据,下面是一个简单实现,没有做...

影狼 ⋅ 今天 ⋅ 0

Mobx入门之三:Provider && inject

上一节中<App/>组件传递状态temperatures给children -- <TemperatureInput />,如果组建是一个tree, 那么属性的传递则会非常繁琐。redux使用Provider给子组件提供store, connect将子组件和s...

pengqinmm ⋅ 今天 ⋅ 0

魔兽世界 7.0版本 S23/S24/S25全职业普通+精锐套

  死亡骑士   (联盟)   (部落)   (精锐)   恶魔猎手   (联盟)   (部落)   (精锐)   德鲁伊   (联盟)   (部落)   (精锐)   猎人   (联盟) ...

wangchen1999 ⋅ 今天 ⋅ 0

maven顶级pom和子pom的版本号批量修改

当一个版本发布,新起一个版本时,我们只需要手动修改一下项目中pom.xml的版本号就可以了。但是如果这个maven项目有很多的子模块项目,那么一个个手动的去改就显得费时费力又繁琐了。还好,m...

ArlenXu ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部