想要用代码去交换两个数字的值,我们最简单也是最常见的方法即是通过一个空的变量去存放值,然后再将此值去赋给其他变量。
例如,我们设空的变量为z,想要去交换x和y的值,则可以有如下的代码:
#include<stdio.h>
int main()
{
int x = 66;
int y = 77;
int z = 0;
z = x;
x = y;
y = z;
printf("x = %d y = %d\n",x,y);
return 0;
}
这样,输出的结果即为:
此时,我们想创建一个函数,去简化主函数中的代码。
可能在第一次写的时候,会写成:
#include<stdio.h>
void Ec(int a,int b)//无返回值类型(不需要);
{
int k = 0;
k = a;
a = b;
b = k;
}
int main()
{
int x = 66;
int y = 77;
Ec(x,y);
printf("x = %d y = %d\n",x,y);
return 0;
}
但是当我们运行这个代码的时候,会发现,并没有起到交换的效果,输出如下:
为什么会这样,我们第一下可能会想到,是不是所设的函数并没有去改变主函数中x和y的值,我们可以来看一下:
首先我们去查看一下主函数中x和y的地址,看给他们赋的值是存放在了内存的哪个地方:
#include<stdio.h>
void Ec(int a,int b)
{
printf("Pa = %p\n",&a);
printf("Pb = %p\n",&b);
int k = 0;
k = a;
a = b;
b = k;
}
int main()
{
int x = 66;
int y = 77;
printf("Px = %p\n",&x);
printf("Py = %p\n",&y);
Ec(x,y);
printf("x = %d y = %d\n",x,y);
return 0;
}
利用指针,去看我们究竟将值赋在了内存的何处(如下图),可以发现,我们函数中所取的地址并不是实际x,y的地址,这也是为什么我们所写代码并未起到应有的用处(相当于没有交换直接打印)。
想要改变这一境况,我们就需要利用地址,去将地址相匹配才行,通过这一思路,我们可以写出相应的代码:
#include<stdio.h>
void Ec(int* P1,int* P2)
{
int k = 0;
k = *P1;//解引用操作,将P1的地址解出来,把地址里面的值赋给k;
*P1 = *P2;
*P2 = k;
}
int main()
{
int x = 66;
int y = 77;
Ec(&x,&y);//我们在这里要存放x,y的地址作为函数的变量;
printf("x = %d y = %d\n",x,y);
return 0;
}
利用地址,很好的将函数变量和主函数的x,y相匹配,从而达到了交换的目的。实现结果与我们最先开始的代码实现结果相同,即:
解析结束。
其实,这个就是形式参数和实际参数之间的一个应用,我们想通过函数内部的变化去影响外部值的交换,我们就要利用地址来实现,否则光是形参发生改变是影响不到实参的改变的。