C语言函数传值调用和传址调用

文章详细阐述了函数的形参和实参概念,以及函数调用的传值和传址两种方式。在传值调用中,形参和实参在不同的内存块,形参的改变不影响实参;而在传址调用中,通过传递实参的地址,函数可以直接修改实参的值,实现数据的真正交换。
摘要由CSDN通过智能技术生成

目录

函数的参数

函数的形参

函数的实参

函数的调用

函数的传值调用

函数的传址调用

代码感受:写一个函数:交换两个数的值 

传值调用:

传址调用

函数的参数

函数的形参

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

函数的实参

真实传给函数的参数,叫实参。

实参可以是:常量、变量、表达式、函数等。

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

函数的调用

函数的传值调用

函数的形参和实参分别占有不同内存块,对形参的修改不会影响实参。

函数的传址调用

传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。 这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量。(其实就是操作同一块地址,修改这块地址的内存单元,就是修改了它本身。)

代码感受:写一个函数:交换两个数的值 

传值调用:

#include<stdio.h>

void swap1(int x, int y) //函数的形参
{
	int tmp = 0;
    
    //交换x,y的值
	tmp = x;
	x = y;
	y = tmp;
}

int main()
{
	int num1 = 3;
	int num2 = 7;
	swap1(num1, num2);//函数的实参
	printf("%d %d\n", num1, num2); 
	return 0;
}

运行结果:

可以看到,程序并没有成功交换这两个值,这是因为上面我们所说“函数传值调用” 函数的形参和实参分别占有不同内存块,对形参的修改不会影响实参

 可以看到,形参和实参各自拥有不同的地址空间,在调用这个函数的时候,仅仅只是对形参x,y进行了交换,对num1,num2没有任何影响也没有任何联系。而函数的形参是随着函数的调用结束而跟着一起销毁的(上面也有说明)。也就是说,等函数调用结束,形参x和y的内存块也被销毁了。而num1和num2并没有发生任何改变,所以函数的传值调用,其实形参就是实参的一份临时拷贝

传址调用

#include<stdio.h>
void swap2(int* x, int* y)//函数形参
{
	int tmp = 0;
    //交换x,y的值
	tmp = *x;
	*x = *y;
	*y = tmp;
}

int main()
{
	int num1 = 3;
	int num2 = 7;
	swap2(&num1, &num2);//函数实参
	printf("%d %d\n", num1, num2);
	return 0;
}

 

 此时的程序就成功地交换了num1和num2这两个数。这是因为在调用函数时,我们给 形参 传的是实参 的地址,这就等于说形参和实参建立起了真正的联系,此时对形参的改变就是对实参的改变

 可以看到,当形参和实参使用的是同一块内存空间时,对形参的改变其实就是对实参进行改变(形参通过实参的地址操作实参)

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值