C语言传值调用与传址调用的区别

传值调用:
传值调用是指当一个函数被调用时,C++根据实参和形参的对应关系将实参的值一一复制给形参,即实参的值单向传递给形参。但函数本身并不对实参进行任何操作,即使形参的值在函数中改变,实参的值也不会受到影响。

传址调用:
向函数传递参数的传址调用方法,是指把引用的地址复制给形式参数。在函数内,该引用用于访问调用中要用到的实际参数。这意味着,修改形式参数会影响实际参数。

下面给出传值调用的代码:

#include<stdio.h>

void swap(int x,int y)//形参 
{
    
    
 int tmp = x;
	x = y;
	y = tmp;
}

int main()
{
    
    
 int a, b, c;
 printf("请输入任意三个数\n");
 scanf("%d %d %d", &a, &b, &c);
 if (a > b)
	{
    
    
		swap(a, b); // 实参
	}

	if (b > c)
	{
    
    
		swap(b, c);
	}

	if (a > b)
	{
    
     
		swap(a,b);
	}
 printf("这三个数从小到大依次为%d %d %d:\n", a, b, c);

 return 0;
}

下图为运行结果
在这里插入图片描述
可见传值调用并未影响实参,这是因为swap这个函数在传参时将实参a和b传递给x和y只是把a和b的值拷贝给x和y,x和y的交换不会影响a和b。
而要想将a和b交换则需要引用调用。

下面给出传址调用的代码:

#include<stdio.h>

void swap(int* px, int* py) // 形参
{
    
    
	int tmp = *px;
	*px = *py;
	*py = tmp;
}

int main()
{
    
    
	int a, b, c;
	printf("请输入任意三个数\n");
	scanf("%d %d %d", &a, &b, &c);
	if (a > b)
	{
    
    
		swap(&a, &b); // 实参
	}

	if (b > c)
	{
    
    
		swap(&b, &c);
	}

	if (a > b)
	{
    
    
		swap(&a, &b);
	}
	printf("这三个数从小到大依次为%d %d %d:\n", a, b, c);

	return 0;
}

下图为运行结果:
在这里插入图片描述
可见传址调用可真正实现实参a和b的交换。

猜你喜欢

转载自blog.csdn.net/m0_52771278/article/details/110563828
今日推荐