本篇文章使用以下代码进行阐述说明:
- #include
-
- void SwapValue(int x,int y)
- {
- int t = 0;
- t = x;
- x = y;
- y = t;
- printf("x = %d,y = %d\n",x,y);
- }
-
- void SwapAddress(int* x,int* y)
- {
- int t = 0;
- t = *x;
- *x = *y;
- *y = t;
- printf("x = %d,y = %d\n", *x, *y);
- }
-
- int main()
- {
- int a = 3;
- int b = 2;
-
- SwapValue(a,b);
- //SwapAddress(&a,&b);
-
- printf("a = %d,b = %d\n",a,b);
- system("pause");
-
- return 0;
- }
什么是形参?比如有以下的交换数值函数:
其中int x,和int y就是形参,为什么叫形参?因为它们是没有数值的参数,类似两个没有装东西的瓶子:
函数里面定义了这两个瓶子需要怎么用(例子中就是把两个瓶子里面的内容交换过来),这种行为就和数学中的函数表达式一样:
比如公式:ax+by=c,x和y就是形参,只有确定了x和y具体等于多少,再根据公式计算才能得出结果:
图上在主函数中把具体数值传输到交换函数中去,这就是实参:
其实传值的具体核心上面已经全部讲完了,当主函数中把a和b的值复制一份给了X和Y,这样就导致四个瓶子里面有四个值:
紧接着,瓶子x和y根据函数规则进行交换,从而使得两个瓶子的数值调换:
所以可以得出最后的结果:
总结:函数调用中的传值是把实参中的数据复制一份给形参,所以两个参数之间互不相干。
传址的意思就是把实参的地址直接给了形参,让形参通过地址来修改真正的值,在例子中就相当于两个形参x和y把a和b连数据带瓶子全部装进了瓶子中:
然后再根据函数所示把瓶子里面的值进行互换:
代码如下:
输出之后你就会发现如下结果:
总结:函数调用中的传址是把实参的本体放到了形参里,所以两个参数之间会互相干扰。
题外话:如果将代码改成这样:
效果就会变成和传值一样:
因为这个的意思就是把瓶子X和瓶子Y里面的瓶子a和瓶子b互换:
如果你不知道是为什么,那就快快拿起你的笔记本去学习一下指针的相关知识~~