作者
李肖遥责编
欧阳姝黎
函数参数传递主要有2种传递方式,值传递和引用传递,这个过程是实际参数将参数值传递给相应的形式参数,然后在函数中实现对数据处理和返回的一个过程。
本文略过参数不是指针的情况,这种情况实际上是复制了一个外部变量的副本进入函数中,函数体内操作的为该副本,不会实际修改函数外的该变量。
为什么?被调函数的形参只有函数被调用的时候才会临时分配单元,一旦调用结束占用的内存便会释放,所以调用的函数中存储该参数的地址跟被调函数中参数的地址不同。往往我们对C与C++关于*与的使用不是很清楚,C语言没有引用只有指针,引用是在C++里面才存在的操作。
参数为指针的情况(使用*)这种情况实际上是在函数内部复制了一个指针的副本,如果单纯的修改指针,在跳出函数后,该指针指向不受影响;但如果修改的是指针指向的值,那么外部指针所指向的内容也相应修改了,因为两个指针都是指向同一个内存空间的。
用*运算取地址的内容,C++代码(C语言也一样的)如下:#includeiostreamusingnamespacestd;voidfunction(int*num){*num=;}intmain(){intnumber;number=1;function(number);coutnumberendl;return0;}//输出形参num是一个指针,传递过来的是一个地址值,通过改变num对应地址的值来实现值的改变,解引用即可访问到这个地址值映射的值。
引用方式传值(使用)#includeiostreamusingnamespacestd;voidfunction(intnum){//通过引用改变num的值num=;}intmain(){intnumber;number=1;function(number);coutnumberendl;system("pause");return0;}//输出对引用的操作等于是对其指定的对象进行操作,当将实参传递给形参时,形参就指向了实参。
例子#includeiostreamusingnamespacestd;//测试如果引用进入函数后进行修改,跳出函数后变量是否修改;voidChangeRef(intref){ref++;cout"引用内修改后的值为:"refendl;}//测试以传值方式进入函数进行修改,跳出函数后变量是否修改voidChangeNotRef(intref){ref++;cout"通过传值方式在函数内修改后的值为:"refendl;}//测试以指针为参数传入函数,修改指针指向,是否影响外部指针指向voidChangePtr(int*ptr){ptr++;cout"函数内修改后的指针指向:"ptrendl;}//测试在函数中修改指针指向的内容,是否影响外部指针指向内容voidChangePtrVal(int*ptr){(*ptr)++;cout"函数内修改后指针指向的值:"*ptrendl;}intmain(){intRef=0;cout"传入引用之前的值为:"Refendl;ChangeRef(Ref);cout"在函数内修改引用后,跳出函数的值为:"Refendlendl;ChangeNotRef(Ref);cout"通过传值方式在函数内修改后,跳出函数的值为:"Refendlendl;int*ptr=Ref;cout"传入函数前的指针指向:"ptrendl;ChangePtr(ptr);cout"传值方式传入函数跳出后的指针指向:"ptrendlendl;cout"传入前指针指向的值为:"*ptrendl;ChangePtrVal(ptr);cout"从函数中出来后指针指向的值为:"*ptrendlendl;system("pause");return0;}//参考网上例子运行结果如下:
小结值传递和引用传递,传递的都是实参的一个拷贝。C语言中实参和形参之间的数据传递是单向。被调用函数的形参只有函数被调用时才会临时分配存储单元,结束便会被释放。不同芯片的Mac电脑,差距会逐渐拉大吗?
乐视logo换新:显示“老板造车美利坚”;雷军给米粉起名小粽子;谷歌浏览器不再隐藏完整URL
极客头条
“搏一搏,单车变摩托!”华为天才少年耗时四个月,将自行车强势升级为自动驾驶