请问:delphi 中数组作为函数的参数传递,这样传过去的是地址,怎样把数组作为值传递过去?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请问:delphi 中数组作为函数的参数传递,这样传过去的是地址,怎样把数组作为值传递过去?相关的知识,希望对你有一定的参考价值。

intarray = array[1..3] of integer;
function TForm1.upadd(const na:intarray): Integer;
var
nb:intarray;
begin
nb:=na;
nb[1]:=30;
nb[2]:=30;
nb[3]:=30;
upadd:=na[3];
end;

//以传值方式传递数组参数的方法
function Fn1(Arr:array of Integer):Integer; //返回数组长度
var
iCyc:Integer;
begin
Result := 0;
for iCyc := Low(Arr) to High(Arr) do //计算数组长度
Inc(Result);
if Result > 0 then
Arr[Low(Arr)]:= 4; //改变数组中第一个元素的值,
//如果要禁止在函数过程中出现赋值行为,把函数声明成
// function Fn1(const Arr:array of Integer):Integer;
//这样,将不能对传进来的Arr数组进行赋值操作。
end;

//调用方法:
var
Arr: array [0..25] of Integer; //定义26个长度的数组
begin
Arr[0] :=2; //赋值
ShowMessage(IntToStr(Fn1( Arr)) + ';'+ IntToStr( Arr[0]));//A[0]的值没有被改变
end;

//使用自定义类型时:
type
IntArray = array[1..3] of Integer;
//调用方法:
var
Arr: IntArray;
begin
Arr[1] := 2;
ShowMessage(IntToStr(Fn1(Arr)) + ';'+ IntToStr(Arr[1]));
end;
参考技术A

在 delphi 中,参数的传递可分为值传递、var地址传递,以及 out(输出)、const(常数)。

前两者的区别,功能上的区别在于:

值传递过程中,对于参数的修改不影响源。

引用传递过程中,对于参数的修改,会直接修改源本身。

如果是以引用方式(即传递地址方式),前面需要添加关键字 var

如:

function TForm1.upadd(var na:intarray): Integer;

问题描述中的代码,实现的就是值传递而非地址传递方式。

参考技术B 你这个是静态数组,本身就是值传递的 参考技术C type
pIntArr = ^intarray;
intarray = array[1..3] of integer;

function TForm1.upadd(const na:intarray): Integer;

var
nb: pIntArr;
begin
new(nb);
nb^ := na;
nb[1]:=30;
nb[2]:=30;
nb[3]:=30;
upadd:=na[3];
dispose(nb);
end;
参考技术D 我测试发现,只要在函数定义中不使用var,这个数组就是值传递啊,函数内部修改了也无效!!!亲测

将向量数组作为函数参数传递以更改原始值

【中文标题】将向量数组作为函数参数传递以更改原始值【英文标题】:Passing array of vectors as a function parameter to change the original values 【发布时间】:2014-10-20 13:44:43 【问题描述】:

我有一个向量数组(整数),我想将它作为参考传递给成员函数,以便可以对其进行修改。 (它实际上是我的函数的输出,但我已经有一个返回值。)

我写了这样的东西

int Dag::dag2array(vector<int> (&aVectors)[4])
 
//some stuff
//calling another function tree2array(aVectors) 
//passing the same array as reference

它编译并运行,尽管它看起来不像我想要的那样。

在一个或多或少相反的问题(Passing array of vectors as a function parameter (values will not change))中,答案说可以在没有&amp; 的情况下修改数组,并且它不会复制,但它就像一个指针。

    为什么像int 这样的变量需要&amp; 来避免 复制并能够“即时”修改原始变量的值而不是数组? 我是否应该使用&amp;

【问题讨论】:

你的问题不清楚。与您想要的相反,代码实际上做了什么? 向量数组?那只是邪恶的。使用 C++ 或 C,不要同时使用! 试试vector&lt;vector&lt;int&gt;&gt;&amp; @NeilKirk: 使用 vector>& 可以更改第一个向量的大小,在我的情况下它是固定的,因此 array, 4>& 会产生更多感觉。我只是想了解这一切是如何运作的! @SebastianRedl:我的代码不会更改作为参数 (aVectors) 给出的数组。 【参考方案1】:

这是 C 数组让生活变得困难的情况之一。我强烈推荐使用std::array(或者std::tr1::array,如果你还没有使用C++11)。而不是那种晦涩难懂的语法,说

int func(std::array<std::vector<int>, 4>& vectors)

清楚地表明您通过引用传递了一个由 4 个向量组成的数组,因此可以通过说来修改值

vectors[1][2] = 19;

或者你有什么。

【讨论】:

【参考方案2】:

当一个数组被传递给一个函数时,它的类型被调整为一个指向它的第一个元素的指针。同样,T[N] 形式的参数声明调整为T*。传递的指针被复制,但向量的元素根本不被复制。这意味着在取消引用指针时,您仍然可以通过数组访问语法array[n](实际上只是指针算法:*(array + n))引用原始数组元素。

如果您通过值将实际对象传递给函数,则会发生副本,因此如果您仍想修改元素,则需要引用。

所以不,您不需要通过引用传递数组。除非你想在函数中访问数组的大小(因为数组到指针的衰减会丢弃数组大小)。

【讨论】:

以上是关于请问:delphi 中数组作为函数的参数传递,这样传过去的是地址,怎样把数组作为值传递过去?的主要内容,如果未能解决你的问题,请参考以下文章

delphi 数组作为参数传递

delphi如何调用多个参数的函数

请问这个C语言中有参数的函数是怎么传递值的,调用的时候没有参数啊。

delphi中的函数传参如何传枚举参数?

javascript 函数作为参数名

c#调用Delphi DLL参数为结构体数组