-
2021-02-04 18:18:19
在C语言中,关于形参与实参说明如下。
1) 形参是变量,但是函数被调用时才被分配内存。当函数执行完毕返回时,形参占用的内存空间又被释放。
2)实参可以是变量、常量和表达式,但实参必须有确定的值。
3)形参和实参的类型必须一致。
4)对应的实参和形参是两个独立实体,它们之间只有单向的值的传递,即实参的值传递给形参。形参的值在函数中不论怎么改变,都不会影响实参。
以上来自 C语言程序设计(第三版)/杨路明主编
个人观点:虽然在C语言中形参实参按值传递,但是按形参实参类型又可分为:值类型(数值类型、char型、struct及enum类型),引用类型(指针),这会影响参数传递是否会影响到原来的值。
更多相关内容 -
老生常谈C++中实参形参的传递问题
2020-12-31 00:19:49这是最普通,也是最简单的形参传递了。 参数传递,即是使用实参副本(注意啊,是副本,不是实参本身)来初始化形参; 因此,在函数体内对形参的修改不会影响实参的值。 如果形参是指针类型的,那么函数体内是否可以... -
python 函数(实参与形参、传递参数)
2020-11-20 22:02:44函数什么是函数?函数是带名字的代码块,用于完成具体的工作。写出一个函数后,就可以一直...即是下一节讲到的形参1 #向函数传递信息23 defgreet_user(username):4 """显示简单的问候语"""5 print("hello," + userna...函数
什么是函数?函数是带名字的代码块,用于完成具体的工作。写出一个函数后,就可以一直调用。
定义函数,函数的基本组成:
1.1 向函数传递参数
向函数中传递任意参数,这样打印出的结果就可以根据自己的选择,做出改变。即是下一节讲到的形参
1 #向函数传递信息
2
3 defgreet_user(username):4 """显示简单的问候语"""
5 print("hello," + username + "!")6
7 greet_user('python')
打印结果:
hello,python!
2、形参与实参
什么是形参?顾名思义,形参就是形式上的参数,可以理解为数学的X,没有实际的值,通过别人赋值后才有意义。相当于变量。
什么是实参?顾名思义,实参就是实际意义上的参数,是一个实际存在的参数,可以是字符串或是数字等。
以上面的例子介绍下什么是形参和实参:
就是在函数名中定义一个形参,然后在函数调用的时候,给函数名中的形参传递一个实际的参数,这个就变为实参。这样的话执行函数体内容时就会执行对应的操作。
注意:传入实参时,一定要加上引号,否则会报错。
greet_user(python)
NameError: name'python' is not defined
3、传递实参(位置实参、关键字实参、默认值、等效的函数调用、避免参数错误)
使用背景:
函数定义中可能包含多个实参,而向函数传递实参的方式有很多,位置实参和关键字实参等。
3.1、位置实参
调用函数时,必须将函数调用中的每个实参都关联到函数定义中的一个形参。关联方式是基于实参的顺序,这被称作位置实参
1 #位置实参
2 defdescribe_pet(animal_type,pet_name):3 """显示宠物信息"""
4 print("\nI have a" + animal_type + ".")5 print("My" + animal_type + "'s name is" + pet_name.title() + ".")6
7 describe_pet('dog','harry')
执行结果:
I have a dog.
My dog's name is Harry.
3.1.1 可以多次调用函数
1 defdescribe_pet(animal_type,pet_name):2 """显示宠物信息"""
3 print("\nI have a" + animal_type + ".")4 print("My" + animal_type + "'s name is" + pet_name.title() + ".")5
6 describe_pet('dog','harry')7
8 #可以多次调用
9 describe_pet("cat",'coo')10 describe_pet('pig','echo')
执行结果:
1 I have a dog.2 My dog's name is Harry.
3
4 I have a cat.5 My cat's name is Coo.
6
7 I have a pig.8 My pig's name is Echo.
3.1.2 实参的位置也很重要,本末倒置可不好
describe_pet('coo','dog')
执行结果:
I have a coo.
My coo's name is Dog.
3.2、关键字参数
关键字实参 是传递给函数的名称:值对。直接将形参与实参关联起来,这样就不存在顺序问题(不会像上一个例子一样出现搞笑的结果)。
示例:
1 2、关键字实参2 defdescribe_pet(animal_type,pet_name):3 """显示宠物信息"""
4 print("\n关键字实参示例:")5 print("I have a" + animal_type + ".")6 print("My" + animal_type + "'s name is" + pet_name.title() + ".")7
8 describe_pet(animal_type="dog",pet_name="harry")
执行结果:
关键字实参示例:
I have a dog.
My dog's name is Harry.
3.3、默认值参数
在编写函数时,可以给每个形参设定一个固定值,即为默认值。
在调用函数给形参提供实参时,就使用实参值,否则,使用实参的默认值,因此,给形参指定默认值后,在函数调用中省略相应的实参。
1 #默认值参数
2 def describe_pet(pet_name,animal_type = 'dog'):3 """显示宠物信息"""
4 print("\n关键字实参示例:")5 print("I have a" + animal_type + ".")6 print("My" + animal_type + "'s name is" + pet_name.title() + ".")7
8 describe_pet(pet_name="harry")
执行结果:
1 默认值实参示例:2 I have a dog.3 My dog's name is Harry.
注意点:这里把pet_name 放在了前面,原因是在这里还是把它当做是位置参数,如果形参与实参的位置不对应,还是会报错
如果不想使用默认值参数,也可以在调用函数时,将形参定义一个值,这样函数名中的形参默认值就会被忽略。
1 describe_pet(animal_type="cat",pet_name="harry")
3.4、等效的函数调用
什么叫等效的函数调用,即在函数调用时,无论是使用位置参数还是关键字参数、默认值参数、等到的结果都是一样的,这样的方式就是等效调用。
示例:
1 #函数等效调用
2 #一个名为harry 的小狗
3 def describe_pet(pet_name,animal_type = 'dog'):4 describe_pet(pet_name="harry")5 describe_pet("harry")
3.5、避免实参错误
意思就是在进行参数调用时,要给形参传一定的实参。否则会报
最后,欢迎关注我的公众号,这里分享Python/Java技术,自动化、以及认知感悟。
-
函数实参与形参之间的传递
2018-04-13 23:24:25在函数调用这会涉及到形参与实参个两个概念,于是上网查了一下实参与形参的概念。 实参是指在函数调用时,必须有确切的值以便赋给形参的一种参数,它可以为常量,变量,表达式,函数等。 形参是在定义函数名和...在函数调用这会涉及到形参与实参个两个概念,于是上网查了一下实参与形参的概念。
实参是指在函数调用时,必须有确切的值以便赋给形参的一种参数,它可以为常量,变量,表达式,函数等。
形参是在定义函数名和函数体时使用的一种参数,目的是用于接收调用该函数时传递的参数。它只能是变量。
1,传值调用,顾名思义,就是对值的传递。但它只是对形参里的值发生了变化,并没有对实参的值有任何变化。接下来我用堆栈法来试试解释, 定义一个函数名为exchange的函数,其作用是实现里面的数交换。代码如下:
#include<stdio.h>
void exchange(int one,int another);
void exchange(int one,int another) {
int temp;
temp=one;
one=another;
another=temp;
}
void main(void){
int num1=14,num2=7;
exchange(num1,num2);
printf("%d %d\n",num1,num2);
}在主函数定义了两个实参为num1,num2在子函数中定义形参为one,another这种操作等效于one=num1,another=num2。即实参表达式的值在系统堆栈中占用的空间就是与之对应的形参变量的空间。实参先入栈,栈顶指针esp往上飘,即num2先入栈,占据4个字节,接着num1入栈,等效于站在num2上,再占据4个字节,在函数调用时栈底指针ebp移到当前栈顶指针位置,再接着temp入栈,等效于把当前 栈底指针向上的空间分配给了子函数的局部变量即。。。。。。。。。temp,再占据4个字节,函数调用完后恢复到子函数调用之前的栈顶和栈底指针.
进行temp=one时,等效于把one空间的值赋给temp的空间,即temp为14,
one=another ,等效于把another空间的值赋给one空间, 即one为7,
another=temp等效于把temp空间的值赋给another空间,即another为14。
此刻one和another空间的值分别为7,14但num1和num2空间的值根本就没变。故不能实现交换。2,引用调用
同样的例子用到这个函数中
void realexchange(int *one,int *another){
int temp;
temp=*one;
*one=*another;
*another=temp;
}
void main(void){
int num1=14,num2=7;
realexchange(14,7);printf("%d %d\n",num1,num2);
}
在主函数定义为这两个实参的取地址即&num1,&num2。这种操作等效于one指向num1,anothor指向num2。如图
在进行temp=*one时,等效于将one所指空间的值赋给temp的空间,即temp为14; *one=*another等效于将another所指向的空间的值赋给one所指向的空间,即num1为7;*another=temp等效于把temp空间的值赋给another所指向的空间,即num2为14。这样下来num1与num2的值发生了变化。即转换成功。
总而言之,事实上,形参的空间就是实参表达式的值入栈的空间,它并没有额外的申请空间。若在以后形参表达式的值能够影响到实参的结果时,则实参应该传地址给形参,若不需要形参的表达式来改变实参的值时,则只需要传值给形参即可。。。 -
指针在实参与形参间传递的作用
2020-09-13 13:51:34实参与形参的区别 使用 形参出现在函数定义中,在整个函数体内都可以使用,离开该函数则不能使用。 实参出现在主调函数中,进入被调函数后,实参变量也不能使用,无法修改。 调用 形参变量只有在被调用时才...实参与形参的区别
使用
-
形参出现在函数定义中,在整个函数体内都可以使用,离开该函数则不能使用。
-
实参出现在主调函数中,进入被调函数后,实参变量也不能使用,无法修改。
调用
-
形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量。
-
实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使参数获得确定值。
不是指针类型在内存中位置不同:
-
当形参和实参不是指针类型时,在该函数运行时,形参和实参是不同的变量,他们在内存中位于不同的位置,形参将实参的内容复制一份,在该函数运行结束的时候形参被释放,而实参内容不会改变。
-
形参的作用是实现主调函数与被调函数之间的联系,通常将函数所处理的数据,影响函数功能的因素或者函数处理的结果作为形参。
在子函数修改值
无指针通过形参修改实参
#include<stdio.h> int main() { int a=2,b=3; int * af,* bf; void exchange(int aa,int bb);//声明函数 af=&a; bf=&b; printf("a=%d,b=%d,af=%d,bf=%d\n",a,b,*af,*bf); exchange(a,b); printf("a=%d,b=%d,af=%d,bf=%d\n",a,b,*af,*bf); } void exchange(int aa,int bb) { int i; i=bb; bb=aa; aa=i; }
有指针通过修改地址指向的值来修改实参
#include<stdio.h> int main() { int a=2,b=3; int * af,* bf; void exchange(int *aa,int *bb); af=&a; bf=&b; printf("a=%d,b=%d,af=%d,bf=%d\n",a,b,*af,*bf); exchange(af,bf); printf("a=%d,b=%d,af=%d,bf=%d\n",a,b,*af,*bf); } void exchange(int *aa,int *bb) { int i; i=*bb; *bb=*aa; *aa=i; }
有指针通过修改地址来修改实参
通过交换af和bf的地址来改变两者的指向
#include<stdio.h> int main() { int a=2,b=3; int * af,* bf; void exchange(int *aa,int *bb); af=&a; bf=&b; printf("a=%d,b=%d,af=%d,bf=%d\n",a,b,*af,*bf); exchange(af,bf); printf("a=%d,b=%d,af=%d,bf=%d\n",a,b,*af,*bf); } void exchange(int *aa,int *bb) { int* i; i=bb; bb=aa; aa=i; }
结论
1.无指针通过形参修改实参无法实现:因为实参与形参的值传递是单向传递,实参与形参的地址也不同,两个参数本身是不同的变量。
2.有指针通过修改地址指向的值来修改实参成功:子函数通过指针,即地址找到变量的所在地,直接修改。
3.有指针通过修改地址来修改实参无法实现:同一,在该函数中,指针变量同样是实参与形参的关系,无法双向传导。附:
定义与声明的区别
1、在一个程序中,变量只能定义一次bai,却可以声明多次;
2、定义分配存储空间,而声明不会。声明:用于向程序表明变量的类型和名字。
定义也是声明:当定义变量的时候我们声明了它的类型和名字。可以通过使用extern声明变量名而不定义它。不定义变量的声明包括对象名、对象类型和对象类型前的关键字extern。
&、*与地址、变量值的关系
假设
int a=2; int* aa=&a;
则可得以下结果
a、*aa为变量a的值,为2。
aa、&a为变量a的地址。 -
-
形参和实参之间的三种传递方式
2021-05-24 07:03:51//形参和实参之间的三种传递方式void fun(int i){ i++;}void fun(int &i){ i++;}void fun(int *i){ *i=*i+1;}若指针指向的是数组的首地址,则数组元素的访问方式1.数组名[i] 指针名[i]2.*(数组名+i) *(指针名+i)... -
实参向形参的传递是值的传递。如果实参指向的是一个对象,实参的值就是地址的值。
2020-12-18 10:58:21实参向形参的传递是值的传递。如果实参指向的是一个对象,实参的值就是地址的值。 package test; import java.util.ArrayList; public class Test { public static void main(String[] args){ String[] a=new ... -
关于c语言函数实参形参传递的几种方式总结
2019-07-28 11:21:54关于函数实参形参传递的几种方式下面用简单的打印函数来实现 1.常量传递,实参是常量,形参是变量 #include <stdio.h> #define PI 3 //定义了一个常量PI ,其中值为3 void print(int n); //声明了一个print... -
python函数 (实参与形参)
2020-11-25 06:21:14函数什么是函数?函数是带名字的代码块,用于完成具体的工作。写出一个函数后,就可以一直...即是下一节讲到的形参1 #向函数传递信息23 def greet_user(username):4 """显示简单的问候语"""5 print("hello," + usern... -
实参到形参的传递
2018-02-18 15:52:58函数调用时,实参传递到形参时的转换问题? 要点: 参数的传递就是用实参初始化对应的形参。 非引用形参: 基本的情况:复制实参的值。函数并没有访问调用函数所传递的实参本身,所以不会改变实参的值。 ... -
实参与形参
2020-06-21 12:09:38形参的值不是固定的,形参要与实参实际传入的数据一一相对应。 实参:在调用时,实际传入函数中的值,传入后,在函数中使用形参中获取具体的值。 形参顾名思意是形式上的参数 没有具体值 你在写一个方法的时候... -
实参与形参的传递关系
2016-04-22 13:04:44这种情况下,实参是把值传递给形参,形参在函数中改变值不会影响实参。 2、传递实体对象: 这种情况中,实参实际是把对象在堆栈中的地址传递给形参。当形参变量调用方法改变值时,其实改变的是指向这个对象的值,... -
python 引用传递和值传递详解(实参,形参)
2020-09-16 18:05:52主要介绍了python 引用传递和值传递详解(实参,形参)。具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧 -
C++解析实参与形参区别
2022-02-26 22:03:45值传递 -
深刻理解形参和实参的三种传递方式(值传递,地址传递,引用传递)
2021-05-29 10:36:34文章目录前言一、值传递二、地址传递三、引用传递总结 前言 在主函数实现了解传递的本质。 提示:以下是本篇文章正文内容,下面案例可供参考 一、值传递 在主函数中 #include <iostream> using namespace ... -
函数实参和形参之间的传递
2017-10-22 14:24:46在调用函数过程中发生的实参与形参间的数据传递,常称为“虚实结合” 1.在定义函数中制定的形参,在没有出现函数调用时,它们不占内存中的存储单元。在发生函数调用时,函数的形参被临时分配内存单元。 2.将实参的... -
python 实参与形参
2020-01-10 14:48:42是实际占用内存地址的,而形参只是意义上的一种参数,在定义的时候是不占内存地址的,如在上面例子中,username就是一个形参,尼古拉斯赵四是我在调用函数时传入的一个实参,它的值被存储在形参username中。... -
实参和形参
2021-02-28 18:09:18当你在定义一个方法的时候,比如 void setter...此时a就是实参 实参a把他的值传递给形参i基本数据类型实参传递给形参的是值对象实参传递给形参的是对象的引用====================================================在... -
C++实参与形参
2017-06-28 08:49:15实参出现在函数调用的地方,实参的数量与类型与形参一样,实参用于初始化形参。 2.形参和函数体内部定义的变量统称为局部变量,仅在函数的作用域内可见,同时局部变量还会隐藏在外层作用域中同名的其他所有声明... -
Java实参与形参,值传递与引用传递
2021-04-06 15:16:59Java实参与形参,值传递与引用传递 java的形参与实参 public static void main(String args[]){ int a=0; //a实参 test(a); System.out.println(a); } //test(形参类型 形参名) public static void test(int... -
Java的实参、形参和参数传递机制
2018-12-29 01:16:311.形参:用来接收调用该方法是传递的参数。在被调用时才分配内存空间,一旦调用结束就释放内存,作用域为方法内部。 public void swapValue(int a, int b) { ...2.实参:传递值给被调用方法,且该... -
C语言中实参和形参的区别
2020-11-06 21:42:57即实际参数,是在调用时传递给函数的参数,实参可以为常量,变量,表达式,函数等,无论实参为何种类型的量,在进行函数调用的时候都需要有确定的值,以便将这些值传递给形参。所以应当预先用赋值,输入等方法使实参... -
如何理解实参与形参,怎样区分?
2021-11-30 15:00:51实参全称为"实际参数"是在调用时传递给函数的参数,即传递给被调用函数的值。实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值,以便把这些值传送给形参... -
实参和形参是否共用同一个储存单元
2021-12-23 22:48:50形参只是实参的一个副本,即拷贝,它们不能公用存储单元。 如果传入的是指针,那么形参就是实参的一个指针拷贝。此时,形参指针和实参指针指向同一块内存区域,虽如此,但是,不能说它们本身占同一个存储单元。 ... -
Python的形参和实参使用方式
2020-09-18 06:12:37今天小编就为大家分享一篇Python的形参和实参使用方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