函数调用时的实参和java形参和实参的区别之间的数据是单向的什么传递

查看: 9973|回复: 11|关注: 0
请教Matlab关于调用函数时的参数传递问题
<h1 style="color:# 麦片财富积分
新手, 积分 5, 距离下一级还需 45 积分
主函数如下:
function test
d=[ 2*x - 2*y - 4, 4*y - 2*x];
x1=temp-a*d;
f=test_fun(x1(1),x1(2))
这里得到的x1是一个关于a的矩阵
调用的函数如下:
function f=test_fun(x,y)
test_fun(x,y)=x+y;
f=test_fun(x,y);
希望能在主函数中调用test_fun得到一个关于a的表达式,但是系统总是报错,只有把主程序里的调用参量改为常数才可以。因为刚开始接触matlab,对函数调用还不熟悉,麻烦各位帮忙看看应该要想传递这类表达式样子的参数应该怎么写程序啊?谢谢!
<h1 style="color:# 麦片财富积分
关注者: 44
test_fun(x,y)=x+y;这样写有问题
Matlab学无止境!
欢迎加入Matlab QQ交流群:
论坛优秀回答者
关注者: 110
|此回复为最佳答案
原帖由 ydye1987 于
15:36 发表
主函数如下:
function test
d=[ 2*x - 2*y - 4, 4*y - 2*x];
x1=temp-a*d;
f=test_fun(x1(1),x1(2))
这里得到的x1是一个关于a的矩阵
调用的函数如下:
function f=test_ ...
你的程序问题不大,下面的代码可以放到一个m文件中,存成test.m文件,然后运行
function test
syms a
x0=[1 1];
x=x0(1);
y=x0(2);
temp=x0;
d=[ 2*x - 2*y - 4, 4*y - 2*x];
x1=temp-a*d;
f=test_fun(x1(1),x1(2))
function f=test_fun(x,y)
f=x+y;& &%关键是这里写的不对,已改过,不必用自己的函数名来做中间变量
复制代码结果
About me:/article-43-1.html
<h1 style="color:# 麦片财富积分
明白了,谢谢大家!
<h1 style="color:# 麦片财富积分
不好意思,还要麻烦大家帮忙解答一下~还是这个问题,如果我已知a的具体值,有办法在调用子函数得到表达式的同时求得这个表达式的值吗?比如说调用的时候将a的具体值传过去,然后子函数能返回表达式的值。这样应该如何修改啊?
论坛优秀回答者
关注者: 110
原帖由 ydye1987 于
16:35 发表
不好意思,还要麻烦大家帮忙解答一下~还是这个问题,如果我已知a的具体值,有办法在调用子函数得到表达式的同时求得这个表达式的值吗?比如说调用的时候将a的具体值传过去,然后子函数能返回表达式的值。这样应该如何修改啊? ...
在主函数的末尾,test_fun之前加一句
f=test_fun(x1(1),x1(2))
fa=subs(f,a,2) %加在这里
function f=test_fun(x,y)
f=x+y;&&
fa=subs(f,a,2)
复制代码运行结果:
其中,2为a取的具体值,你可以自己赋值
如果想传回值,需在主函数上加
function [f fa]=test()
syms a
x0=[1 1];
x=x0(1);
y=x0(2);
temp=x0;
d=[ 2*x - 2*y - 4, 4*y - 2*x];
x1=temp-a*d;
f=test_fun(x1(1),x1(2));
fa=subs(f,a,2); %加在这里
function f=test_fun(x,y)
f=x+y;&&
然后在命令窗或是其他函数中调用
[fab, fvalue]=test
fab =
fvalue =
& &&&6
复制代码
[ 本帖最后由 ljelly 于
17:02 编辑 ]
About me:/article-43-1.html
论坛优秀回答者
关注者: 110
如果觉得这样不方便,a值还要在函数内部赋值,麻烦
可以把这句提出来,操作
function [f a]=test()
syms a
x0=[1 1];
x=x0(1);
y=x0(2);
temp=x0;
d=[ 2*x - 2*y - 4, 4*y - 2*x];
x1=temp-a*d;
f=test_fun(x1(1),x1(2));
a=a;
function f=test_fun(x,y)
f=x+y;&&
复制代码然后在命令行,或其他m文件中调用
[fab fvalue]=test
value=subs(fab,fvalue,2)
复制代码结果
About me:/article-43-1.html
<h1 style="color:# 麦片财富积分
非常感谢!程序关键的一步终于解决了~:victory:
<h1 style="color:# 麦片财富积分
ljelly 发表于
在主函数的末尾,test_fun之前加一句运行结果:
过来看看,帮助很大,谢谢,顶一个!
<h1 style="color:# 麦片财富积分
我怎么没看懂呢 哎 看来还是需要继续修炼啊&&我也是碰到一个问题
function [Tfo,qh0,Tfoo,qh00,T]=groundHEoperationheating(Tfluid0,Tinit)
这个函数中,Tfluid0是一个变量,跟时间步长有关,我在主程序中可以计算出该步长下的Tfluid0的值,希望调用这个函数计算出一个时间不长之后的Tfo值,运行时,这个Tfluid0换成具体的常数就可以运行,如果先赋值给它,比如在命令窗口中输入:
Tfluid0 = 8; Tinit = 14; [Tfo,qh0,Tfoo,qh00,T]=groundHEoperationheating(Tfluid0,Tinit)
就不能运行,
如果直接 [Tfo,qh0,Tfoo,qh00,T]=groundHEoperationheating(8,14)
则可以运行
不知道怎么改,我的 Tfluid0&&是随时间变化的,:Q:Q
站长推荐 /2
Powered by1240人阅读
C/C++(14)
&&&&&&&& 在定义函数时函数括号中的变量名成为形式参数,简称形参或虚拟参数;在主调函数中调用一个函数时,该函数括号中的参数名称为实际参数,简称实参,实参可以是常量、变量或表达式。
&&&&&&&& 1、C语言中实参和形参之间的额数据传递是单向的“&#20540;传递”,单向传递,只能由实参传给形参,反之不能。
&&&&&&&& 2、被调用函数的形参只有函数被调用时才会临时分配存储单元,一旦调用结束占用的内存便会被释放。
&&&&&&&& 3、不论是“按&#20540;传递”还是“按地址(指针)传递”,传递的都是实参的一个拷贝。
一、按&#20540;传递
&&&&&&&& 主调函数向调用函数传递参数实际上只是将实参的拷贝(即临时副本)传递给了被调用函数,并不是实参本身,这样被调函数不能直接修改主调函数中变量的&#20540;,而只能修改其私有的临时副本的&#20540;。
下面是&#20540;传递的的例子
#include &stdio.h&
int main()
int a=2,b=3;
void swap(int x,int y);
printf(&before:%d,%d\n&,a,b);
swap(a,b);
printf(&later:%d,%d\n&,a,b);
void swap(int x,int y)
下面的例子体现了不论传递的是&#20540;还是地址,传递给被调用函数的都是实参的一个拷贝,直接对拷贝进行操作不会影响实参,但是可以通过地址间接地改变实参的&#20540;,请参见按地址传递的例子
#include &stdio.h&
int main()
int a=2,b=3;
void swap(int* x,int* y);
printf(&before:%d,%d\n&,a,b);
swap(&a,&b);
printf(&later:%d,%d\n&,a,b);
void swap(int* x,int* y)
int *tmp=NULL;
二、按地址传递
&&&&&&&&&&&& 引用传递是将实参地址的拷贝传递给被调用函数,在被调用函数中可以通过地址对其&#20540;进行修改,(因为虽然是实参地址的拷贝,但是这个拷贝确确实实是实参的地址,因此可以根据这个地址找到实参进而可以对其&#20540;进行修改)
#include &stdio.h&
int main()
int a=2,b=3;
void swap(int* x,int* y);
printf(&before:%d,%d\n&,a,b);
swap(&a,&b);
printf(&later:%d,%d\n&,a,b);
void swap(int* x,int* y)
三、按引用传递
&&&&&&& 对引用的操作等于对其制定的对象进行操作,当将实参传递给形参时,形参就指向了实参。
代码如下:
#include &stdio.h&
void swap(int& a,int& b)
int main()
int i=3,j=4;
printf(&before swap:i=%d,j=%d\n&,i,j);
swap(i,j);
printf(&After
swap:i=%d,j=%d\n&,i,j);
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:26151次
排名:千里之外
原创:31篇
转载:57篇
(1)(5)(1)(1)(1)(2)(4)(8)(7)(3)(9)(7)(7)(2)(2)(2)(8)(17)函数调用中的数据传递方法
日&&星期五
&&<font color='#12-10-3 10:49:09&&&&<font color='#12-10-27 15:03:15&&&&<font color='#17-5-13 22:37:34&&
※ 您现在的位置:
函数调用中的数据传递方法
作者:khhb&& 录入:hebin&&点击数:1357&& 时间: 14:32:27
函数调用中的数据传递是函数使用中比较困难的问题。C 语言规定在函数间传递数据有四种方式:值传递方式、地址传递方式、返回值方式、全局变量传递方式。前两种方式是利用函数的参数来传递数据的;后两面三刀种方式不是利用函数参数来传递数据的。
 &&& 一、值传递方式
  值传递方式是在形式参数和实际参数之间传递数据的一种方式。&&&&&& 值传递方式所传递的是参数值。调用函数时,将实际参数的值计算出来赋予对应的形式参数。在函数体中对形式参数的加工与实际参数已完全脱离关系。当函数体执行完毕,形式参数中的值可能发生改变,但是返回后,这些形式参数中的不回带到对应的实际参数中。因此,值传递方式的特点是“参数值的单向传递”。  依据上述的特点可以看出,用值传递方式时,形式参数一般都是变量,实际参数可以是变量,也可以是表达式。  当调用某函数时,C 语言对值传递方式的形式参数的变量将自动分配内存,然后将实际参数的值存入对应的内存,完成值传递。从函数返回时,自动将分配的内存收回,其值将丢失。下次再调用该函数,又会重新分配内存。  前面介绍的例6-3就是一个利用“值传递方式”将实际参数x-y、y-z、z-w的值传递给形式参数x1、x2、x3的。主函数中的定义语句"int x,y,z,w,m;"将给变量x、y、z、w、m分配内存。当执行到调用函数语句 "m=max(x-y,y-z,z-w);" 时,将转向函数max()。由于该函数有三个形式参数x1、x2、x3,所以给它们分配内存。然后计算三个实际参数x-y、y-z、z-w(均为表达式)的值并存入形式参数x1、x2、x3所分配的内存中。进入函数体,先给变量max分配内存,对形式参数x1、x2、x3进行运算,求得的最大数存入变量max中,通过返回语句将max中的值回带到主函数,存入主函数定义的变量m中,同时释放分配给函数max的形式参数x1、x2、x3和函数体中定义变量max的内存。
 &&& 二、地址传递方式
  地址传递方式也是在形式参数和实际参数之间传递数据的一种方式。  地址传递方式所传递的是地址。调用函数时,将实际参数的地址赋予对应的形式参数作为其地址。由于形式参数和实际参数地址相同,即它们占用相同的内存。所以调用时,可以看成将实际参数的值传递给形式参数:返回时,可以看成将形式参数的值回带给对应的实际参数。其特点是“参数值的双向传递”。  由此可知,采用地址传递方式的实际参数只能是变量的地址、数组名(数组首地址)或指针变量等,而接受地址值的形式参数也只能是指针变量或数组名。  前面介绍的例6-4就是一个利用“地址传递方式”在形式参数b[]数组和实际参数a[]数组之间传递数据的。主函数中的数据定义语句"int a[10];"将给数组a分配内存。当执行到调用函数语句"f(a);"时,将转向函数f()。由于该函数的形式参数是数组名b(地址型),所以只要将实际参数(数组a)的首地址传递给它,并不为这个形式参数数驵重新分配内存。在函数体中对数组b元素的任何处理,都直接反映到地址相同的实际参数数组a的对应列元素中。
 &&& 三、值传递和地址传递方式的区别
  值传递和地址传递方式都是在实际参数和形式参数之间传递数据。惟一的区别就是:值传递方式传递的是数值;地址传递方式传递的是地址值。  值传递方式是将实际参数的值传递给对应的形式参数,形式参数应分配内存,数据传递是单向的,只能从主调函数向被调函数传递。其形式参数一般是变量,实际参数是变量或表达式。  地址传递方式是将实际参数的地址值传递给对应的形式参数(必须能接受地址值),如果形式参数是数组将不再分配内存。接受地址值的形式参数一般是指针变量或数组名,实际参数可以是变量的地址、数组名或存放地址值的指针变量。形式参数的地址等于实际参数对应的地址,即它们对应的变量或数组将占用完全相同的内存单元。在被调函数中使用的名称是形式参数名称,在主调函数中使用的名称是实际参数名称。由于我们关心的传递对象是数据,所以可以理解成(相同内存中的)数据传递是双向的。  下面我们通过一个例子来理解值传递和地址传递的区别。  [例6-5]编一个无返回值函数,将两个实数中的大者存放到第1个形式参数中,将小者存放到第2个形式参数中。再编一个主函数,输入两个实数,按从大到小的顺序输出。  利用“值传递方式”,编出如下的程序。 main() /*主函数*/ {   void sort2();  /*被调函数在后,且不是整型和字符型,要说明*/  float f1,f2;   scanf("%f,%f",&f1,&f2); /*输入两个实数*/  sort2(f1,f2);      /*调用函数sort2()*/   printf("max=%f min=%f\n",f1,f2); /*输出结果*/ }    /*将x1和x2中大者存入x1,小者存入x2的函数*/  void sort2(x1,x2) /*定义无返回值的用户函数*/ float x1,x2; {      if(x1&x2) { x=x1;x1=x2;x2=x;} /*如果x1&x2,则交互*/   }  注意,这个程序是错误的!因为使用的是“值传递方式”,在调用函数sort2()时,将实际参数f1、f2的值传递给形式参数x1、x2。进入sort2()函数体后,大数存入形式参数x1,小数存入形式参数x2。由于是单向数据传递,所以排序的是形式参数x1和x2,而不是实际参数f1、f2。回到主函数时,形式参数x1和x2的值并不回带到实际参数f1和f2中,f1和f2将保持原值不变。运行这个程序时,如果输入的两个实数是5.1,9.2,输出的结果将是:     max=5.1 min=9.2  为了能将实际参数f1、f2中的大数存入f1,小数存入f2,应使用“地址传递方式”,使数据双向传递。  正确的程序清单如下:/*将x1和x2所指向的数据库中大者存入x1指向的地址,小者存入x2指向的地址的函数.*/void sort2(x1,x2) /*定义无返回值的用户函数*/float *x1,*x2; /*说明两个形式参数是实型的指针变量,以便接受地址值*/{  if (*x1&*x2)   /*如果x1指向和实数&x2指向的实数,则交互两个实数*/  {x=*x1; *x1=x2;*x2=x;} }/*主函数*/main(){  float f1,f2;      /*被调函数在前,不必加以说明*/ scanf("%f,%f",&f1,&f2);/*输入两个实数*/ sort2(&f1,&f2);    /*调用函数sort2()*/ printf("max=%f min=%f\n",f1,f2); /*输出结果*/}  由于采用了地址传递方式,调用sort2()函数时,是将实际参数f1、f2的地址传递给了形式参数:两个能存放地址值的指针变量x1、x2。在sort2()的函数体中,通过形式参数(指针变量)处理它们所指向的变量:实际参数f1、f2。从而实现f1中存放大数、f2中存放小数。读者可以运行这个程序,如果输入的两个实数是5.1,9.2,输出结果是:     max=9.2 min=5.1
 &&& 四、返回值方式
  返回值方式不是在形式参数和实际参数之间传递数据,而是通过函数调用后直接返回一个值到主调函数中。因此这种方式通常适用于从被调函数中将一个值传回主调函数。  利用返回值的方式传递数据,在定义函数时,必须要注意下列两点:  (1)函数头中要有“数据类型说明符”,说明该函数返回值的数据类型。  (2)函数体中应有“return(表达式);”语句,其中表达式值就是函数返回值。  前面的例6-3就是利用返回值方式将3个整数中的最大数带回到主函数中的。这个函数的返回值为整型,所以在定义函数时,函数的数据类型要定义成"int"。
 &&& 五、全局外部变量的传递方式
  全局外部变量的传递方式也不是在形式参数和实际参数之间传递数据,而是利用在主调函数和被调函数中均有效的全局外部变量,在主调函数和被调函数之间任意传递数据。  关于全局变量的概念,在前面已介绍过。所谓全局变量是指从定义点到整个程序的结尾均有效的变量。具体说,全局变量有两种:一种是任何函数外定义的变量,它的作用域覆盖了定义点到程序结尾之间的所有函数,这种全局变量叫做“外部变量”;第二种是在函数体内定义为“静态型”的变量,这种变量在从函数返回后,仍保留所分配的内存(活着),但是不能使用,它的作用域仍为该函数体内。这种全局变量叫做“内部变量”。因此在函数之间利用全局变量传递数据,只能使用“外部变量”。  下面看一个利用全局外部变量在函数间传递参数的例子。  [例6-6]编一个无返回值函数,对存放在形式参数实型数组b的前10个实数求最大值、最小值和平均值。在主函数中输入数组的元素值,输出求出的最大值、最小值和平均值。  程序清单如下:float fmax,fmin, /*定义全局外部变量fmax,fmin,fave*/main() /*主函数*/{ void f1();   /*被调函数在后,且不是整型和字符型,要加以说明*/ float a[80],*p;  for(p=a;p&a+10;p++) scanf("%f",p); /* 用指针输入数组元素 */ f1(a);     /*调用函数f1求最大值、最小值、平均值*/ printf("max=%f\n min=%f\nave=%f\n",fmax,fmin,fave);}void f1(float b[]) /*求实型数组b的前10个数中最大值、最小值和平均值的函数*/{ float *p=b; fmax=fmin=fave=*p;/*将第1个元素值当成当前最大、最小值、平均值*/ p++;      /*让指针指向第2个数组元素*/ while(p&b+10) { if(fmax&*p) fmax=*p; /*求当前最大值*/ & if(fmin&*p) fmin=*p; /*求当前最小值*/ & fave+=*p;   /*求当前的累加值*/ & p++;      /*让指针指向下一个数组元素*/ } fave/=10.0;  /*求平均值*/ return}  在本程序中,由于变量fmax、fmin、fave是在所有函数之外定义的,所以是“外部变量”。这样的全局变量就是"全局外部变量",它们的作用域是从定义点到本程序的末尾,可以在这个作用域内的函数间传递数据。具体来说,在f1()函数中出现的fmax、fmin、fave变量指的是它们,计算出来的最大值、最小值、平均值已存入这些变量中;在主函数中出现的fmax、fmin、fave也是指的它们,输出它们的值就是在函数if()中求出的最大值、最小值和平均值。这种方式在函数间传递数据就是利用全局外部变量来实现的。注意,如果把定义全局外部变量的语句(程序中第一条语句)移到主函数和if()之间,由于它们的定义域只是定义点到程序末尾,即函数if(),则主函数中出现的fmax、fmin、fave变量将没有定义,程序会出现错误;如果全局外部变量和函数体内部定义的“内部变量”重名,则C语言规定内部变量优先,即函数体内出现的这个重名变量是指内部变量,不是指全局外部变量。  虽然利用全局外部变量可以在函数间传递数据,但从格式化程序设计的角度来说,并不推荐使用这种方式,因为它破坏了程序的模块化结构,在程序模块(函数)中无法确定某些全局外部变量的特性,必须在模块(函数)之外去寻找,造成了程序可读性着的缺点。
趣逸网 网址:http://www.khez.net/hb
版权所有 Copyright& 2012
维护制作:何彬 E-mail: 以下试题来自:
单项选择题在调用函数时,如果实参是简单变量,它与对应形参之间的数据传递方式是______。
A) 地址传递
B) 单向值传递
C) 由实参传递给形参,再由形参传递给实参
D) 传递方式由用户指定
为您推荐的考试题库
你可能感兴趣的试题
1A.一个自定义函数中必须有一条return语句B.一个自定义函数中可以根据不同情况设置多条return语句C.定义成void类型的函数中可以有带返回值的return语句D.没有return语句的自定义函数在执行结束时不能返回到调用处2A) 程序错误,不允许嵌套定义 B) X=93C) X=81 D) 程序错误,宏定义不允许有参数3A) intnum[0..2008]; B) intnum[];C) int N=2008; D) #defineN 2008int num[N]; int num[N];4A) 1 B) 3 C) 2 D) 45A) cde B) 字符'c' C) 字符'c'的地址 D) 无确定的输出结果
热门相关试卷
最新相关试卷

我要回帖

更多关于 形参和实参 的文章

 

随机推荐