【C++基础编程】#020 函数传递值和传递引用&时的区别

函数直接传递值(变量)

这种方式传给形参的是变量的值,传递是单向的。如果在执行函数器件形参的值变了,不会回传给实参。也就是说如果想要实现一个这样的功能:调用函数后实参的值随之改变。显然此方式无法实现。

举个例子:
执行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个字节,因此传递参数时用指针会快很多,所以函数要用引用传递。

猜你喜欢

转载自blog.csdn.net/qq_39856931/article/details/106602901
今日推荐