CS 112 - Week 6 Lecture 1 - 2022-09-27
TODAY WE WILL:
* announcements
* ROAD to POINTERS and DYNAMIC MEMORY MANAGEMENT!
* STOP 0 - input parameters, output parameters,
and input/output parameters
* STOP 1 - reminder of pass-by-value
* STOP 2 - pass-by-value and arrays
* STOP 3 - pass-by-reference
* [if time] STOP 4 - C++ pointer basics
* prep for next class
* Should be working on Homework 4!
* Current reading: Savitch text, CHAPTER 9
(for pointers and dynamic memory allocation)
=====
STOP 0 - input parameters, output parameters,
input/output parameters
=====
* input parameters - arguably what we use
the most!
...they just provide input to a function
* output parameters - less frequent, but we've
seen a few
...a parameter whose purpose is JUST to be
changed by a function
(changing the corresponding argument accordingly)
* input/output parameters - when you want to
BOTH use the parameter AND (possibly) change its
contents (change the corresponding argument's
contents)
...like a function that sorts an array parameter!
=====
STOP 1 - reminder of pass-by-value
=====
* there are MULTIPLE ways a language MIGHT
be designed to pass arguments to parameters...
C++'s default for this is: pass-by-value
for a scalar (single) value, <-- that is, not an array!
for pass-by-value,
a COPY of the argument expression's
VALUE is copied into the parameter variable
=====
STOP 2 - pass-by-value and arrays
=====
* under the hood, C++ does NOT pass an array argument
by COPYING all of its values into an array parameter;
C++ "sees" an array as the address of its
first element;
so a pass-by-value array is passed by
copying the address of its first element -- where
it is -- into the array parameter
* a C++ pass-by-value array parameter
cannot change WHERE its argument array
starts -- BUT!!!
it CAN go to where it starts (it has a copy
of its address) and both USE and CHANGE what is
there.
* SO! a C++ parameter can be used as
an input parameter, an output parameter,
or as an input/output parameter
=====
STOP 2 - aside - const with array parameters
=====
* given what is copied for a pass-by-value
array, how can a programmer ASSURE a user
that a given function WILL. NOT. CHANGE.
an argument array?
C++ says you can precede an array parameter
declaration in a function/method header
with const to specify this:
void print_nums(const double my_nums[], int size)
=====
STOP 3 - pass-by-reference
=====
* C++ allows you specify that a particular parameter
use a different argument-passing approach than
its default of pass-by-value;
pass-by-reference
When a parameter is specified to be pass-by-reference,
when its function is called,
the value assigned to that parameter
is the ADDRESS of its argument
(instead of a copy of argument's value)
INSIDE the function,
every time a statement or expression references
that parameter, the computer goes to the address
in that parameter to grab (or change) that
argument;
So if you change the parameter in the function,
it DOES change the corresponding argument,
even for a scalar, single-valued parameter
AND this gives us a way, possibly with fewer errors
than the alternatives, to write a function with
scalar output parameters and scalar input/output
parameters
* HERE's how you ask C++ to give you a pass-by-reference
parameter:
ret_type funct_name( ... param_type & param_name, ... )
* C++ does not care if there are spaces before or
after that &
all of these are syntactically correct:
void swap(int& val1, int& val2)
void swap(int &val1, int &val2)
void swap(int & val1, int & val2)
let's check:
void swap(int&val1, int&val2)
...and now you just use the parameter
as if it were the type without any &
(use it, change it, etc.)
...and you give it arguments THAT HAVE ADDRESSES
(the arguments must be lvalues)
See working example function swap,
in swap.h, swap.cpp, swap_test.cpp