Parameter passing mechanism: pass-by-reference The Pass-by-reference mechanism - the agreement • Recall: • Parameter passing mechanism = agreement between the calling method and the called method on how a parameter is passed between them The Pass-by-reference mechanism - the agreement (cont.) • The agreement used in the Pass-by-reference mechanism: For the calling method: • The calling method creates the parameter variables for the called method, .... and • The calling method copies the reference (= address) of the actual parameter into the formal parameter The Pass-by-reference mechanism - the agreement (cont.) For the called method: • First, the called method uses the reference (= address) stored in the parameter variables to locate the actual parameter • Once the actual parameter have been located, the called method can subsequently obtain the information from the actual variables The Pass-by-reference mechanism is not available in Java • Fact: • The Java programming language only provides the passby-value mechanism It does not provide the pass-by-reference mechanism The Pass-by-reference mechanism is not available in Java (cont.) • Nevertheless: • It is important to know the pass-by-reference mechanism We are --- after all --- trying to teach you Computer Science, and not Java programming. The Pass-by-reference mechanism is not available in Java (cont.) • I will now show you an example of the Pass-by-reference mechanism The programming language that I will use is Java -because you are familiar with Java. But realize that: • The example is purely hypothetical --- because .... Java does not support Pass-by-reference The Pass-by-reference mechanism - an hypothetical example • Example (hypothetical) program: The Pass-by-reference mechanism - an hypothetical example (cont.) • When main starts running, it will first create its local variables: The Pass-by-reference mechanism - an hypothetical example (cont.) • We need to know the address of each variable to expose the details of the pass-by-reference mechanism. Let us assume that the addresses of the variables are as follows: The Pass-by-reference mechanism - an hypothetical example (cont.) The Pass-by-reference mechanism - an hypothetical example (cont.) • When execution reaches the method call ToolBox.min(x,y), the Pass-by-reference mechanism first creates the parameter variables: The Pass-by-reference mechanism - an hypothetical example (cont.) • Then the Pass-by-reference mechanism copies the reference of the actual parameter to the corresponding formal parameter: The Pass-by-reference mechanism - an hypothetical example (cont.) • Notice that: • The parameter variables (a and b) contains the addresses of the actual parameters • The parameter variables (a and b) call tell us where to find the information that we need !!! The Pass-by-reference mechanism - an hypothetical example (cont.) • The method invocation mechanism is completed as usually with the following steps: • Save the return address on the stack: The Pass-by-reference mechanism - an hypothetical example (cont.) • Jump to the called method: The Pass-by-reference mechanism - an hypothetical example (cont.) • When the min method executes, it will create its local variable m: The Pass-by-reference mechanism - an hypothetical example (cont.) • How the called method uses the parameter variables: • To access the information passed to the method, we first use the reference information stored in the parameter variables to locate the actual parameters : The Pass-by-reference mechanism - an hypothetical example (cont.) • Then it access the information using the a actual parameter : A quiz on the Pass-by-reference mechanism • Consider the following program (again: hypothetical because Java does not support pass-by-reference): A quiz on the Pass-by-reference mechanism (cont.) • Questions: • What reference is printed by the statement System.out.println(x); ? • What reference is printed by the statement System.out.println(y); ? • What reference is printed by the statement System.out.println(r); ? A quiz on the Pass-by-reference mechanism (cont.) • Answer: 2.0 (the value in x is CHANGEDD !!!!!!) 6.0 (the value in y is CHANGEDD !!!!!!) 8.0 (= 2.0 + 6.0) Did you understand why the update statements "a = a + 1" and "b = b + 2" change the actual parameters x and y ??? The quiz explained • According to the Pass-by-reference example above, when the ToolBox.min method starts running, the following variables have been created on the System Stack: The quiz explained (cont.) • Notice that: • The parameter variables a and b in the fun method reference to the local variables x and y, respectively, inside the main method • Therefore, we will: • use the local variable x in an operation that involves the parameter variable a • use the local variable y in an operation that involves the parameter variable b The quiz explained (cont.) • The assignment statement: a = a + 1; will change the values of the actual parameter variable x through the following mechanism: The quiz explained (cont.) The quiz explained (cont.) • Similarly, the assignment statement: b = b + 1; will change the values of the actual parameter variable y to 6.0 (not shown) The quiz explained (cont.) • Notice that: • The values in the actual parameters (x and y) are unchanged !!! The quiz explained (cont.) • That's why, if we could use the pass-by-reference mechanism, the statements would print: System.out.println(x); ---> prints 2.0 System.out.println(y); ---> prints 6.0 Illustrating the pass-by-reference mechanism using C++ • I can should you the difference between • Pass-by-value, and • Pass-by-reference using the C++ language (because C++ provide both mechanisms) Illustrating the pass-by-reference mechanism using C++ (cont.) • C++ programs of the above examples: // No & means: pass-by-value double fun ( double a, double b ) { double m; // With & means: pass-by-reference double fun ( double & a, double & b ) { double m; a = a + 1; b = b + 2; m = a + b; a = a + 1; b = b + 2; m = a + b; return(m); return(m); } } int main(int argc, char **argv) { double x = 1.0, y = 4.0;; double r; int main(int argc, char **argv) { double x = 1.0, y = 4.0;; double r; } r = fun( x, y ); r = fun( x, y ); cout << x << endl; cout << y << endl; cout << r << endl; cout << x << endl; cout << y << endl; cout << r << endl; } Illustrating the pass-by-reference mechanism using C++ (cont.) Output: Output: 1 2 4 6 8 8 Illustrating the pass-by-reference mechanism using C++ (cont.) • Example Program: (Demo above code) – C++ Prog file using pass-by-value: http://www.mathcs.emory.edu/~cheung/Courses/170/Syllabus/08/P rogs/pass-by-ref/pass-by-value.C – C++ Prog file using pass-by-reference: http://www.mathcs.emory.edu/~cheung/Courses/170/Syllabus/08/P rogs/pass-by-ref/pass-by-ref.C Illustrating the pass-by-reference mechanism using C++ (cont.) • How to run the program: • Right click on links and save in a scratch directory • To compile: • CC -o pass-by-value pass-by-value.C • CC -o pass-by-ref pass-by-ref.C • To run: • pass-by-value • pass-by-ref