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

  • 相关阅读:
    subtext 安装PythonIDE -Anaconda
    Python--DBUtil
    python操作oracle数据库-查询
    Python 离线工作环境搭建
    Scrapy-下载中间件
    centos安装 Anaconda3及使用
    Scrapy爬取人人网
    海明距离
    中心极限定理
    最大似然估计 (MLE)与 最大后验概率(MAP)在机器学习中的应用
  • 原文地址:https://www.cnblogs.com/FKdelphi/p/12867267.html
Copyright © 2020-2023  润新知