先让我们看看这个程序
#include <iostream>
using namespace std;
void AddFive(int Number)
{
Number = Number + 5;
}
void main()
{
int nMyNumber = 18;
cout<<"My original number is "<<nMyNumber<<endl;
AddFive(nMyNumber);
cout<<"My new number is "<<nMyNumber<<endl;
//得到了结果23吗?问题出在哪儿?
}
形参其实是在把实参传递给子函数的时候定义了一个新的变量,但是这个变量的值和实参相等
在这里我们就相当于创建了一个整形变量int Number,这个Number和nMynumber值相等,都为18,我们只是把Number的值给加了5,
不相信你看看你在Number=Number+5;的下面加一句cout<<”Number=”<<Number; 那这里一定会输出Number=25
但是我们并没有把nMyNumber做任何操作啊。
所以在子函数里 无论怎么修改都不会影响到调用它的函数的实参的值
那有什么办法解决了,先看这种
#include <iostream>
using namespace std;
int AddFive(int Number)
{
Number = Number + 5;
return Number;
}
void main()
{
int nMyNumber = 18;
cout<<"My original number is "<<nMyNumber<<endl;
AddFive(nMyNumber);
cout<<"My new number is "<<AddFive(nMyNumber)<<endl;
}
更改的地方在AddFive中我加了一句return Number;当然,函数前面的void要该成int,在输出的时候我输出的是AddFive(nMyNumber),相当于是输出的这个函数的返回值,也就是计算过后的Number,所以得出23.
其实这里还有一个更好的办法就是用指针,先我说了,我们只是创建了一个新的变量,并没有对实参中的变量做操作,那么我们就来对实参中的变量做点操作吧,那怎么操作呢,对,就是把它的地址就行传递。只要我们把nMynumber的地址传递给形参,注意了,刚才那个18传进去了,nMyNumber没有改变,这里一样,创建了一个指针变量,也只是指针变量中存放的地址和&nMyNumber是一样的,也就是int*Number和&nMynumber(这里&nMyNumber是一个指针,我的前面一篇中写了,存放变量的地址就是这个变量的指针)都是指向存放18的变量,当*Number=*Number+5时也就相当于把&nMynumber存放的18加了5,所以,cout<<"My new number is "<<nMyNumber<<endl; 时算出的就是23了。
因为我们这里的实参&nMynumber,他一直没有变过,只是有一个和它具有同样功能,也就是和它指向同一个变量的int*nPpointer改变了nMynumber的值,就是这样。
#include <iostream>
using namespace std;
void AddFive(int* Number)
{
*Number = *Number + 5;
}
void main()
{
int nMyNumber = 18;
cout<<"My original number is "<<nMyNumber<<endl;
AddFive(&nMyNumber);
cout<<"My new number is "<<nMyNumber<<endl;
}
梁老师说形参的改变是可以改变实参的值的
如:
#include<iostream>
using namespace std;
void p(int&i){
i=8;
}
void main(){
int j;
j=5;
p(j);
cout<<j;
}
确实我们可以得出j的值是23。但我觉得虽然p(j)中的j是一个变量,但它传出去的根本就不是变量j,而是j的地址,传过去过后,行参和实参都是同一个对象,只是他们名字不同而已 ,通过对形参的修改将影响实参的值。但是我觉得这里形参和实参的类型不一样。不能叫严格意义上的形参改变实参的值。
还有一点,形参和实参的类型必须要一致,或者要符合隐含转换规则,比如实参是单精度,形参是整形,也是可以的。
千言万语汇成一句话,严格意义上说形参的改变是无法改变实参的。如果对指针不太了解的可以看一看我的前一篇指针和指针变量的区别。
希望这篇对爱软件,爱编程的亲们有帮助,希望大家多指教