PChar,PAnsiChar,String,AnsiString,Char数组,AnsiChar数组转换
通过转换链,可以实现任意两个类型之间的互转。如PChar转PAnsiChar,根据转换链可知 Dest := PAnsiChar(AnsiString(Source)),同理PAnsiChar转PChar为 Dest:= PChar(String(Source))
如果转换结果最终为string,可以无需String转换,如Array[0..n] of AnsiChar转string,转换链为 Dest := Source
由此可以得出结论
1.Ansi和Wide之间的转换需要通过AnsiString或String转换
2.数组和指针的转换尽量采用拷贝的方式,如采用指针指向方式,需注意值的更改影响
3.任意类型转字符串都会进行拷贝,而不是指针指向,所以原内存的更改不会影响新值
附测试代码和测试结果
- procedure TForm1.btn1Click(Sender: TObject);
- var
- LAnsiArray: array[..] of AnsiChar;
- LCharArray: array[..] of Char;
- LPAnsiChar: PAnsiChar;
- LPChar: PChar;
- LAnsiStr: AnsiString;
- LStr: string;
- begin
- mmo1.Lines.Add('直接赋值输出********');
- LAnsiArray := 'AnsiChar数组';
- mmo1.Lines.Add(LAnsiArray);
- LCharArray := 'WideChar数组';
- mmo1.Lines.Add(LCharArray);
- LPAnsiChar := 'PAnsiChar字符串';
- mmo1.Lines.Add(LPAnsiChar);
- LPChar := 'PChar字符串';
- mmo1.Lines.Add(LPChar);
- LAnsiStr := 'AnsiString字符串';
- mmo1.Lines.Add(LAnsiStr);
- LStr := 'string字符串';
- mmo1.Lines.Add(LStr);
- mmo1.Lines.Add('');
- end;
- procedure TForm1.btn2Click(Sender: TObject);
- var
- LAnsiArray: array[..] of AnsiChar;
- LPAnsiChar: PAnsiChar;
- begin
- mmo1.Lines.Add('PAnsiChar<->AnsiChar[]********');
- //将LPAnsiChar内容拷贝到LAnsiArray内存上
- LPAnsiChar := 'PAnsiChar字符串';
- StrCopy(LAnsiArray, LPAnsiChar);
- mmo1.Lines.Add(LAnsiArray);
- //给PAnsiChar分配空间,然后将AnsiChar数组数据拷贝到该空间
- GetMem(LPAnsiChar, );
- StrCopy(LPAnsiChar, @LAnsiArray[]);
- LAnsiArray[] := 'Z';
- mmo1.Lines.Add(LPAnsiChar);
- FreeMem(LPAnsiChar);
- //将LPAnsiChar指针指向了AnsiChar数组,所以数组改变会影响PAnsiChar
- LPAnsiChar := LAnsiArray;
- mmo1.Lines.Add(LPAnsiChar);
- LAnsiArray[] := 'X';
- mmo1.Lines.Add(LPAnsiChar);
- mmo1.Lines.Add('');
- end;
- procedure TForm1.btn3Click(Sender: TObject);
- var
- LPAnsiChar: PAnsiChar;
- LAnsiStr: AnsiString;
- begin
- mmo1.Lines.Add('AnsiString<->PAnsiChar********');
- LAnsiStr := 'AnsiString字符串';
- //LPAnsiChar的指针指向LAnsiStr地址
- LPAnsiChar := PAnsiChar(LAnsiStr);
- //LAnsiStr重新分配地址,赋值,对LPAnsiChar没影响
- LAnsiStr := 'ZZZZZZZ字符串';
- mmo1.Lines.Add(LPAnsiChar);
- //LAnsiStr的指针指向LPAnsiChar指针指向的地址
- LAnsiStr := LPAnsiChar;
- mmo1.Lines.Add(LAnsiStr);
- mmo1.Lines.Add('');
- end;
- procedure TForm1.btn4Click(Sender: TObject);
- var
- LPChar: PChar;
- LAnsiStr: AnsiString;
- begin
- mmo1.Lines.Add('AnsiString<->PCharr********');
- LPChar := 'PChar字符串';
- LAnsiStr := AnsiString(LPChar);
- mmo1.Lines.Add(LAnsiStr);
- LPChar := PChar(string(LAnsiStr));
- mmo1.Lines.Add(LPChar);
- end;
- procedure TForm1.btn5Click(Sender: TObject);
- var
- LAnsiArray: array[..] of AnsiChar;
- LCharArray: array[..] of Char;
- LPAnsiChar: PAnsiChar;
- LPChar: PChar;
- LAnsiStr: AnsiString;
- LStr: string;
- begin
- mmo1.Lines.Add('All->String********');
- LAnsiArray := 'AnsiChar数组';
- //这是拷贝操作,不是指针指向,所以改变数组值对LStr没影响
- LStr := LAnsiArray;
- LAnsiArray[] := 'X';
- mmo1.Lines.Add(LStr);
- LCharArray := 'WideChar数组';
- //这是拷贝操作,不是指针指向,所以改变数组值对LStr没影响
- LStr := LCharArray;
- LCharArray[] := 'X';
- mmo1.Lines.Add(LStr);
- LPAnsiChar := 'PAnsiChar字符串';
- LStr := LPAnsiChar;
- mmo1.Lines.Add(LStr);
- LPChar := 'PChar字符串';
- //这是拷贝操作,不是指针指向
- LStr := LPChar;
- mmo1.Lines.Add(LStr);
- LAnsiStr := 'AnsiString字符串';
- //这是拷贝操作,不是指针指向
- LStr := LAnsiStr;
- mmo1.Lines.Add(LStr);
- mmo1.Lines.Add('');
- end;
- procedure TForm1.btn6Click(Sender: TObject);
- var
- LAnsiStr: AnsiString;
- LStr: string;
- begin
- mmo1.Lines.Add('String->AnsiString********');
- LStr := 'string字符串';
- LAnsiStr := AnsiString(LStr);
- mmo1.Lines.Add(LAnsiStr);
- mmo1.Lines.Add('');
- end;
- procedure TForm1.btn7Click(Sender: TObject);
- var
- LPChar: PChar;
- LStr: string;
- begin
- mmo1.Lines.Add('String->PChar********');
- LStr := 'string字符串';
- LPChar := PChar(LStr);
- mmo1.Lines.Add(LPChar);
- mmo1.Lines.Add('');
- end;
- procedure TForm1.btn8Click(Sender: TObject);
- var
- LCharArray: array[..] of Char;
- LStr: string;
- begin
- mmo1.Lines.Add('String->Char[]');
- LStr := 'string字符串';
- StrCopy(LCharArray, PChar(LStr));
- mmo1.Lines.Add(LCharArray);
- mmo1.Lines.Add('');
- end;
- procedure TForm1.btn9Click(Sender: TObject);
- var
- LCharArray: array[..] of Char;
- LPChar: PChar;
- begin
- mmo1.Lines.Add('PChar<->Char[]********');
- //将LPChar内容拷贝到LCharArray内存上
- LPChar := 'PChar字符串';
- StrCopy(LCharArray, LPChar);
- mmo1.Lines.Add(LCharArray);
- //给PChar分配空间,然后将Char数组数据拷贝到该空间
- GetMem(LPChar, );
- StrCopy(LPChar, @LCharArray[]);
- LCharArray[] := 'Z';
- mmo1.Lines.Add(LPChar);
- FreeMem(LPChar);
- //将LPChar指针指向了Char数组,所以数组改变会影响PChar
- LPChar := LCharArray;
- mmo1.Lines.Add(LPChar);
- LCharArray[] := 'X';
- mmo1.Lines.Add(LPChar);
- mmo1.Lines.Add('');
- end;
- procedure TForm1.btn10Click(Sender: TObject);
- var
- LCharArray: array[..] of Char;
- LPChar: PChar;
- LStr: string;
- begin
- LCharArray := 'Char数组';
- LPChar := LCharArray;
- //PChar转String,做的是拷贝,不是指针指向
- LStr := LPChar;
- mmo1.Lines.Add('Char[]:' + LCharArray);
- mmo1.Lines.Add('PChar:' + LPChar);
- mmo1.Lines.Add('String:' + LStr);
- //更改数组的值
- LCharArray[] := 'X';
- mmo1.Lines.Add('Char[]:' + LCharArray);
- mmo1.Lines.Add('PChar:' + LPChar);
- mmo1.Lines.Add('String:' + LStr);
- end;
- procedure TForm1.btn11Click(Sender: TObject);
- var
- LPChar: PChar;
- LPAnsiChar: PAnsiChar;
- begin
- mmo1.Lines.Add('PChar<->PAnsiChar');
- LPAnsiChar := 'PAnsiChar字符串';
- LPChar := PChar(String(LPAnsiChar));
- mmo1.Lines.Add(LPChar);
- LPChar := 'PChar字符串';
- LPAnsiChar := PAnsiChar(AnsiString(LPChar));
- mmo1.Lines.Add(LPAnsiChar);
- mmo1.Lines.Add('');
- end;
PChar,PAnsiChar,String,AnsiString,Char数组,AnsiChar数组转换的更多相关文章
- 【转】CString与string、char*的区别和转换
我们在C++的开发中经常会碰到string.char*以及CString,这三种都表示字符串类型,有很多相似又不同的地方,常常让人混淆.下面详细介绍这三者的区别.联系和转换: 各自的区别 char*: ...
- CString与string、char*的区别和转换
转自:http://blog.csdn.net/luoweifu/article/details/20232379 我们在C++的开发中经常会碰到string.char*以及CString,这三种都表 ...
- string与char之间的互相转换
string对象是一种很强大的存在哈~~ 1. string转const char* string s = "abc"; const char* c_s = s.c_str(); ...
- C#中string,char[],byte[]互相转换
string 转换成 Char[] string ss = "我爱你,中国"; char[] cc = ss.ToCharArray(); Char[] 转换成string str ...
- int 与 String 与 char 之间的互相转换
int 转 String: //方式一: int i1 = 888; String s1 = Integer.toString(i1); //方式二: int i2 = 888; String s2 ...
- Char、AnsiChar、WideChar、PChar、PAnsiChar、PWideChar 的用法
varc: Char; {Char 类型的取值范围是: #0..#255, 用十六进制表示是: #$0..#$FF}begin{用十进制方式赋值:}c := #65;ShowMessage(c); ...
- Leetcode541/151之String与char数组与StringBuffer
String与char数组与StringBuffer 通常情况下遇到删除字符或者反转字符串时需要将String转为char数组或者StringBuffer String与char数组 char [] ...
- Delphi的字符串、PChar和字符数组之间的转换
参考:http://my.oschina.net/kavensu/blog/193719 以下的各种方法都是我在Delphi 6的环境下测试成功的,可能根据你的开发环境.不同的上下文语境……有一些可能 ...
- Delphi字符串、PChar与字符数组之间的转换
来自:http://my.oschina.net/kavensu/blog/193719 ------------------------------------------------------- ...
随机推荐
- (spring-第21回【MVC基础篇】)SpringMVC一点就通
概述 Spring MVC通过一套MVC注解,让POJO变成处理请求的控制器,无需实现任何接口,同时,SpringMVC还支持REST风格的URL请求:注解驱动和REST风格的Spring MVC是S ...
- [解决方案] pythonchallenge level 6
查看页面代码,知道找zip www.pythonchallenge.com/pc/def/channel.zip,查看zip下的readme.txt知道从90052,跑一遍知道要收集zip的comme ...
- eclipse中将Maven Dependencies Libraries移除后的恢复办法
在eclipse中,如果你不小心在properties=>Java Build Path中将Maven Dependencies Libraries 移除了怎么恢复呢? 解决办法:1.右键你的项 ...
- NOIP 考前 图论练习
LJOJ 1500: 题目:http://www.docin.com/p-601990756.html Sol:贪心,从叶子结点往上加入无法传递了,就需要建设. Dfs返回的是到达叶子节点最多所要的能 ...
- BZOJ 3884 欧拉定理 无穷幂取模
详见PoPoQQQ的博客.. #include <iostream> #include <cstring> #include <cstdio> #include & ...
- Json序列化
参考文章 C# 解析json的方法 http://www.cnblogs.com/txw1958/archive/2012/08/01/csharp-json.html
- IOS 更改百度地图的定位图片
使用了百度地图的SDK,定位图片一直是蓝色的小圆点,很不喜欢,想换成自定义的图片,在网上搜罗了一大通,找到了解决的方案. 写下如下代码: //定位图层自定义样式参数 BMKLocationViewDi ...
- 创建 Transact-SQL 作业步骤
创建 Transact-SQL 作业步骤 在对象资源管理器中,连接到 SQL Server 数据库引擎实例,再展开该实例. 展开"SQL Server 代理",创建一个新作业或右键 ...
- C++学习笔记26:泛型编程概念
一.什么是泛型编程? 泛型就是通用的型式 编写不依赖数据对象型式的代码就是泛型编程 二.为什么需要泛型编程? 函数重载,相似类定义与型式兼容性 例如:设计函数,求两个数据对象的较小值 //未明确规定参 ...
- 批量过滤POST GET数据
if(get_magic_quotes_gpc()){ $_GET = stripslashes_array($_GET); $_POST = stripslashes_array($_POST); ...