面试-Delphi版本 - 疯狂delphi

面试-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.jb51.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