参考:http://my.oschina.net/kavensu/blog/193719

  以下的各种方法都是我在Delphi 6的环境下测试成功的,可能根据你的开发环境、不同的上下文语境……有一些可能会出现问题,以自己在使用的时候进行具体的测试为准

Char数组和String的相互转换的另一种方法和注意事项请看下一篇博客

同时建议结合以下的博客一起理解:

  《Delphi字符串的基本操作》和《Delphi中的各种字符串、String、PChar、Char数组

0.前提条件

var
s: String;
p: PChar;
a: Array[0..20] of char;

  

1.字符串 ---> PChar

P:= PChar(S);

  

2.PChar ---> 字符串

s:= p;

  或者

s:= string(p);

  上面的两种方式的效果一样,都是将p 指向的内存中的字符串拷贝到s 里面,s 和 p 各自有自己的内存空间,并不是将s 和 p指向同一个内存,所以对s 的修改不会影响p ,对p 的修改也不会影响s

3.PChar --->字符数组

StrCopy(@a, p);

  StrCopy的原型如下

function StrCopy(Dest: PChar; const Source: PChar): PChar;

  StrCopy的说明如下(通过查看Delphi的API参考文档获得这些信息)

Use StrCopy to copy a null-terminated string(使用StrCopy去拷贝一个null结尾的字符串)。

StrCopy does not perform any length checking. The destination buffer must have room for at least StrLen(Source)+1 characters.(StrCopy不进行任何长度的检查,目标的buffer的长度至少是 StrLen(Source)+1)

For length checking, use the StrLCopy function.(要想进行长度检查,请使用StrLCopy函数)

4.字符数组 ---> PChar

PChar(@a);

  

5.字符串 ---> 字符数组

StrCopy(@a, PChar(s));

  这种方法是通过 PChar作为中转的

6.字符数组 ---> 字符串

s:= PChar(@a);

  这种方法是通过 PChar作为中转

  或者

s:= string(a);

  这种方式类似于 将PChar转换为string

  第二种方法是将数组a 指向的内存中的字符拷贝到s 里面,s 和 a 各自有自己的内存空间,并不是将s 和 a指向同一个内存,所以对s 的修改不会影响a ,对a 的修改也不会影响s

  或者还可以使用下面的方法

s:= a;

  但是第二、三种方法中涉及到的字符数组中是不是有 #0、初始化等问题,还需要继续探究,参考 下一篇博客

Delphi的字符串、PChar和字符数组之间的转换的更多相关文章

  1. Delphi字符串、PChar与字符数组之间的转换

    来自:http://my.oschina.net/kavensu/blog/193719 ------------------------------------------------------- ...

  2. Delphi字符串与字符数组之间的转换(初始化的重要性)

    紧接着上篇博客讲解的内容: 将Char型数组转换为string类型还有下面的这种方法 但是我在测试的时候遇到了一些问题,并在下面进行了解释和总结 先说出我的总结 其实我们在学习编程的时候(比如我之前学 ...

  3. QString和char字符数组之间的转换(QTextCodec.toUnicode方法,特别注意\0的问题)

    How can I convert a QString to char* and vice versa ?(trolltech) Answer:In order to convert a QStrin ...

  4. C# 16进制与字符串、字节数组之间的转换(转)

    1.请问c#中如何将十进制数的字符串转化成十六进制数的字符串   //十进制转二进制 Console.WriteLine("十进制166的二进制表示: "+Convert.ToSt ...

  5. C# 16进制与字符串、字节数组之间的转换 (转载)

    1.请问c#中如何将十进制数的字符串转化成十六进制数的字符串 //十进制转二进制 Console.WriteLine(, )); //十进制转八进制 Console.WriteLine(, )); / ...

  6. C#串口通讯,16进制与字符串、字节数组之间的转换。

    1.将十进制数的字符串转化成十六进制数的字符串 //十进制转二进制Console.WriteLine("十进制166的二进制表示: "+Convert.ToString(166, ...

  7. C# 16进制与字符串、字节数组之间的转换

    1.请问c#中如何将十进制数的字符串转化成十六进制数的字符串//十进制转二进制 Console.WriteLine("十进制166的二进制表示: "+Convert.ToStrin ...

  8. C# 16进制与字符串、字节数组之间的转换(串口通讯中)

    1.c#中如何将十进制数的字符串转化成十六进制数的字符串//十进制转二进制 Console.WriteLine("十进制166的二进制表示: "+Convert.ToString( ...

  9. C++字符串指针与字符数组的区别

    今天发现这样一个问题 #include <iostream> using namespace std; int main() { ]; strcpy_s(ch1,");//编译通 ...

随机推荐

  1. C++中各种容器特点总结

    1.vector 内部数据结构:数组,可随机访问元素,在末尾增加或删除元素与元素数目无关,在其 他部分增加或删除元素随着元素数目呈线性变化. 2.deque 数组,按页/块来分配存储,每页/块包含固定 ...

  2. Ngrok搭建服务器

    一.ngrok简介及作用 ngrok 是一款用go语言开发的开源软件,它是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道.下图简述了ngrok的原理. ngrok 可 ...

  3. MYSQL 的错误Incorrect information in file: '.\test\stuff.frm

    用eos 重新数据库初始化 会出现这个错误 然后 把 mysql 的 两个日志文件删除就行.第一次不知道怎么g搞,花了一下午的时间重装了mysql.5.0. 删除文件 >>>> ...

  4. C# 条件编译备忘

    第一步:配置管理器中新建解决方案配置 第二步:定义条件编译符号: 第三步:在代码中使用自定义的条件编译 #if CustomDebug Console.WriteLine("dsads&qu ...

  5. 64位系统运行32位Oracle程序解决方案

    Attempt to load Oracle client libraries threw BadImageFormatException. This problem will occur when ...

  6. 【leetcode】Surrounded Regions

    Surrounded Regions Given a 2D board containing 'X' and 'O', capture all regions surrounded by 'X'. A ...

  7. 第十天 多进程、协程(multiprocessing、greenlet、gevent、gevent.monkey、select、selector)

    1.多进程实现方式(类似于多线程) import multiprocessing import time,threading def thread_run():#定义一个线程函数 print(&quo ...

  8. Appium+Robotframework实现Android应用的自动化测试-6:一个简单的例子

    万事具备,只欠编码! 下面看一个简单的示例,这个示例验证Android手机自带的通讯录的添加联系人的操作是否成功.这个例子是Appium官网自带的示例,有兴趣的同学也可以自己下载来研究和学习,下载地址 ...

  9. Linux下安装Flask开发框架

    Flask是开发pythonweb的一个轻量级框架,适合初学者使用,当有了熟练的web基础后,再继续学习高级框架的开发,Linux一般安装好之后都会有python开发环境,给开发带来方便,下面是Fla ...

  10. ACM/ICPC 之 "嵌套"队列 -插队(POJ2259)

    这里插队的意思就是排队时遇到熟人则插到其后,否则排到队尾.(这个习惯不太好)(题意) 题目要求我们模拟“插队模型”和队列的入队和出队完成此算法. 由于题目的输入输出很多,此题的查找操作(找到熟人)需要 ...