形参和实参的概念其实没有意义。
// x, y 形参 int max(int x, int y); // a, b 实参 max(a, b);
现实中,根本没人说形参x,y,实参a,b,都统一用参数x,y,参数a,b表示。
英语有时候x,y会用parameter,也就是形参, a,b会用argument,也就是实参。但实际上大部分人也是混用的,有时候无论形参实参全用parameter,有时候全用argument,都代表参数。
形参和实参这两个词如果你全部用参数代替,也不会有任何歧义。给定代码,参数x,y,参数a,b,你是马上就知道他指的是什么,根本就不需要形参和实参来区分。并且区分出来其实也没什么意义。。
所谓形参和实参互不影响,这种书就不要读了。形参和实参的概念稍微提一下知道就行了,都没必要深入的东西,要强求新手去理解他背后的汇编机器代码(为何形参和实参互不影响),简直是反人类。这种没用的规则放弃就好了,没必要背,编程多了,再回来看这句话,自然就理解他什么意思了。
我一直认为,在C/C++里,“形参”和“实参”这两个概念是完全没必要的凭空捏造的垃圾概念。
事实上,从CPU架构和指令的角度来说,无论是寄存器传参还是压栈传参,传参就只有一种形式:传值。所区别的无非是这个“值”是实际的值还是指针的值(地址)而已——你把指针理解了,自然就理解了。
如果有些高级语言废除了指针的概念,那弄点其它概念去绕也行。但是对于C/C++,一句话就说清楚的事,根本没必要绕这些。
再补充一些:如果不用形参、实参之类的垃圾概念,怎么解释你的例子。
首先明确一点,你的两个例子两个函数的四个参数里,只有那个A是传了指针的,其它都是传数值。如果你能理解指针的概念,你就知道为什么A在函数里改了在外面也会变,而其他的不变了。
剩下的问题可能就是:为什么参数A传的是指针?这就是纯语法方面的问题了。如果你想学得仔细点的话,可以学习一下隐式转换相关的内容,尤其是你这里涉及的指针和数组之间隐式转换。如果不想弄那么仔细,也没问题,对于语法类问题,基本上都可以简单粗暴的俩字回答:规定。
我再解释一下形参这概念到底有多坑爹吧:
首先,你要说形参实参这概念没有呢,倒也不是——但C99的标准文档里面,通篇只有一个地方提到了formal parameter/actual argument这个术语,就是在一开头的术语表里,之后全篇都再也没用过这个术语了。
然后,我再截两个图,让大家看看他这个唯一用到这个术语时的说法:
我相信大家一定认得括号里的那个单词是什么意思的。而且还重复的把formal/actual和argument/parameter排列组合的全列一遍,说明基本上两者是混来混去的用的。
实际上,自己读一下里面的内容就知道了,这种东西你硬要分,那就只能是在词法语法上去区分的。你要是搞编译器前端,做什么语法分析的时候,去仔细读一下这两段东西,有用。但是对于99%一辈子不接触编译器前端的C/C++开发人员来说,就是毫无意义的。至于说在初学者中间普及甚至强调这种晦涩概念,那更是扯蛋。