面试-Delphi版本
string 的内存结构是什么样子的,与pchar什么区别,怎么转换?
String转换到PChar不是自动的,他们之间的不同点导致他们的转换存在问题。
1. String是引用计数的,而PChar不是
2. 赋值给String是数据的拷贝,而PChar是指向数据的指针。
3. String是空止符结尾(空止符结尾指以#0结尾),并包含有字符串的长度。而PChar是简单的NULL结尾。
Delphi写法:
把PChar转换为String可用StrPas(PChar),把String转换为PChar可用PChar(String)
https://blog.csdn.net/zengcong2013/article/details/18599283
string和WideString的区别
【Ansistring】为Delphi的缺省字符串类型,是单字节字符串;
如:str1:string; //编译器认为str1的类型是Ansistring类型
【wideString】由wideChar字符组成,功能类似于AnsiString,是双字节字符串;
另:
AnsiChar:标准的1字节ANSI字符;
WideChar:2字节的Unicode字符;
Char:等同于AnsiChar;
https://blog.csdn.net/yxp200401/article/details/7735792
动态数组内存结构什么样子?
答:数组是程序设计中是一个非常重要的概念。数组是一个用于收集大量类似数据的容器,
以及其每一个元素能被相同处理过程迭代来处理的一个抽象体。
创建数组一般有三种方式:全局/静态范围的数组,局部变量数组,申请堆空间来创建数组。
其中,全局/静态范围的数组,以及局部变量属于静态数组。
而申请堆空间来创建数组的属于动态数组。
https://blog.csdn.net/liupeng900605/article/details/7526753
如何把一个字符串拷贝到一个内存流里面?
在delphi中没有能把字符串直接保存为文件的方法,也没有将文件直接作为字符串读出的方法。
没有能把字符串转化为内存流的方法,也没有能把内存流转化为字符串的方法。而这里有四个函数恰能做到。
代码如下:
function StringToFile(mString: string; mFileName: TFileName): Boolean;
{ 返回字符串保存到文件是否成功 }
var
vFileChar: file of Char;//通常是以行为单位,将依次写入每一行,而这里是字,则将依次写入每个字
I: Integer;
begin
{$I-}
AssignFile(vFileChar, mFileName);
Rewrite(vFileChar);
for I := 1 to Length(mString) do
Write(vFileChar, mString[I]);
CloseFile(vFileChar);
{$I+}
Result := (IOResult = 0) and (mFileName <> \'\');
end; { StringToFile }
function FileToString(mFileName: TFileName): string;
{ 返回从文件载入字符串 }
var
vFileChar: file of Char;
vChar: Char;
begin
Result := \'\';
{$I-}
AssignFile(vFileChar, mFileName);
Reset(vFileChar);
while not Eof(vFileChar) do begin
Read(vFileChar, vChar);
Result := Result + vChar;
end;
CloseFile(vFileChar);
{$I+}
end; { FileToString }
function StreamToString(mStream: TStream): string;
{ 将内存流转换成字符串 }
var
I: Integer;
begin
Result := \'\';
if not Assigned(mStream) then Exit;
SetLength(Result, mStream.Size);
for I := 0 to Pred(mStream.Size) do try
mStream.Position := I;
mStream.Read(Result[Succ(I)], 1);
except
Result := \'\';
end;
end; { StreamToString }
function StringToStream(mString: string; mStream: TStream): Boolean;
{ 返回将字符串保存到内存流是否成功 }
var
I: Integer;
begin
Result := True;
try
mStream.Size := 0;
mStream.Position := 0;
for I := 1 to Length(mString) do mStream.Write(mString[I], 1);
except
Result := False;
end;
end; { StringToStream }
https://blog.csdn.net/jean852001/article/details/43567261
string和动态数组怎么创建、释放?内存谁来管理?原理是什么?
动态数组在堆上建立。
使用SetLength()设置内存大小,同时可以使用SetLength()释放内存,也可以使用nil释放。
https://bbs.csdn.net/topics/30103125
如果使用接口作为函数参数,声明参数时,加不加const有什么区别?
答:参数上的const指令表示过程/函数不会修改该参数中提供的值.如果程序或函数希望操纵任何const参数,它将首先将该值复制到局部变量.
这允许编译器对这些参数进行一些优化,特别是在诸如字符串和接口等的引用类型的领域.
具体来说,由于参数被声明为const,在参数的“生命周期”期间传递接口引用的值是不可修改的(因为编译器将拒绝任何尝试修改该值的代码),因此编译器能够消除调用AddRef()和Release(),在另一个方面可以将其作为prolog和epilog生成.
但是请注意,如果将引用分配给其他变量,则引用计数仍然可以改变. const优化简化了对AddRef / Release对的可能需求.
https://www.ogeek.cc/delphi/102885.html
https://blog.csdn.net/farrellcn/article/details/9096787
delphi:out参数和var参数的区别
答:out主要用于COM和CORBA技术中。
procedure TForm1.Hello(out s:String);
begin
s:=\'Hello,\'+ S;
end;
procedure TForm1.Button10Click(Sender: TObject);
var
A:string;
begin
A:=\'World!\';
Hello(A);
showmessage(A); //Hello,
end;
A的值显示为\'Hello,\',因为out参数不接受值的传入。
procedure TForm1.Hello(var s:String);
begin
s:=\'Hello,\'+ S;
end;
procedure TForm1.Button10Click(Sender: TObject);
var
A:string;
begin
A:=\'World!\';
Hello(A);
showmessage(A);//Hello,World!
end;
http://www.delphitop.com/html/jichu/485.html
写一个swap函数,交换两个整数(交换两个对象)
type
tc1 = class(Tobject)
Fs: string;
constructor Create(s: string);
end;
procedure wsap2(var a: tc1; var b: tc1);
var
c: Pointer;
begin
c := a;
a := b;
b := c;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
c1: tc1;
c2: tc1;
begin
c1:= tc1.Create(\'1\');//C1显示的是1
c2 := tc1.Create(\'2\');//C2显示的是2
wsap2(c1, c2);//C1显示的是2,C2显示的是1
c1.Free;
c2.Free;
end;
packed record中packed关键字有什么作用?
答:
Record:
第一种不带packed关键字的结构体表明编译器编译时要求进行字对齐。
对结构体中的字段访问会快。
浪费空间。
packed record:
第二种带packed关键字的结构体表明编译器编译该结构体时不需要进行字对齐。
对结构体中的字段访问会慢。
更节约空间。
比如:
TA = record
a: AnsiChar;
b: Integer;
end;
和
TB = packed record
a: AnsiChar;
b: Integer;
end;
https://www.cnblogs.com/h2zZhou/p/6564964.html
请发表评论