python中函数参数是引用传递(不是值传递)。对于不可变类型,因变量不能被修改,所以运算时不会影响到变量本身;而对于可变类型来说,函数体中的运算有可能会更改传入的参数变量.
形参: 函数需要传递的参数
实参:调用函数时传递的参数
想学Python的可以一起学习这是交流q u n 227-435-450
函数调用传递实参有三种:值传递、地址传递、引用传递。
下面介绍在函数内部修改形参会同步修改实参的两种方法:地址传递和引用传递。
#include<bits/stdc++.h>
using namespace std;
typedef struct
{
int *elem;//为存储空间的基地址,故使用时需为其分配内存,如以下两个函数中所示,若写为elem[20]数组形式则不用。
int len;
}node;
void aaa(node *L1)
{
(*L1).elem=new int[20];
for(int i=0;i<4;i++)
cin>>(*L1).elem[i];
}
void bbb(node &L2)//&为引用类型,声明L2是List2的引用,对L2操作修改也就是直接对List2修改
{
L2.elem=new int[20];
for(int i=0;i<4;i++)
cin>>L2.elem[i];
}
int main()
{
node List1,List2;
/*函数传递实参做法1:地址传递*/
aaa(&List1);//&为取地址符
for(int i=0;i<4;i++)
cout<<List1.elem[i]<<' ';
cout<<endl;
/*函数传递实参做法2:引用传递*/
bbb(List2);
for(int i=0;i<4;i++)
cout<<List2.elem[i]<<' ';
cout<<endl;
}
补充:
int x=5;
int *y=&x; //用于指针传递,y有自己独立的内存地址,存储的内容是x的地址,*y是x的值,即*y等于5。
int &z=x; //用于引用传递,就是使z成为x的别名,修改其中任意一个另一个的值也会随之改变。
若用数组名作为函数调用时的实参,则实际上传递给形参的是数组首地址。
数组首地址数组第一个元素的地址。数组名字本身就是一个指针,它是一个指针常量,指向的地址不变。
比如定义了一个数组变量,编译器就会在内存中划分了一块地址空间给它,数组名这个指针常量就指向了这块内存空间的首地址,而数组首元素就存在这段内存空间的首地址处,即这段内存空间的首地址跟数组首元素的内存地址是一样的。
扩展资料:
形参的作用是实现主调函数与被调函数之间的联系,通常将函数所处理的数据,影响函数功能的因素或者函数处理的结果作为形参。
没有形参的函数在形参表的位置应该写void.main 函数也可以有形参和返回值,其形参也称为命令行参数,由操作系统在启动程序时初始化,其返回值传递给操作系统。
两者关系:
在一般传值调用的机制中只能把实参传送给形参,而不能把形参的值反向地传送给实参。因此在函数调用过程中,形参值发生改变,而实参中的值不会变化。而在引用调用的机制当中是将实参引用的地址传递给了形参,所以任何发生在形参上的改变实际上也发生在实参变量上。
相信很多C语言初学者都知道形参实参的概念,但在函数调用中,仍然还有很多人会混淆,本文将借助示例代码详细解释C语言中形参实参及传值调用和引用调用。
函数调用中存在两类参数:形式参数及实际参数,两类参数的功能和使用甚至所占空间都不尽相同。下面本文将解释二者的异同。
形式参数(formal parameter),简称形参,是在函数头括号内声明的,某一函数私有的局部变量,。在函数外部中同名变量不会与之冲突。每次调用函数,会对函数头内定义的形参赋值。
在使用ANSI C形式声明函数原型:
void function( char a, int b);
当函数接受参数时,函数原型用逗号分隔的列表指明参数的数量和类型。
实际参数(actual argument),简称实参,它是**主调函数(calling function)赋给被调函数(called function)**的具体值。它可以是常量,变量,正确的表达式,甚至是函数。但无论如何实参必须有一个具体的值以供拷贝于形参之中。
简而言之,形参实际上是一种“空白”或是一种“占位符”,在函数调用的过程中,我们在某一已定义的函数中的括号内使用实参,此后函数将会拷贝实参至函数体内“填充”形参,并在函数体内得到使用。
至于怎样使用,本文将在后续段落进行详细描述。
实参的传递过程有两种不同的机制,其分别是传值调用和引用调用。
在传值调用过程中,形参是一个局部变量,其初值为调用函数是括号内赋予的实参的值。其只是使用了实参的值,在程序运行时,其在函数体内占用另外的内存空间,不对实参造成影响。
#include<stdio.h>
int fun1(int a,int b){
a=2;
b=2;
}
int main(){
int i=0;
int j=0;
printf("before change:\ni=%d,j=%d\n",i,j);
fun1(i,j);
printf("after change:\ni=%d,j=%d\n",i,j);
}
其运行结果如下:
我们发现,果然,传值调用中对形参的操作不会对实参造成影响。
在引用调用过程中,形参传递的不再只是一个值或是一个简单的结果,而是传递实参的地址。虽然形参仍然是一个占位符或是一个空白,但将实参拷贝到形参上后,它不再如传值调用一样占用额外的内存空间,而是和实参占用同一个内存空间。发生在形参上的任何改变都将与此同时体现在实参上。
实例1:
#include<stdio.h>
int fun3(int *a,int *b){
int m,*c;
m=0;
c=&m;
*c=*a;
*a=*b;
*b=*c;
}
int main(){
int *p,*q,s,t;
s=11;
t=24;
p=&s;
q=&t;
printf("before change:\ns=%d,t=%d\n",*p,*q);
fun3(p,q);
printf("after change:\ns=%d,t=%d\n",*p,*q);
}
其运行结果如下:
在此例中,我们调用函数时代入的实参分别是s和t的地址,因此发生引用调用,在函数中对s和t进行交换后,实参s和t的值同时也被交换。
实例2:
#include<stdio.h>
#define N 4
int fun3(int *a){
int i;
for (i=0;i<N;i++){
a[i]=0;
}
}
int main(){
int i;
int m[]={1,2,3,4};
printf("before change:\nm[4]=");
for (i=0;i<N;i++){
printf("%d ",m[i]);
}
printf("\n");
fun3(m); /*此时的m是一个数组名,同时也是数组m第一个值m[0]的地址,此时发生引用调用*/
printf("after change:\nm[4]=");
for (i=0;i<N;i++){
printf("%d ",m[i]);
}
printf("\n");
}
其运行结果如下:
我们可以清晰地看见实参数组m的值在函数内部发生了变化。
python中函数参数是引用传递(不是值传递)。对于不可变类型,因变量不能被修改,所以运算时不会影响到变量本身;而对于可变类型来说,函数体中的运算有可能会更改传入的参数变量.
形参: 函数需要传递的参数
实参:调用函数时传递的参数
想学Python的可以一起学习这是交流q u n 227-435-450