春光无限好 發表於 2020-4-7 23:03:00

Delphi过程函数之间的参数传递

<p>声明过程和函数时,根据需要写入参数,参数分为两种:</p>
<p>形式参数:所谓形式参数是指过程和函数声明语句的参数列表中的参数,简称形参。</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> function TForm1.myfunc(s1, s2: String): String;</pre>
</div>
<p>实际参数:实际参数则是调用函数时传入函数的参数列表,简称实参。</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> myfunc(str1,str2);</pre>
</div>
<p>&nbsp;</p>
<p>参数传递又分为按值传递,按址传递。-------举例理解就像数组中的 A数组:=B数组,改变任一数组内容,另外一个随之改变(同一地址)。A数组:=copy(B数组),只是内容相同,地址不同。不会随之改变</p>
<p>按值传递:将实参复制一份给形参所代表的临时存储单元。实参和形参的内容都保存在不同的内存地址中,在过程和函数中改变形参的值时,只是形参内容发生变化,不会影响到实参。</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 0, 255, 1)">var</span>
<span style="color: rgba(0, 128, 128, 1)"> 2</span> <span style="color: rgba(0, 0, 0, 1)">s1,s2: Integer;                                          S1-------&gt;&gt; X=2
</span><span style="color: rgba(0, 128, 128, 1)"> 3</span> <span style="color: rgba(0, 0, 0, 1)">begin                                                 S2-------&gt;&gt; Y=2
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span>   s1:= <span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 5</span>   s2:= <span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 6</span> <span style="color: rgba(0, 0, 0, 1)">myfunc(s1,s2);
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span>   ShowMessage(IntToStr(s1+s2));<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">结果为4,此时x,y已经改变</span>
<span style="color: rgba(0, 128, 128, 1)"> 8</span> <span style="color: rgba(0, 0, 0, 1)">end;
</span><span style="color: rgba(0, 128, 128, 1)"> 9</span>
<span style="color: rgba(0, 128, 128, 1)">10</span> function TForm1.myfunc(x,y: Integer): Integer;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">没有var关键字</span>
<span style="color: rgba(0, 128, 128, 1)">11</span> <span style="color: rgba(0, 0, 0, 1)">begin
</span><span style="color: rgba(0, 128, 128, 1)">12</span>   x:= x + <span style="color: rgba(128, 0, 128, 1)">10</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">13</span>   y:= y + <span style="color: rgba(128, 0, 128, 1)">10</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">14</span>   Result:= x +<span style="color: rgba(0, 0, 0, 1)"> y;
</span><span style="color: rgba(0, 128, 128, 1)">15</span> end;</pre>
</div>
<p>按址传递:实参将保存内容的内存地址传递给形参,形参与实参指向同一内存地址,当形参的内容发生变化时,实参的内容也会随之改变。</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 0, 0, 1)">procedure TForm1.Button1Click(Sender: TObject);
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span> <span style="color: rgba(0, 0, 255, 1)">var</span>
<span style="color: rgba(0, 128, 128, 1)"> 3</span> <span style="color: rgba(0, 0, 0, 1)">s1,s2: Integer;
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span> <span style="color: rgba(0, 0, 0, 1)">begin
</span><span style="color: rgba(0, 128, 128, 1)"> 5</span>   s1:= <span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 6</span>   s2:= <span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">;                                                S1-------&gt;&gt; var @X
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span> <span style="color: rgba(0, 0, 0, 1)">myfunc(s1,s2);                                            S2--------&gt;&gt; var @Y
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span>   ShowMessage(IntToStr(s1+s2));<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">结果为24,此时x,y已经改变</span>
<span style="color: rgba(0, 128, 128, 1)"> 9</span> <span style="color: rgba(0, 0, 0, 1)">end;
</span><span style="color: rgba(0, 128, 128, 1)">10</span>
<span style="color: rgba(0, 128, 128, 1)">11</span> function TForm1.myfunc(<span style="color: rgba(0, 0, 255, 1)">var</span> x,y: Integer): Integer;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">有var关键字</span>
<span style="color: rgba(0, 128, 128, 1)">12</span> <span style="color: rgba(0, 0, 0, 1)">begin
</span><span style="color: rgba(0, 128, 128, 1)">13</span>   x:= x + <span style="color: rgba(128, 0, 128, 1)">10</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">14</span>   y:= y + <span style="color: rgba(128, 0, 128, 1)">10</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">15</span>   Result:= x +<span style="color: rgba(0, 0, 0, 1)"> y;
</span><span style="color: rgba(0, 128, 128, 1)">16</span> end;</pre>
</div>
<p>&nbsp;</p>
<p>参数类型:所谓的<span style="color: rgba(255, 102, 0, 1)">参数类型</span>指的不是参数的数据类型,而是指在Delphi中 6 种不同的类型的参数。</p>
<p>即数值参数,常量参数,变量参数,无类型参数,外部参数,以及开放数组参数。</p>
<p>在过程或函数种形参可以分为 3 种 :</p>
<p>1.不带 var,称为数值参数,简称值参。 即上方 按值传递</p>
<p>2.带有 var,称为变量参数,简称变参。 即上方 按址传递</p>
<p>3.带有const,称为常量参数:</p>
<p>在过程或函数中,常量参数的值是不可以改变的,因此可以将它作为一个常量使用,在过程或函数中不可以为常量参数赋值,否则会出现编译错误。并且也不可以吧常量参数作为实参传递给其他过程或参数。</p>
<p>&nbsp;</p>
<p>无参数数据类型:指在过程或函数声明时不指定参数的<span style="color: rgba(255, 102, 0, 1)">数据类型<span style="color: rgba(0, 0, 0, 1)">,如果参数没有指定数据类型则必须在参数前假var ,out ,count.</span></span></p>
<p><span style="color: rgba(255, 102, 0, 1)"><span style="color: rgba(0, 0, 0, 1)">在参数前加 var或 out 表示参数的值是可以改变的。而参数前加 count,参数值不能改变。当参数为无类型参数时,实参可以是任意数据类型的变量或表达式。</span></span></p>
<p><span style="color: rgba(255, 102, 0, 1)"><span style="color: rgba(0, 0, 0, 1)">使用无类型参数因为Delphi没有对参数进行合法检查,所以使用时应对其进行强制类型转换。好处是不用考虑实参的数据类型,只需要将形参根据实参类型强制转换即可。</span></span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> procedure TForm1.myproc(<span style="color: rgba(0, 0, 255, 1)">var</span> x, y);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">参数无数据类型</span>
<span style="color: rgba(0, 128, 128, 1)">2</span> <span style="color: rgba(0, 0, 0, 1)">begin
</span><span style="color: rgba(0, 128, 128, 1)">3</span>   Integer(x):= Integer(x)+ <span style="color: rgba(128, 0, 128, 1)">10</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">4</span>   Integer(y):= Integer(y)+ <span style="color: rgba(128, 0, 128, 1)">10</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">5</span> end;</pre>
</div>
<p>外部参数:形参前使用 out 称为外部参数,它不能用来向过程函数种传入信息,只能传出。外部参数类似于变量参数。当过程或函数被调用结束后,通过外部参数可以回传某些信息,如果调用失败,外部参数就被设为空。</p>
<p>外部参数主要用于不允许使用函数例程的 COM 等分布式技术中,如果需要向例程传递一个没有初始化的变量也可以使用外部参数。 与上方按址传递类似。</p>
<p>开放数组参数:就是一个参数数组,长度是不固定的,开放数组参数可以把静态数组和动态数组传递给本身,但不能用 setlength 改变动态数组的长度。</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> <span style="color: rgba(0, 0, 0, 1)">type
</span><span style="color: rgba(0, 128, 128, 1)">2</span>   arr = array[<span style="color: rgba(128, 0, 128, 1)">0</span>..<span style="color: rgba(128, 0, 128, 1)">10</span>] of Integer;</pre>
</div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 0, 0, 1)">function TForm1.arrinit(mm:arr):arr;
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span> <span style="color: rgba(0, 0, 255, 1)">var</span>
<span style="color: rgba(0, 128, 128, 1)"> 3</span> <span style="color: rgba(0, 0, 0, 1)">i: Integer;
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span> <span style="color: rgba(0, 0, 0, 1)">begin
</span><span style="color: rgba(0, 128, 128, 1)"> 5</span>   <span style="color: rgba(0, 0, 255, 1)">for</span> i:=<span style="color: rgba(128, 0, 128, 1)">0</span> to 10<span style="color: rgba(0, 0, 255, 1)">do</span>
<span style="color: rgba(0, 128, 128, 1)"> 6</span> <span style="color: rgba(0, 0, 0, 1)">begin
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span>   mm:=<span style="color: rgba(0, 0, 0, 1)"> i;
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span> <span style="color: rgba(0, 0, 0, 1)">end;
</span><span style="color: rgba(0, 128, 128, 1)"> 9</span>   result:=<span style="color: rgba(0, 0, 0, 1)"> mm;
</span><span style="color: rgba(0, 128, 128, 1)">10</span> end;</pre>
</div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 0, 0, 1)">procedure TForm1.Button1Click(Sender: TObject);
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span> <span style="color: rgba(0, 0, 255, 1)">var</span>
<span style="color: rgba(0, 128, 128, 1)"> 3</span> <span style="color: rgba(0, 0, 0, 1)">aa: arr;
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span> <span style="color: rgba(0, 0, 0, 1)">i,sum: Integer;
</span><span style="color: rgba(0, 128, 128, 1)"> 5</span> <span style="color: rgba(0, 0, 0, 1)">begin
</span><span style="color: rgba(0, 128, 128, 1)"> 6</span>   sum:= <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span>   aa:=<span style="color: rgba(0, 0, 0, 1)"> arrinit(aa);
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span>   <span style="color: rgba(0, 0, 255, 1)">for</span> i:=<span style="color: rgba(128, 0, 128, 1)">0</span> to <span style="color: rgba(128, 0, 128, 1)">10</span> <span style="color: rgba(0, 0, 255, 1)">do</span>
<span style="color: rgba(0, 128, 128, 1)"> 9</span> <span style="color: rgba(0, 0, 0, 1)">begin
</span><span style="color: rgba(0, 128, 128, 1)">10</span>   sum:= sum+<span style="color: rgba(0, 0, 0, 1)">aa;
</span><span style="color: rgba(0, 128, 128, 1)">11</span> <span style="color: rgba(0, 0, 0, 1)">end;
</span><span style="color: rgba(0, 128, 128, 1)">12</span> <span style="color: rgba(0, 0, 0, 1)">ShowMessage(IntToStr(sum));
</span><span style="color: rgba(0, 128, 128, 1)">13</span> end;</pre>
</div>
<p>默认参数:声明过程中可以设置参数默认值。默认参数后得其他参数也只能是默认参数,即默认参数只能出现在最后&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> function myfunc2(x:Integer=<span style="color: rgba(128, 0, 128, 1)">10</span>;y:Integer=<span style="color: rgba(128, 0, 128, 1)">20</span>):Integer;</pre>
</div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> <span style="color: rgba(0, 0, 0, 1)">function TForm1.myfunc2(x, y: Integer): Integer;
</span><span style="color: rgba(0, 128, 128, 1)">2</span> <span style="color: rgba(0, 0, 0, 1)">begin
</span><span style="color: rgba(0, 128, 128, 1)">3</span>   Result:= x +<span style="color: rgba(0, 0, 0, 1)"> y;
</span><span style="color: rgba(0, 128, 128, 1)">4</span> end;</pre>
</div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> <span style="color: rgba(0, 0, 0, 1)">procedure TForm1.Button1Click(Sender: TObject);
</span><span style="color: rgba(0, 128, 128, 1)">2</span> <span style="color: rgba(0, 0, 255, 1)">var</span>
<span style="color: rgba(0, 128, 128, 1)">3</span> <span style="color: rgba(0, 0, 0, 1)">sum: integer;
</span><span style="color: rgba(0, 128, 128, 1)">4</span> <span style="color: rgba(0, 0, 0, 1)">begin
</span><span style="color: rgba(0, 128, 128, 1)">5</span>   sum:= myfunc2();   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">计算自定义函数中x和y的默认值,结果40</span>
<span style="color: rgba(0, 128, 128, 1)">6</span>   sum:= myfunc2(<span style="color: rgba(128, 0, 128, 1)">20</span>);   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">更改了x默认值为20,结果40</span>
<span style="color: rgba(0, 128, 128, 1)">7</span>   sum:= myfunc2(<span style="color: rgba(128, 0, 128, 1)">20</span>,<span style="color: rgba(128, 0, 128, 1)">30</span>);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">更改了x和y默认值为20,30,结果50</span>
<span style="color: rgba(0, 128, 128, 1)">8</span> end;</pre>
</div>
<p>&nbsp;</p>

</div>
<div id="MySignature" role="contentinfo">
    编程语言无所谓高低级,唯适用罢了。语言结构再天花乱坠,富丽堂皇终不过CPU上的0和1。<br><br>
来源:https://www.cnblogs.com/fansizhe/p/12656914.html
頁: [1]
查看完整版本: Delphi过程函数之间的参数传递