C语言函数参数传递(非常重要)

合集下载

C语言中函数参数传递

C语言中函数参数传递

C语⾔中函数参数传递C语⾔中函数参数传递的三种⽅式(1)值传递,就是把你的变量的值传递给函数的形式参数,实际就是⽤变量的值来新⽣成⼀个形式参数,因⽽在函数⾥对形参的改变不会影响到函数外的变量的值。

(2)地址传递,就是把变量的地址赋给函数⾥形式参数的指针,使指针指向真实的变量的地址,因为对指针所指地址的内容的改变能反映到函数外,能改变函数外的变量的值。

(3)引⽤传递,实际是通过指针来实现的,能达到使⽤的效果如传址,可是使⽤⽅式如传值。

说⼏点建议:如果传值的话,会⽣成新的对象,花费时间和空间,⽽在退出函数的时候,⼜会销毁该对象,花费时间和空间。

因⽽如果int,char等固有类型,⽽是你⾃⼰定义的类或结构等,都建议传指针或引⽤,因为他们不会创建新的对象。

例1:下⾯这段代码的输出结果为:#include<stdio.h>void change(int*a, int&b, int c){c=*a;b=30;*a=20;}int main ( ){int a=10, b=20, c=30;change(&a,b,c);printf(“%d,%d,%d,”,a,b,c);return 0;}结果:20 30 30解析:1,指针传参 -> 将变量的地址直接传⼊函数,函数中可以对其值进⾏修改。

2,引⽤传参 -> 将变量的引⽤传⼊函数,效果和指针相同,同样函数中可以对其值进⾏修改。

3,值传参 -> 在传参过程中,⾸先将c的值复制给函数c变量,然后在函数中修改的即是函数的c变量,然后函数返回时,系统⾃动释放变量c。

⽽对main函数的c没有影响。

例2:#include<stdio.h>void myswap(int x, int y){int t;t=x;x=y;y=t;}int main(){int a, b;printf("请输⼊待交换的两个整数:");scanf("%d %d", &a, &b);myswap(a,b); //作为对⽐,直接交换两个整数,显然不⾏printf("调⽤交换函数后的结果是:%d 和 %d\n", a, b);return 0;}#include<stdio.h>void myswap(int *p1, int *p2){int t;t=*p1;*p1=*p2;*p2=t;}int main(){int a, b;printf("请输⼊待交换的两个整数:");scanf("%d %d", &a, &b);myswap(&a,&b); //交换两个整数的地址printf("调⽤交换函数后的结果是:%d 和 %d\n", a, b);return 0;}#include<stdio.h>void myswap(int &x, int &y){int t;t=x;x=y;y=t;}int main(){int a, b;printf("请输⼊待交换的两个整数:");scanf("%d %d", &a, &b);myswap(a,b); //直接以变量a和b作为实参交换printf("调⽤交换函数后的结果是:%d 和 %d\n", a, b);return 0;}第⼀个的运⾏结果:输⼊2 3,输出2 3第⼆个的运⾏结果:输⼊2 3,输出3 2第三个的运⾏结果:输⼊2 3,输出3 2解析:在第⼀个程序中,传值不成功的原因是指在形参上改变了数值,没有在实参上改变数值。

c函数数组参数传递

c函数数组参数传递

c函数数组参数传递一、函数数组参数传递的基本概念在C语言中,函数数组参数传递是一种常见的方式。

它可以将数组作为参数传递给函数,在函数内部对数组进行操作,并将结果返回给调用者。

这种方式可以提高程序的运行效率,减少代码量,也方便了程序的维护和修改。

二、C语言中函数数组参数传递的特点1. 数组名作为函数参数时,实际上是将数组首元素地址传递给了形参。

2. 数组作为函数参数时,可以改变数组元素的值。

3. 在函数内部对形参进行修改不会影响实参。

三、C语言中函数数组参数传递的方法1. 通过指针方式进行传递2. 通过下标方式进行传递3. 通过指针和下标混合方式进行传递四、通过指针方式进行传递1. 定义一个指向数组首元素的指针变量。

2. 将该指针变量作为形参,将实际的数组名作为实参。

3. 在函数内部使用该指针变量访问数组元素。

五、通过下标方式进行传递1. 将整个数组作为形参,将实际的数组名作为实参。

2. 在函数内部使用下标访问数组元素。

六、通过指针和下标混合方式进行传递1. 将指向数组首元素的指针变量和数组长度作为形参,将实际的数组名作为实参。

