按引用传递与按值传递有什么区别?

无人久伴 提交于 2020-02-26 02:52:54

之间有什么区别

  1. 通过引用传递的参数
  2. 通过值传递参数?

请给我一些例子。


#1楼

按值传递是指如何通过使用参数将值传递给函数。 在按值传递时,我们复制存储在指定变量中的数据,并且比通过引用传递数据要慢。 我们对复制的数据进行更改,原始数据不受影响。 通过引用或地址传递,我们将直接链接发送到变量本身。 或将指针传递给变量。 它更快,花费更少的时间


#2楼

简而言之,按值传递是什么,按引用传递是在哪里。

如果您的值为VAR1 =“ Happy Guy!”,则只会看到“ Happy Guy!”。 如果VAR1更改为“ Happy Gal!”,您将不会知道。 如果通过引用传递了它,并且VAR1发生了变化,那么您将。


#3楼

最简单的方法是在Excel文件中。 举例来说,假设您在单元格A1和B1中有两个数字5和2,而您想在第三个单元格中找到它们的总和,例如A2。 您可以通过两种方式执行此操作。

  • 通过在此单元格中键入= 5 + 2 将其值传递到单元格A2中 。 在这种情况下,如果单元格A1或B1的值发生变化,则A2中的总和保持不变。

  • 或者通过键入= A1 + B1 将单元格A1和B1的“引用”传递到单元格A2 。 在这种情况下,如果单元格A1或B1的值更改,则A2中的总和也更改。


#4楼

这是一个示例,演示按值传递-指针值-引用之间的区别:

void swap_by_value(int a, int b){
    int temp;

    temp = a;
    a = b;
    b = temp;
}   
void swap_by_pointer(int *a, int *b){
    int temp;

    temp = *a;
    *a = *b;
    *b = temp;
}    
void swap_by_reference(int &a, int &b){
    int temp;

    temp = a;
    a = b;
    b = temp;
}

int main(void){
    int arg1 = 1, arg2 = 2;

    swap_by_value(arg1, arg2);
    cout << arg1 << " " << arg2 << endl;    //prints 1 2

    swap_by_pointer(&arg1, &arg2);
    cout << arg1 << " " << arg2 << endl;    //prints 2 1

    arg1 = 1;                               //reset values
    arg2 = 2;
    swap_by_reference(arg1, arg2);
    cout << arg1 << " " << arg2 << endl;    //prints 2 1
}

“通过引用”方法具有重要的局限性 。 如果一个参数被声明为通过引用传递 (因此它前面带有 &符号),则其对应的实际参数必须是variable

指代“通过值传递”形式参数的实际参数通常可以是表达式 ,因此它不仅可以使用变量,而且可以使用文字或函数调用的结果。

该函数不能将值放在变量以外的其他值中。 它不能为文字分配新值,也不能强制表达式更改其结果。

PS:您也可以在当前主题中检查Dylan Beattie答案,以简单的语言对其进行解释。


#5楼

按值传递-该函数复制变量并使用副本(因此它不会更改原始变量中的任何内容)

通过引用传递-该函数使用原始变量,如果您在另一个函数中更改了该变量,则它也会在原始变量中进行更改。

示例(复制并自己使用/尝试一下):

#include <iostream>

using namespace std;

void funct1(int a){ //pass-by-value
    a = 6; //now "a" is 6 only in funct1, but not in main or anywhere else
}
void funct2(int &a){ //pass-by-reference
    a = 7; //now "a" is 7 both in funct2, main and everywhere else it'll be used
}

int main()
{
    int a = 5;

    funct1(a);
    cout<<endl<<"A is currently "<<a<<endl<<endl; //will output 5
    funct2(a);
    cout<<endl<<"A is currently "<<a<<endl<<endl; //will output 7

    return 0;
}

保持简单,偷看。 文字墙可能是个坏习惯。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!