文章目录
函数直接传递值(变量)
这种方式传给形参的是变量的值,传递是单向的。如果在执行函数器件形参的值变了,不会回传给实参。也就是说如果想要实现一个这样的功能:调用函数后实参的值随之改变。显然此方式无法实现。
举个例子:
执行swap函数后,想要主函数内的变量值变化,用上述方式写出代码:
#include <iostream>
using namespace std;
int main()
{
void swap(int ,int);
int i =3,j = 5;
swap(i,j);
cout<<"i="<<i<<endl<<"j="<<j<<endl;
getchar();
return 0;
}
void swap(int a,int b)
{
int temp;
temp = a;
a =b;
b= temp;
}
运行结果:
i = 3
j = 5
显然值没有带回,i和j的值在执行后没有发生变化。
函数传递引用(利用&)
举例说明:
#include <iostream>
using namespace std;
int main()
{
void swap(int & ,int&);
int i =3,j = 5;
swap(i,j);
cout<<"i="<<i<<endl<<"j="<<j<<endl;
getchar();
return 0;
}
void swap(int &a,int &b)
{
int temp;
temp = a;
a =b;
b= temp;
}
运行结果:
i = 5
j = 3
第13行,形参是声明的引用,注意这个引用并没有初始化,这就是上面提到的特例。而在第7行调用函数的过程中,实现了引用的初始化,这是传入的实参就是变量,而不是数值,所以做到了真正意义上的“变量传递”。
以上借鉴:
https://blog.csdn.net/chaipp0607/article/details/60151813
两者区别
除了以上介绍的传递参数时的区别,我在刷LeetCode时发现两者性能也有很大区别。
当要传递的参数是string
类型时,两者的运行时长差异很大!
以No.126 LeetCode题目 “成语接龙II”为例,若比较函数写成:
bool checkDifference(string str1, string str2)
则显示超出时间限制
bool checkDifference(string& str1, string& str2)
则通过测试。
在网上查阅一些资料后,发现是如下的原因:
从传递效率上来说:这里所说传递效率,是说调用被调函数的代码将实参传递到被调函数体内的过程。对于内建的int char short long float等4字节或以下的数据类型而言,实际上传递时也只需要传递1-4个字节,而使用指针传递时在32位cpu中传递的是32位的指针,4个字节,都是一条指令,这种情况下值传递和指针传递的效率是一样的,而传递double long long等8字节的数据时,在32位cpu中,其传值效率比传递指针要慢,因为8个字节需要2次取完。而在64位的cpu上,传值和传址的效率是一样的。再说引用传递,这个要看编译器具体实现,引用传递最显然的实现方式是使用指针,这种情况下与指针的效率是一样的,而有些情况下编译器是可以优化的,采用直接寻址的方式,这种情况下,效率比传值调用和传址调用都要快,与上面说的采用全局变量方式传递的效率相当。
在我的64位电脑上,string类型时占28个字节,因此传递参数时用指针会快很多,所以函数要用引用传递。