2. 在函数内部使用指针和下标访问数组元素。

七、C语言中函数数组参数传递的示例代码1. 通过指针方式进行传递void print_array(int *p, int n){int i;for(i=0;i<n;i++)printf("%d ",*(p+i));}int main(){int a[5] = {1,2,3,4,5};print_array(a,5);return 0;}2. 通过下标方式进行传递void print_array(int a[], int n) {int i;for(i=0;i<n;i++)printf("%d ",a[i]);}int main(){int a[5] = {1,2,3,4,5};print_array(a,5);return 0;}3. 通过指针和下标混合方式进行传递void print_array(int *p, int n){int i;for(i=0;i<n;i++)printf("%d ",*(p+i));}int main(){int a[5] = {1,2,3,4,5};print_array(&a[0],5);return 0;}八、C语言中函数数组参数传递的注意事项1. 在定义函数时,形参可以省略数组大小。

c语言函数多个参数传递

c语言函数多个参数传递

c语言函数多个参数传递摘要:1.引言2.C 语言函数参数传递的方式3.多个参数的传递4.传递参数的注意事项5.结论正文:【引言】C 语言是一种广泛使用的编程语言,它具有简洁、高效的特点。

在C 语言程序设计中,函数的使用是必不可少的。

函数可以实现代码的模块化,使程序更加清晰易懂。

在函数调用时,参数的传递是一个重要的环节。

本篇文章主要介绍C 语言函数多个参数的传递方法及其注意事项。

【C 语言函数参数传递的方式】C 语言函数参数传递方式主要有两种:值传递和指针传递。

1.值传递:函数在调用时,会将实参的值复制到形参中。

这意味着形参和实参是两个独立的变量,它们之间互不影响。

值传递适用于基本数据类型,如int、float 等。

2.指针传递:函数在调用时,会将实参的地址传递给形参。

这意味着形参和实参共享同一内存空间,对形参的修改将影响实参。

指针传递适用于数组和结构体等复合数据类型。

【多个参数的传递】在实际编程中,函数可能需要接收多个参数。

C 语言中,多个参数的传递可以通过以下方式实现:1.按顺序传递:将多个参数按照声明的顺序依次传递给函数。

这种方式较为简单,但当参数较多时,容易出错。

2.使用数组:将多个参数封装在一个数组中,然后将数组作为参数传递给函数。

这种方式可以减少参数传递的错误,但需要注意数组的大小和类型。

3.使用结构体:将多个参数封装在一个结构体中,然后将结构体作为参数传递给函数。

这种方式可以方便地管理多个参数,同时具有较好的封装性。

【传递参数的注意事项】在函数参数传递过程中,需要注意以下几点:1.参数类型匹配:确保实参的类型与形参的类型匹配,否则会导致编译错误。

2.参数顺序正确:按照函数声明的顺序传递参数,否则会导致函数调用失败。

3.注意参数传递的方式:根据参数的类型选择合适的传递方式,避免因为传递方式不当导致的程序错误。

【结论】C 语言函数多个参数的传递是程序设计中常见的场景。

通过掌握不同的参数传递方式和注意事项,可以有效提高程序的编写效率和稳定性。

C语言函数详解定义调用和参数传递

C语言函数详解定义调用和参数传递

C语言函数详解定义调用和参数传递C语言函数详解:定义、调用和参数传递函数是C语言中非常重要的概念,它能够将一段特定功能的代码组织在一起,并且可以在程序中被多次调用。

本文将详细介绍函数的定义、调用和参数传递的相关知识。

一、函数的定义在C语言中,函数的定义由函数头和函数体组成。

1. 函数头函数头由以下几个部分组成:返回类型:函数执行完毕后返回的数据类型,可以是void、int、char等。

函数名:函数的标识符,用来在程序中调用函数。

参数列表:函数接收的参数,可以有多个参数,每个参数之间用逗号隔开。

2. 函数体函数体是一段用花括号括起来的代码块,包含了函数的具体实现。

二、函数的调用在程序中调用函数,需要使用函数名和一对小括号。

1. 无返回值的函数调用如果函数定义中的返回类型是void,说明函数没有返回值。

例如,下面是一个无返回值的函数定义和调用的示例:```cvoid printMessage(){printf("Hello, World!");}int main(){printMessage(); // 调用函数return 0;}```2. 有返回值的函数调用如果函数定义中的返回类型不是void,说明函数有返回值。

