建庆空心砖 發表於 2020-5-11 09:52:00

面试-Delphi版本

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

</div>
<div id="MySignature" role="contentinfo">
    <div id="AllanboltSignature">   
      <div>作者:疯狂Delphi</div>
      <div>出处:https://www.cnblogs.com/FKdelphi/</div>
      <div>本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.</div>
</div>
<div class="div_masklayer" id="div_masklayer"></div>
<div class="div_popup" id="Div_popup">
<p class="mid">欢迎关注我,一起进步!扫描下方二维码即可加我</p>
<img class="img_zfb" id="img_zfb" width="150" src="https://images.cnblogs.com/cnblogs_com/FKdelphi/1101510/o_251208113944_QQ.png">
<img class="img_zfb" id="img_zfb" width="150" src="https://images.cnblogs.com/cnblogs_com/FKdelphi/1101510/o_251208115029_WX.png">
</div><br><br>
来源:https://www.cnblogs.com/FKdelphi/p/12867267.html
頁: [1]
查看完整版本: 面试-Delphi版本