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

作者&投稿:旗策 (若有异议请与网页底部的电邮联系)
怎样把数组作为参数传递给函数~

1、数组做参数,完全无法按值传递。这是由C/C++函数的实现机制决定的。
2、传数组给一个函数,数组类型自动转换为指针类型,因而传的实际是地址。
下面三种函数声明完全等同:
void func(int array[10])
void func(int array[])
void func(int *array)

可以说是对,在C++中,数组并不像java那样是对象,C++的数组就是一段内存,值传递,其实是指针传递

当然,C++那么牛B的,肯定支持数组的引用传递了

值传递:
void fun(int arr[]);
实际上传递的是数组的首地址指针;

引用:
void fun(int (&arr)[SIZE]);
注意,方括号中的SIZE必须要写,而且在调用的时候必须用这个SIZE的数组,否则会出错;
例如:
void fun(int (&arr)[5]);
在调用的时候传入的数组必须是int型的大小为5的数组:
int nArr[5];
fun(nArr);
否则会错;

更牛B的用法:
刚才说了,C++是很牛B的,那么牛B的,难道定义的函数只能处理固定大小的数组?当然不是
这样定义,可以处理任意大小的数组:
template
void fun(int (&arr)[N]);
这样,任意大小的int型数组都可以传递进来了
这个方法叫“非类型模版参数”

//以传值方式传递数组参数的方法
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;

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

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

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

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

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

如:

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

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



你这个是静态数组,本身就是值传递的

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;

我测试发现,只要在函数定义中不使用var,这个数组就是值传递啊,函数内部修改了也无效!!!亲测


陈巴尔虎旗18811533070: 如何将一个二维数组作为函数function的参数传递,且二维数组的维数可变?
骑常润坦: 我查材料知道了delphi中传递的数组作为型参只能是形如一维数组的情势如:function getvalue(myarray:array of integer):type所以传递动态的二维数组徐如下定义 type Tarray:array of integer;function getvalue(myarray:array of Tarray):type再用setlength(myarray,3,4)设置动态数组的大大小以上欲望对大人人有所赞助!

陈巴尔虎旗18811533070: 在delphi中可以用多维动态数组作函数的参数吗?语法是怎样的? -
骑常润坦: 可以,其实是传递的数组地址指针,语法为:function fun1(var arr1:array of 类型);

陈巴尔虎旗18811533070: Delphi 函数如何引用数组; -
骑常润坦: 添加这个数组的单元名就可以了.在实现代码后面 usesxxxx; 然后即可引用,看基础吧.这些都是小事

陈巴尔虎旗18811533070: 在delphi中可以用多维动态数组作函数的参数吗?语法是如何的?
骑常润坦: 1procedure hehe(var tt:array of real);

陈巴尔虎旗18811533070: delphi的函数返回值可不可是数组,如何做
骑常润坦: 可以应用动态数组,然后再返回指针后攫取返回值.如下:TrtArr = record //定义返回构造 size : integer; //返回数组的长度 for i:=0 to arr.size-1 do //这里就可对接收到的数组攫取了end; function getArray() : TrtArr;var arrNo : array of integer;begin ...

陈巴尔虎旗18811533070: 请问:delphi 中数组作为函数的参数传递,这样传过去的是地址,怎样把数组作为值传递过去? -
骑常润坦: 在 delphi 中,参数的传递可分为值传递、var地址传递,以及 out(输出)、const(常数). 前两者的区别,功能上的区别在于: 值传递过程中,对于参数的修改不影响源. 引用传递过程中,对于参数的修改,会直接修改源本身. 如果是以引用方式(即传递地址方式),前面需要添加关键字 var. 如: function TForm1.upadd(var na:intarray): Integer;问题描述中的代码,实现的就是值传递而非地址传递方式.

陈巴尔虎旗18811533070: delphi中数组是如何用的? -
骑常润坦: 定义一个一维护数组: vari:integer;a1: array [1..100] of integer; 这样定义以后,就有a1[1]~a1[100]这样的100个整型变量可以使用,当然数组的元素也可以是其它的任何类型.数组的初始化一般使用循环语句,例如: for i:=1 to 100 do a1[i]:=...

陈巴尔虎旗18811533070: (delphi中)自定义函数中形参是数组的话怎么定义? -
骑常润坦: typeTSenddata=array of bytefunction CRC(var sendata:TSenddata; Len: Integer): word;这样试一下.很久没玩delphi...不知道是否正确.但希望能帮到您

陈巴尔虎旗18811533070: delphi 如何使用数组?
骑常润坦: eg.var i:integer; myarray:array of Integer;begin randomize; for i0 to 50-1 do myarray :=random(5000)end;

陈巴尔虎旗18811533070: 用delphi编写函数求一个数组中的最大值和最小值 -
骑常润坦: //求最大值 function GetMaxInArray(A: array of Integer): Integer; var I: Integer; tmpMax: Integer; begin tmpMax := A[0]; for I := low(A) to High(A) do begin if A[I] > tmpMax then tmpMax := A[I]; end; Result := tmpMax; end;//求最小值 function ...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网