例如,下面是一个有返回值的函数定义和调用的示例:```cint addNumbers(int a, int b){return a + b;}int main(){int result = addNumbers(5, 3); // 调用函数并接收返回值printf("结果是:%d", result);return 0;}```三、参数传递在函数定义中的参数列表中,可以定义多个参数,并在调用函数时传递相应的参数。

1. 值传递值传递是给函数传递参数的一种方式,就是将实际参数的值复制给形式参数。

例如,下面是一个使用值传递的函数调用示例:```cvoid changeValue(int num){num = num + 10;}int main(){int number = 20;changeValue(number); // 传递number的值printf("值传递后的number值为:%d", number); // 输出结果为20,值未改变return 0;}```2. 引用传递引用传递是给函数传递参数的另一种方式,通过传递参数的地址来修改实际参数的值。

函数参数传递的两种方式

函数参数传递的两种方式

函数参数传递的两种方式在编写函数时,函数的参数传递方式是非常关键的。

函数的参数传递方式分为值传递和引用传递两种方式。

本文将会对这两种方式进行详细介绍和比较。

一、值传递值传递是指函数参数在传递的过程中,实参的值被复制到函数的形参中进行传递。

这意味着,当函数在处理参数时,它只能获取到形参的副本,而无法改变原来实参的值。

因此,变量的值无法在函数内部改变。

当函数执行完毕后,这些参数的值将会被销毁。

在C语言中,基本数据类型、结构体以及数组等都属于值类型,它们默认的传递方式是值传递。

