十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
c语言中数组的实质就是指针,所以函数的参数是数组的话,就是传入了一个指针,也就是传入了一个地址。
创新互联是一家企业级云计算解决方案提供商,超15年IDC数据中心运营经验。主营GPU显卡服务器,站群服务器,成都棕树电信机房,海外高防服务器,成都机柜租用,动态拨号VPS,海外云手机,海外云服务器,海外服务器租用托管等。
主函数向findMax中传了两个参数,vals是传地址,m是传值,所以在findMax函数中,对vals做的改变可以带回到主函数,而对m的赋值却对主函数中的变量value没有任何影响
输出:
调用函数前输出结果:
nums[1]=0
nums[2]=0
nums[3]=0
nums[4]=0
value = 0
因为循环变量初值是1,所以nums[0]不会输出
findMax(nums,value); //调用findMax,vals指向nums开始元素,m=0
i=1;[i=1],iMAXELS成立,开始循环,vals[i]=1,nums[0,1,0,0,0],输出:vals[1]=1
i++;[i=2],iMAXELS成立,继续循环,vals[i]=1,nums[0,1,1,0,0],输出:vals[2]=1
i++;[i=3],i5成立,继续循环,vals[i]=1,nums[0,1,1,1,0],输出:vals[3]=1
i++;[i=4],i5成立,继续循环,vals[i]=1,nums[0,1,1,1,1],输出:vals[4]=1
i++;[i=5],i5不成立,结束循环,输出:m=1
函数返回,m被舍弃,输出:
调用函数后输出结果:
nums[1]=1
nums[2]=1
nums[3]=1
nums[4]=1
value = 0
由于子程序中没有计算过m,所以m值一直是初始的1,这个m是函数自己临时定义的变量,用来接收调用者传进来的参数,main函数将vale的值0传递给m,计算完后,函数返回,m被舍弃,不会影响value的值(作为参数,是取value的值来用一下,然后就没有value的事了)
如果想将m的值返回,那么有两种办法:
函数写成:void findMax(int vals[],int *m),然后函数中用到m的地方都改成*m,调用时findMax(nums,value);
函数写成:int findMax(int vals[],int m),函数最后写return m;调用时value=findMax(nums,value);
如果子程序不需要value作为m的初始值,则可省略第2个参数:int findMax(int vals[]),调用:value=findMax(nums);
编程中,很多东西要你自己去摸索,才能真正的理解。关于地址与值的问题,其实你自己可以试,把变量的地址输出来看看看是不是一样,比如 printf("%x",a); 这样就是以把变量a的地址用16进制的方式输出来,看看地址到底是怎么一回事。
传值与传地址可以这样理解:
就像我把我写的作文抄了一份给你,你拿去看了之后把有的地方改了,现在我要交作文,而我有一份,所以我直接交了,我交的作文内容并没有变,这就是传值,即值传递。
同理,如果我把我的作文直接给你,你看了后也把有些地方改了,现在我也要交,你只能还给我,我再交,这时我交的就是被你改过的了,这就是传地址,即引用传递。
这只是我的理解,有误的地方还请指正。
先举个简单例子:
#include iostream
using namespace std;
void Add1(int *a)
{
(*a)++;
}
void Add2(int a)
{
a++;
}
int main()
{
int x=1,y=5;
Add1(x);
Add2(y);
coutx" "yendl;
return 0;
}
输出:
2 5
这两个自加函数中,Add1是指针传递,Add2是数值传递,
在调用Add2(y)时,系统是先建造一个int型变量a,再将y的值传给a(此时y和a是两个不同地址的变量,只是两者值相同),然后a++,却对y没有任何操作,故在函数调用结束后,释放a,而y没任何变化;
在调用Add1(x)时,系统先建造int型指针a,然后将实参x的地址传给了指针a,故此时a与x是指向同一地址,即共享统一数据,当对地址a内的数据进行操作,就是对x进行操作。a++时自然也对x++,当函数调用结束,指针a释放掉,x的值此时已经发生了变化。
这就是两者不同,地址传递的参数都是指针类型,于数值传递不一样。
至于选择那种传递,就要看这个程序的具体目的和功能了,一般要对参数进行修改的要用地址传递,而只是调用参数的数据进行其他计算并不需要修改数据本身宜用数值传递。
还有什么不明白吗