当前位置 : 主页 > 编程语言 > c语言 >

函数的传值调用和传址调用

来源:互联网 收集:自由互联 发布时间:2023-09-03
1.引子 如果我们想创建一个函数exchange来交换两个变量的值,则有以下代码: #define _CRT_SECURE_NO_WARNINGS 1#includestdio.hvoid test_exchange(int x, int y) {int temp = 0;temp = x;x = y;y = temp;}int main() {int a

1.引子

如果我们想创建一个函数exchange来交换两个变量的值,则有以下代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void test_exchange(int x, int y) {
	int temp = 0;
	temp = x;
	x = y;
	y = temp;
}
int main() {
	int a = 10;
	int b = 20;
	test_exchange(a, b);
	printf("a=%d\nb=%d", a, b);
	return 0;

}

如果我们此时运行代码,发现a=10,b=20。它们的值不变,我们的用上面的test_exchange函数并没有达到交换两个变量的目的。问题出现在哪里?

2.实际参数和形式参数

上文中实际参数为a,b

形式参数为x,y

当我们调用函数时,实际参数a会把值传给x,但a和x存放在内存中的位置不同(函数在调用实际参数时会开辟一个新内存空间以创建一个形式参数来达到临时保存的目的

test_exchange函数仅仅把新内存中的x和y交换了,但对原内存中的a和b不会有任何影响。(尤其要注意函数的形式是void时,没有return任何数据,非常容易发生此类错误

3.传值调用和传址调用

上述的test_exchange函数即为传值调用

如果想达到交换变量的目的我们需要用到传址调用,代码如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//int*表示传递给函数的参数类型是地址
void exchange(int* x, int* y) {
	int temp = 0;
  //*为解地址符,会根据地址寻找存储在里面的值
	temp = *x;
	*x = *y;
	*y = temp;
}
int main() {
	int a = 10;
	int b = 20;
	exchange(&a, &b);
  //&为取地址符,为函数传递变量的地址
	printf("a=%d\nb=%d", a, b);
	return 0;

}

4.知识点补充

(1)实际参数和形式参数可以同名,上文中实际参数为a,b,那形式参数也可以设为为a,b。

原因:实际参数a,b为全局变量,形式参数a,b为函数内部的局部变量,函数在内部运行时会只读取它的局部变量

(2)&+参数形式的传参(仅限于c++)

&在此处不是解地址符,而是将形参的结果赋值给实参的操作符,可以改变实参本身的数值。

void test1(int a) {
	a++;
}
void test2(int& a) {
	a++;
}
int main() {
	int a = 1;
	test1(a);
	printf("%d", a); //结果为1,传值调用,实际参数不变
	test2(a);
	printf("%d", a); //结果为2,实际参数改变
	return 0;
}
【文章出处:建湖网页制作 http://www.1234xp.com/jianhu.html 处的文章,转载请说明出处】
上一篇:PACS服务器基本要求
下一篇:没有了
网友评论