Why does call-by-value example not modify input parameter?

前端 未结 6 553
栀梦
栀梦 2020-11-28 16:51

In the following call-by-value example, I cannot understand why this code is not changing the value of the 5 to a 6.

Line 11 calls the function changeValue which ha

相关标签:
6条回答
  • 2020-11-28 17:14

    The behavior being observed currently is because passing by value means a copy of value (new integer with value of value) is actually passed to the function.

    You have to pass by reference. For that the changeValue function will look like this:

    void changeValue(int& value)
    

    Rest of the code will remain the same.

    Passing a variable by reference means the same int value declared in main is passed to the changeValue function.

    Alternatively, you can pass a pointer to value to the changeValue function. That will however, require changes to how you call the function also.

    int main()
    {
        int value = 5;
    
        changeValue(&value);
    
        ...
    
        return 0;
    }
    
    void changeValue(int* value)
    {
        *value = 6;
    }
    
    0 讨论(0)
  • 2020-11-28 17:14

    I'm including this answer as another way to think about writing functions and passing parameters by value.

    You could also have written this code in the following way. That is pass the parameter by value, modify the local copy in the function, which does not alter the original value, and return the altered value.

    int changeValue(int val)
    {
      val = 6;
      return val;
    }
    
    int main()
    {
    int value = 5;
    
    value = changeValue(value);
    
    cout << "The value is : " << value << "." << endl;
    
    return 0;
    }
    

    I am not in any way indicating my suggestion for your program is better than passing by reference. Instead, it is just the way learning a functional programming language (Clojure) is affecting the way I think.

    Also, in languages like Python, you cannot modify a scalar parameter. You can only return a new value. So my answer is more of an exercise in thinking about things differently in C/C++.

    0 讨论(0)
  • 2020-11-28 17:21

    AND:

    the copy is assigned 6, but the change is not returned.

    you need some reference or pointer if you want to change the value:

    try using a method signature like:

    void changeValue(int& value)
    

    that will probably do what you expected

    0 讨论(0)
  • 2020-11-28 17:24

    When you pass a function argument by value a copy of the object gets passed to the function and not the original object.Unless you specify explicitly arguments to functions are always passed by value in C/C++.

    Your function:

    void changeValue(int value)
    

    receives the argument by value, in short a copy of value in main() is created and passed to the function, the function operates on that value and not the value in main().

    If you want to modify the original then you need to use pass by reference.

    void changeValue(int &value)
    

    Now a reference(alias) to the original value is passed to the function and function operates on it, thus reflecting back the changes in main().

    0 讨论(0)
  • 2020-11-28 17:30

    The value of value isn't changing because your int that you pass to the function is being copied into the stack frame of the function, then it's being changed, and when the function exits the copy is destroyed. The original in main's stackframe has not changed, since it was copied to the changeValue.

    If you want to change it, you should pass a reference to an int, like so void changeValue(int& value), which says that the value isn't copied into the function, but merely an alias to the original is passed.

    0 讨论(0)
  • 2020-11-28 17:30

    This is because the change in the changeValue () function is local. When you can changeValue (value) the contents of the variable value in main is copied in the formal argument named value (same name) of the function. Same name does not mean that the both are same. The value you are accessing inside the function is a copy of the value you had in the main.

    To change you either need to pass it by reference or a pointer

    void changeValue (int *val)
    {
      *val = 6;
    }
    

    call with changeValue (&value) in main

    This works because the address of the variable value in main is passed and this address value is copied into val of the function. By doing *val we can get the contents of the address which was copied into val, which in actually the contents of value in main.

    OR

    void changeValue (int &val)
    {
      val = 6;
    }
    
    0 讨论(0)
提交回复
热议问题