Parameter passing mechanism passbyreference The Passbyreference mechanism the
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 Tool. Box. 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 Tool. Box. 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; a = a + 1; b = b + 2; m = a + b; return(m); } int main(int argc, char **argv) { double x = 1. 0, y = 4. 0; ; double r; r = fun( x, y ); cout << x << endl; cout << y << endl; cout << r << endl; } // With & means: pass-by-reference double fun ( double & a, double & b ) { double m; a = a + 1; b = b + 2; m = a + b; return(m); } int main(int argc, char **argv) { double x = 1. 0, y = 4. 0; ; double r; r = fun( x, y ); cout << x << endl; cout << y << endl; cout << r << endl; }
Illustrating the pass-by-reference mechanism using C++ (cont. ) 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. 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. C • CC -o pass-by-ref. C • To run: • pass-by-value • pass-by-ref
- Slides: 34