请问: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,这个数组就是值传递啊,函数内部修改了也无效!!!亲测
骑常润坦: 我查材料知道了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 ...