一个案例让你明白函数传值和传址方式的区别。

文章目录

  • 一、自定义Swap()函数为什么无效呢????
  • 二、找问题
  • 总结



一、自定义Swap()函数为什么无效呢????

示例:定义一个交换的两个整数的函数,但是却没效果,为什么呢??????
代码如下。

void Swap(int x,int y)
{
	int z;
	z=x;
	x=y;
	y=z;
}
int main()
{

	int a=0;
	int b=0;
	int max;
	printf("a=");
	scanf("%d",&a);
	printf("b=");
	scanf("%d",&b);
	Swap(a,b);
	printf("a=%d\n",a);
	printf("b=%d\n",b);
	return 0;
}

一个案例让你明白函数传值和传址方式的区别。_第1张图片

二、找问题

a,b开辟了空间。
x,y开辟了空间
即,xy,ab是独立的空间
在本题中,我们不能直接传送实参(也就是main函数里的ab),因为形参(自定义函数里的xy)只是实参的一份临时拷贝,两者是独立的空间。就好比克隆羊多利,多利是死是活都不会影响到原来的羊。在函数里改变形参完全不会影响实参,那么我们应该怎么办呢?
就要用到指针的相关知识点:

int main()
{

	int a=10;//4个字节的空间
	int* pa=&a;
	*pa=20;
	printf("%d\n",a);
	return 0;
}

既然传值调用不能用,那我们可以采用取地址的方法,让函数从传值调用变成传址调用。
把函数里的传值加上取地址符&,并在函数swap中的*pa,*pb(指针符号),就可以把a和b的地址传送到函数里了.

改正:

void Swap(int* pa,int* pb)
{
	int z=0;
	z=*pa;
	*pa=*pb;
	*pb=z;
}
int main()
{

	int a=0;
	int b=0;
	int max;
	printf("a=");
	scanf("%d",&a);
	printf("b=");
	scanf("%d",&b);
	Swap(&a,&b);
	printf("a=%d\n",a);
	printf("b=%d\n",b);
	return 0;
}

一个案例让你明白函数传值和传址方式的区别。_第2张图片

总结

传值是把变量值传进去,而传址是把变量的地址传进去
由于自定义函数在调用完成之后就会被释放,所以如果采用传值的方式,形参不会改变实参。
而传址是把地址传进去,自定义函数是直接访问的是变量的地址,然后把该地址存储的数值改变了,所以即使自定义函数最终被释放了,形参会改变实参。

你可能感兴趣的:(c语言大杂烩,算法)