下面的例子演示了值传递的过程:```cvoid swap(int a, int b){int temp = a;a = b;b = temp;}上面的代码中,函数swap()将x和y的值交换,但由于传递的是参数的副本,函数并不能够改变x和y的值。

因此,最终输出结果还是原来的值。

优点:1. 值传递的方法比较简单。

2. 对于实参的值不需要保护的情况下,使用值传递往往会更高效。

3. 传递副本避免了不必要的占内存,对于内存的规划来说,非常有利。

1. 对于一些要修改实参值的情况,值传递无法完成。

2. 对于大数据的复制,值传递可能会导致内存的占用率上升。

二、引用传递引用传递是指将实参的地址传给函数,以便在函数内部操作实参的值。

因为直接传入的是实参的地址,所以函数内部对参数的操作直接就是作用于实参本身,可以改变参数的值。

引用传递使用&符号来传递地址。

在C语言中,使用指针类型传递参数可以实现引用传递。

下面的例子演示了引用传递的过程:上面的代码中,函数swap()使用指针类型参数,对于参数进行了引用传递,可以更改实参的值。

因此,在函数执行完成后,x和y的值已经被交换。

2. 可以省去大量复制数据的开销,加快函数的调用速度。

3. 引用传递可以使得函数在执行过程中,能够访问外部变量的地址,比较灵活。

2. 引用传递也会占用一些额外的空间。

综合比较在选择传递方式时,应该根据函数的实际需求进行选择。

C语言中如何进行函数的调用和参数传递

C语言中如何进行函数的调用和参数传递

C语言中如何进行函数的调用和参数传递C语言是一种广泛应用于系统编程和嵌入式开发的高级编程语言。

在C语言中,函数的调用和参数传递是非常重要的概念。

本文将介绍C语言中如何进行函数的调用和参数传递的基本原理和方法。

在C语言中,函数是程序的基本组成单元之一。

通过函数的调用,可以将程序的执行流程切换到函数中,并执行函数中的代码。

函数的调用可以帮助我们实现代码的模块化和重用,提高程序的可读性和可维护性。

在C语言中,函数的调用需要遵循一定的规则。

首先,我们需要在函数调用前声明函数的原型或定义函数的实现。

函数的原型告诉编译器函数的名称、返回值类型和参数列表等信息,以便编译器能够正确地处理函数的调用和参数传递。

函数的调用可以使用函数名称后跟一对圆括号的方式进行。

在圆括号中,可以传递函数所需的参数。

参数可以是常量、变量或表达式等。

在函数调用时,传递的参数将被复制到函数的形参中,函数在执行时可以使用这些参数进行计算或处理。

在C语言中,参数的传递可以通过值传递或引用传递进行。

值传递是指将参数的值复制到函数的形参中,函数在执行时使用的是形参的副本,对形参的修改不会影响到实参。

而引用传递是指将参数的地址传递给函数,函数在执行时使用的是实参的地址,对形参的修改会影响到实参。

在C语言中,函数的参数传递是通过栈来实现的。

栈是一种后进先出的数据结构,用于存储函数的局部变量、参数和返回值等信息。

在函数调用时,参数被依次压入栈中,然后函数开始执行。

在函数执行完毕后,栈会弹出参数,将控制权返回给调用函数。

除了值传递和引用传递外,C语言还支持指针传递。

指针传递是指将参数的指针传递给函数,函数在执行时可以通过指针来访问和修改实参。

通过指针传递参数,可以避免复制大量的数据,提高程序的效率。

在C语言中,函数的调用可以有返回值和无返回值两种形式。

有返回值的函数可以通过return语句返回一个值给调用者。

无返回值的函数可以使用void关键字来声明,表示函数不返回任何值。

c 函数传值和传址 数组

c 函数传值和传址 数组

c 函数传值和传址数组
C语言中函数参数传值和传址是非常重要的概念,尤其是在处理数组时。

首先,让我们来看一下函数参数传值和传址的概念。

在C语言中,当我们调用一个函数并传递参数时,参数可以通过传值或传址的方式传递给函数。

传值意味着函数接收的是参数的拷贝,对参数的修改不会影响到原始的值;而传址意味着函数接收的是参数的地址,对参数的修改会影响到原始的值。

对于数组来说,当我们将数组作为参数传递给函数时,实际上传递的是数组的地址,因此可以说数组在函数参数传递中是以传址的方式进行的。

这意味着在函数内部对数组元素的修改会影响到原始数组。

举个例子来说明传值和传址对数组的影响。

假设有一个函数
`modifyArray`,它接收一个数组作为参数并修改数组的元素。

如果我们以传值的方式传递数组,那么在函数内部对数组元素的修改不会影响到原始数组;但如果以传址的方式传递数组,函数内部对数组元素的修改会影响到原始数组。

另外,需要注意的是,在C语言中可以通过指针来实现传址的效果。

当我们将指针作为参数传递给函数时,实际上传递的是指针的地址,这样函数就可以通过指针来修改原始值。

总的来说,对于数组来说,函数参数传递是以传址的方式进行的,因为实际上传递的是数组的地址。

这意味着在函数内部对数组元素的修改会影响到原始数组。

而如果需要以传值的方式进行数组的操作,可以考虑使用指针作为参数传递,这样就可以实现传址的效果。

希望这个回答能够帮助你理解C语言中函数参数传值和传址对数组的影响。

c语言函数参数传递方式

c语言函数参数传递方式

c语言函数参数传递方式C语言是一种广泛使用的编程语言,函数参数传递方式是C语言中非常重要的概念之一。

函数参数传递方式可以分为按值传递、按址传递和按引用传递三种方式。

本文将针对这三种方式进行详细讲解。

一、按值传递按值传递是指在函数调用时,将实际参数的值复制给形式参数,函数内部对形参的修改不会影响到实际参数的值。

这种方式适用于参数较少、参数值不需要在函数内部被修改的情况。

在按值传递的方式下,函数在栈内存中为形参分配空间,并将实参的值复制到形参中。

函数执行结束后,栈内存中的形参被销毁,不会影响到实参的值。

二、按址传递按址传递是指在函数调用时,将实际参数的地址传递给形式参数,函数内部通过指针对实参进行操作,可以修改实参的值。

这种方式适用于需要在函数内部修改实参值的情况。

在按址传递的方式下,函数在栈内存中为形参分配空间,并将实参的地址传递给形参。

函数内部通过指针对实参进行操作,修改实参的值。

由于传递的是地址,所以函数内部对形参的修改会影响到实参。

三、按引用传递按引用传递是C++中的特性,其本质是通过指针来实现的。

在C语言中,可以通过传递指针的方式来模拟按引用传递。

按引用传递的特点是可以修改实参的值,并且不需要像按址传递那样使用指针操作。

在按引用传递的方式下,函数在栈内存中为形参分配空间,并将实参的地址传递给形参。

函数内部通过引用的方式操作形参,可以直接修改实参的值。

由于传递的是地址,所以函数内部对形参的修改会影响到实参。

需要注意的是,按引用传递需要使用指针来实现。

在函数调用时,需要将实参的地址传递给形参,即传递一个指向实参的指针。

函数内部通过解引用指针来操作实参,可以达到修改实参的目的。

总结:C语言中的函数参数传递方式包括按值传递、按址传递和按引用传递三种方式。

按值传递适用于参数较少、参数值不需要在函数内部被修改的情况;按址传递适用于需要在函数内部修改实参值的情况;按引用传递需要使用指针来实现,通过传递实参的地址来实现对实参的修改。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、三道考题开讲之前,我先请你做三道题目。

(嘿嘿,得先把你的头脑搞昏才行……唉呀,谁扔我鸡蛋?)考题一,程序代码如下:void Exchg1(int x, int y){int tmp;tmp = x;x = y;y = tmp;printf("x = %d, y = %d\n", x, y);}main(){int a = 4,b = 6;Exchg1(a, b);printf("a = %d, b = %d\n", a, b);return(0);}输出的结果为:x = ____, y=____.a = ____, b=____.问下划线的部分应是什么,请完成。

考题二,程序代码如下:void Exchg2(int *px, int *py){int tmp = *px;*px = *py;*py = tmp;printf("*px = %d, *py = %d.\n", *px, *py);}main(){int a = 4;int b = 6;Exchg2(&a, &b);printf("a = %d, b = %d.\n", a, b);return(0);}输出的结果为为:*px=____, *py=____.a=____, b=____.问下划线的部分应是什么,请完成。

考题三,程序代码如下:void Exchg3(int &x, int &y){int tmp = x;x = y;y = tmp;printf("x = %d,y = %d\n", x, y);}main(){int a = 4;int b = 6;Exchg3(a, b);printf("a = %d, b = %d\n", a, b);return(0);}输出的结果为:x=____, y=____.a=____, b=____.问下划线的部分应是什么,请完成。

你不在机子上试,能作出来吗?你对你写出的答案有多大的把握?正确的答案,想知道吗?(呵呵,让我慢慢地告诉你吧!)好,废话少说,继续我们的探索之旅了。

我们都知道:C语言中函数参数的传递有:值传递、地址传递、引用传递这三种形式。

题一为值传递,题二为地址传递,题三为引用传递。

不过,正是这几种参数传递的形式,曾把我给搞得晕头转向。

我相信也有很多人与我有同感吧?下面请让我逐个地谈谈这三种传递形式。

二、函数参数传递方式之一:值传递(1)值传递的一个错误认识先看考题一中Exchg1函数的定义:void Exchg1(int x, int y) /* 定义中的x,y变量被称为Exchg1函数的形式参数*/{int tmp;tmp = x;x = y;y = tmp;printf("x = %d, y = %d.\n", x, y);}问:你认为这个函数是在做什么呀?答:好像是对参数x、y的值对调吧?请往下看,我想利用这个函数来完成对a,b两个变量值的对调,程序如下:main(){int a = 4,b = 6;Exchg1(a, b); /*a,b变量为Exchg1函数的实际参数。

*/printf("a = %d, b = %d.\n”, a, b);return(0);}我问:Exchg1()里头的printf("x = %d, y = %d.\n", x, y);语句会输出什么啊?我再问:Exchg1()后的printf("a = %d, b = %d.\n”, a, b);语句输出的是什么?程序输出的结果是:x = 6, y = 4.a = 4,b = 6.为什么不是a = 6,b = 4呢?奇怪,明明我把a、b分别代入了x、y中,并在函数里完成了两个变量值的交换,为什么a、b变量值还是没有交换(仍然是a = 4、b = 6,而不是a = 6、b = 4)?如果你也会有这个疑问,那是因为你根本就不知实参a、b与形参x、y的关系了。

(2)一个预备的常识为了说明这个问题,我先给出一个代码:int a = 4;int x;x = a;x = x + 3;看好了没,现在我问你:最终a值是多少,x值是多少?(怎么搞的,给我这个小儿科的问题。

还不简单,不就是a = 4、x = 7嘛!)在这个代码中,你要明白一个东西:虽然a值赋给了x,但是a变量并不是x变量哦。

我们对x任何的修改,都不会改变a变量。

呵呵!虽然简单,并且一看就理所当然,不过可是一个很重要的认识喔。

(3)理解值传递的形式看调用Exch1函数的代码:main(){int a = 4,b = 6;Exchg1(a, b) /* 这里调用了Exchg1函数*/printf("a = %d, b = %d.\n", a, b);}Exchg1(a, b)时所完成的操作代码如下所示。

int x = a; /* ← */int y = b; /* ← 注意这里,头两行是调用函数时的隐含操作*/int tmp;tmp = x;x = y;y = tmp;请注意在调用执行Exchg1函数的操作中我人为地加上了头两句:int x = a;int y = b;这是调用函数时的两个隐含动作。

它确实存在,现在我只不过把它显式地写了出来而已。

问题一下就清晰起来啦。

(看到这里,现在你认为函数里面交换操作的是a、b变量或者只是x、y变量呢?)原来,其实函数在调用时是隐含地把实参a、b 的值分别赋值给了x、y,之后在你写的Exchg1函数体内再也没有对a、b进行任何的操作了。

交换的只是x、y变量。

并不是a、b。

当然a、b的值没有改变啦!函数只是把a、b的值通过赋值传递给了x、y,函数里头操作的只是x、y的值并不是a、b的值。

这就是所谓的参数的值传递了。

哈哈,终于明白了,正是因为它隐含了那两个的赋值操作,才让我们产生了前述的迷惑(以为a、b已经代替了x、y,对x、y的操作就是对a、b的操作了,这是一个错误的观点啊!)。

三、函数参数传递方式之二:地址传递继续!地址传递的问题!看考题二的代码:void Exchg2(int *px, int *py){int tmp = *px;*px = *py;*py = tmp;printf("*px = %d, *py = %d.\n", *px, *py);}main(){int a = 4;int b = 6;Exchg2(&a, &b);printf("a = %d, b = %d.\n”, a, b);return(0);}它的输出结果是:*px = 6, *py = 4.a = 6,b = 4.看函数的接口部分:Exchg2(int *px, int *py),请注意:参数px、py都是指针。

再看调用处:Exchg2(&a, &b);它将a的地址(&a)代入到px,b的地址(&b)代入到py。

同上面的值传递一样,函数调用时作了两个隐含的操作:将&a,&b的值赋值给了px、py。

px = &a;py = &b;呵呵!我们发现,其实它与值传递并没有什么不同,只不过这里是将a、b的地址值传递给了px、py,而不是传递的a、b的内容,而(请好好地在比较比较啦)整个Exchg2函数调用是如下执行的:px = &a; /* ← */py = &b; /* ← 请注意这两行,它是调用Exchg2的隐含动作。

*/int tmp = *px;*px = *py;*py = tmp;printf("*px =%d, *py = %d.\n", *px, *py);这样,有了头两行的隐含赋值操作。

我们现在已经可以看出,指针px、py的值已经分别是a、b变量的地址值了。

接下来,对*px、*py的操作当然也就是对a、b变量本身的操作了。

所以函数里头的交换就是对a、b值的交换了,这就是所谓的地址传递(传递a、b的地址给了px、py),你现在明白了吗?四、函数参数传递方式之三:引用传递看题三的代码:void Exchg3(int &x, int &y) /* 注意定义处的形式参数的格式与值传递不同*/{int tmp = x;x = y;y = tmp;printf("x = %d, y = %d.\n", x, y);}main(){int a = 4;int b = 6;Exchg3(a, b); /*注意:这里调用方式与值传递一样*/printf("a = %d, b = %d.\n”, a, b);}输出结果:x = 6, y = 4.a = 6,b = 4. /*这个输出结果与值传递不同。

*/看到没有,与值传递相比,代码格式上只有一处是不同的,即在定义处:Exchg3(int &x, int &y)但是我们发现a与b的值发生了对调。

这说明了Exchg3(a, b)里头修改的是a、b变量,而不只是修改x、y了。

我们先看Exchg3函数的定义处Exchg3(int &x, int &y)。

参数x、y是int的变量,调用时我们可以像值传递(如:Exchg1(a, b); )一样调用函数(如:Exchg3(a, b);)。

但是x、y 前都有一个取地址符号“&”。

有了这个,调用Exchg3时函数会将a、b 分别代替了x、y了,我们称:x、y分别引用了a、b变量。

这样函数里头操作的其实就是实参a、b本身了,也就是说函数里是可以直接修改到a、b的值了。

最后对值传递与引用传递作一个比较:1)在函数定义格式上有不同:值传递在定义处是:Exchg1(int x, int y);引用传递在这义处是:Exchg3(int &x, int &y);2)调用时有相同的格式:值传递:Exchg1(a, b);引用传递:Exchg3(a, b);3)功能上是不同的:值传递的函数里操作的不是a、b变量本身,只是将a、b值赋给了x、y。

函数里操作的只是x、y变量而不是a、b,显示a、b的值不会被Exchg1函数所修改。

引用传递Exchg3(a, b)函数里是用a、b分别代替了x、y。

函数里操作的就是a、b变量的本身,因此a、b的值可在函数里被修改的。

相关文档
最新文档