• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

面试-Delphi版本 - 疯狂delphi

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

面试-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(),在另一个方面可以将其作为prologepilog生成.

但是请注意,如果将引用分配给其他变量,则引用计数仍然可以改变. const优化简化了对AddRef / Release对的可能需求. 

https://www.ogeek.cc/delphi/102885.html

https://blog.csdn.net/farrellcn/article/details/9096787

 

delphi:out参数和var参数的区别

答:out主要用于COMCORBA技术中。

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显示的是2C2显示的是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


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
002_Delphi版本的选择?发布时间:2022-07-18
下一篇:
delphi版本对应发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap