按值和参考混淆参数

时间:2014-02-18 03:27:24

标签: c++

作业 -

创建一个至少需要三个参数的示例函数。至少应该通过值传递其中一个参数,并且至少应该通过引用传递两个参数。

我创造了以下内容,但如果我做的是正确的事我感到困惑,我对价值和参考感到困惑。

我在int中设置num1 = 30但是将7传递给addThree这是值吗?

#include <iostream>

using namespace std;

//prototype
void addThree (int num1, int& num2, int& num3);

int main()
{
    int num1 = 30;
    int num2 = 50;
    int num3 = 80;

    addThree(7, num2, num3);

    return 0;
}

void addThree (int num1, int& num2, int& num3)
{

    int x;
    int y;
    int z;

    x = num1 + 3;
    y = num2 + 3;
    z = num3 + 3;

    cout << "x value is " << x << endl;
    cout << "y value is " << y << endl;
    cout << "z value is " << z << endl; 
}

打印出来

x值为10

y值为53

z值为83

5 个答案:

答案 0 :(得分:1)

你的代码没有任何意义,因为据我所知,你必须证明传递值和传递引用之间的区别。

您可以考虑我将展示的代码作为您的代码的想法

#include <iostream>

void Multiply( int &x, int &y, int n )
{
   n /= 2;

   x *= n;
   y *= n;
}

int main()
{
   int x, y;
   int n;

   std::cout << "Enter x: ";
   std::cin >> x;

   std::cout << "Enter y: ";
   std::cin >> y;

   std::cout << "Enter factor: ";
   std::cin >> n;

   std::cout << "Before the multiplication. x = " << x << ", y = " << y << std::endl;

   Myltiply( x, y, n );

   std::cout << "After  the multiplication. x = " << x << ", y = " << y << std::endl;
}

答案 1 :(得分:0)

通过引用,您正在通过其他名称调用某些内容。根据价值,你可以复制一份

答案 2 :(得分:0)

好吧,我真的不知道你在问什么,但这里是一个简单的价值传递概述,并通过参考传递。

在C ++中,引用基本上是“安全”指针。在维基百科中,它们被定义为:

  

在C ++编程语言中,引用是一个简单的引用   数据类型不如指针类型强大但更安全   继承自C。

使用&符声明引用。您必须指定引用所引用的实际变量。

int A = 5;   // Created an actual integer
int& rA = A; // Created a reference that refers to the integer I declared earlier

当您通过引用将某些内容传递给函数时,您允许该函数修改引用所引用的变量。但是,当您通过值传递时,该函数会创建它自己发送的数据的本地变量副本。对该局部变量的所有更改仅存在于函数的范围内。

这比看到的更好看。观察。

int main()
{
    int a = 5;
    int& ra = a;

    std::cout << a;    // Ouput: 5
    plus(&a);
    std::cout << a;    // Ouput: 6

    return 0;
}

void plus (int& num)
{
    num++;
    std::cout << num;      // Ouput: 6
}

请注意,当我们通过引用传递时,a中的main()已更改。如果我们只是按值传递,就会发生这种情况:

int main()
{
    int a = 5;
    int& ra = a;

    std::cout << a;    // Ouput: 5
    plus(a);
    std::cout << a;    // Ouput: 5

    return 0;
}

void plus (int num)
{
    num++;
    std::cout << num;      // Ouput: 6
}

答案 3 :(得分:0)

传递值

C总是传递参数by value:每个参数的值的副本被传递给函数;该函数无法修改传递给它的实际参数。

在程序中,函数void addThree (int num1, int& num2, int& num3)有一个参数int num1,它按值传递。

这意味着,当调用该函数时,在addThree函数堆栈帧中分配了一些内存字节,并且调用时的值即Form语句addThree(7, num2, num3);7为传递了int num1的记忆。

在哪里, 在pass by reference中,没有为变量num2 & num3分配内存,它们将指向与int num2 & num2函数堆栈帧中main()相同的地址。

根据您的计划,

x = num1 + 3; // here num 1 is form function addThree () so num1 = 7 and so 7+3 = 10
y = num2 + 3; // here num2  has same address as in the main's num2 so num2= 50, 50+3 = 53
z = num3 + 3;//  here num3  has same address as in the main's num3 so num3= 50, 80+3 = 83

希望这有助于您理解By reference and By value

的概念

答案 4 :(得分:0)

你的addThree函数是正确的,形式为“addThree(int num1,int&amp; num2,int&amp; num3)”,但只需设置你的参数就可以使它通过num1的值和其他的引用传递。

“int num1”的意思是“创建一个新的int并给它num1的值,然后将它发送给函数”,而“int&amp; num1”意味着这里是我的num1,但无论你在函数内做什么也会改变它在功能之外。

所以你不需要传入7,你可以只说addThree(num1,num2,num3)而你是对的,尝试运行这个版本的代码:

#include <iostream>

using namespace std;

int main() {
    void addThree(int num1, int& num2, int& num3);

    int num1 = 30;
    int num2 = 50;
    int num3 = 80;

    addThree(num1, num2, num3);

    cout << "now, back in main num1 is: " << num1 << endl;
    cout << "now, back in main num2 is: " << num2 << endl;
    cout << "now, back in main num3 is: " << num3 << endl;

    int pause; //just to keep the window open
    cin >> pause; //just to keep the window open
    return 0;
}

void addThree(int num1, int& num2, int& num3) {
     num1 = num1 + 3;
     num2 = num2 + 3;
     num3 = num3 + 3;

     cout << "inside function, num1 is: " << num1 << endl;
     cout << "inside function, num2 is: " << num2 << endl;
     cout << "inside function, num3 is: " << num3 << endl;
}

请注意,由值传递的num1(由于使用“int num1”而不是“int&amp; num1”)是该函数没有持久影响的唯一int。