C语言中的函数 | 传值调用和传址调用

写在前面:

刚开始学习函数的时候难免遇到参数传递的烦恼,实参和形参该如何区分,传值调用和传址调用的区别到底是什么?面试的时候又该如何表述呢?下面就让我们一起探索吧!

一.函数的参数

实际参数(实参):

真实传给函数的参数.实参可以是:常量,变量,表达式,函数等.

不管实参时何种类型的量,在进行函数调用时,它们必须有确定的值,以便把这些值传送给形参.

形式参数(形参):

形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内存单元).形式参数当函数调用完成之后就自动销毁了,因此形式参数只在函数中有效.

C语言中的函数 | 传值调用和传址调用

二.传值调用和传址调用

 首先在讲这两者之前,可以先看一下下面的两个函数以及最终的结果.

#include <stdio.h>
void swap1(int a, int b) {
	int tmp = a;
	a = b;
	b = tmp;
}

void swap2(int* pa, int* pb) {
	int tmp = *pa;
	*pa = *pb;
	*pb = tmp;
}

int main() {
	int num1 = 2, num2 = 5;
	swap1(num1, num2);
	printf("swap1: num1 = %d num2 = %d\n", num1, num2);
	swap2(&num1, &num2);
	printf("swap2: num1 = %d num2 = %d\n", num1, num2);
	return 0;
}

C语言中的函数 | 传值调用和传址调用

可以看到swap1函数没有完成两数交换的功能,而swap2却完成了,这里究竟是为什么呢?下面可以继续分析分析...

解析:

C语言中的函数 | 传值调用和传址调用

 传值调用:形参是实参的一份拷贝,在调用swap1函数的时候会开辟空间拷贝数据,因此在swap1函数中对形参的值进行交换并不会影响到实参的值.

C语言中的函数 | 传值调用和传址调用

 传址调用:同样形参是实参的一份拷贝,在调用swap2函数的时候也会开辟空间拷贝数据,但是这里的数据是地址,也就是指针.虽然说是不同的两块空间,但是存储的是同样的地址,地址指向的是同一块空间.因此形参所指向的值发送改变,也会影响到实参所指空间值的改变.

传值调用可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量.

再好的种子,不播种下去,也不会结出丰硕的果实.

上一篇:简述箭头函数基本使用和this指向的问题


下一篇:Day11