4.2 函数调用与参数传递选讲

本节的函数将更加复杂有趣,如返回多个值,或者拥有交换两个变量的功能
错误的代码示范:(笔者认为这边的理解应该在学完指针后理解会更加了解为什么会产生这个错误)

点击查看代码
#include<stdio.h>
void swap(int a, int b)
{
	int t;
	t = a;
	a = b;
	b = t;
}

int main()
{
	int a, b;
	scanf("%d%d", &a, &b); 
	swap(a, b);
	printf("%d %d\n", a, b);
	return 0;
}

这个程序一看是三变量交换算法,但是这里的程序测试后并不会交换a,b的值,在这里原作的作者是这样解释的
a = a + 1;这边先计算赋值符号右边的a+1然后把它装入变量a,覆盖原来的值
1.先计算参数的值因为a = 3, b = 4,所以swap(a, b)等价于swap(3, 4)这里的3和4被称为实际参数(简称为实参)
2.把实参赋值给函数声明中的a和b。注意,这里的a和b与调用时的a和b是完全不同的。前面已经说过,实参最后将算出具体的值,swap函数知道调用他的参数是3和4(也就是说实参会先将前面的计算的式子全部计算出来后,然后将计算出来的值传送给调用的函数,此时该函数接收到的参数被称为形式参数)实参最后算出具体的值,swap函数知道调用它的参数是3和4,却不知道是怎么算出来的。函数声明中的a和b称为形式参数(简称形参)
3.这样一来,程序里有个变量a,一个在main函数里面定义,一个是swap的形参,二者不会混淆,因为函数(包括main函数)的形参和在该函数里定义的变量都被称为该函数的局部变量。不同函数的局部变量相互独立,即无法访问其他函数的局部变量。需要注意的是局部变量的存储空间是临时分配的,函数执行完毕时,局部变量的空间将被释放,其中的值无法保留到下次使用。与此对应的是全局变量,此变量在函数外声明,可以在任何时候,由任何函数访问。需要注意的是,应该谨慎使用全局变量。也就是在函数中定义的变量是局部变量,不在函数中定义的变量是全局变量
4.函数的形参和在函数内声明的变量都是该函数的局部变量。无法访问其他函数的局部变量(应该是无法直接访问该局部变量,通过指针的传递还是可以访问该变量),局部变量的存储空间是临时分配的,在函数执行完毕时,局部变量的空间将被释放,其中的值无法保留到下次使用。在函数外声明的变量是全局变量,可以被任何函数使用。操作全局变量有风险,应谨慎使用。
5.执行完毕后,函数会将返回值返回给调用他的函数,然后再次修改当前代码行,恢复到调用他的地方继续执行,那么系统是如何实现这样子的操作呢?下面会给出解释

学术讨论环节

上一篇:Linux swap分区管理、i节点、block块


下一篇:2021-09-29