CS 112 - Week 6 Lecture 2 - 2022-09-29
TODAY WE WILL
* announcements
* STOP 4 - C++ pointer basics
* STOP 5 - dynamic memory
* [not reached yet]
[oops, aside! some useful syntax:
pointers to objects
* [if time] STOP 6 - dynamic memory and
arrays
* prep for next class
* Current reading:
Savitch Ch. 9 - pointers and dynamic memory
=====
STOP 4 - pointer basics!
=====
* what is a pointer?
Savitch, an old edition of our text:
"A pointer is the memory address of a variable"
* int x = 3;
cout << x << endl;
Well -- when x is a pointer --
it contains the ADDRESS of something
else,
and it can be thought of as
"pointing to" the thing AT that address;
* when you set a pointer,
you can be putting into it the
address of the thing you want to point to
* In C++,
a pointer type INCLUDES that type
of the value at the address in the pointer;
that is, it includes the type it points to;
so, pointer-to-int, or pointer-to-double
* what is the syntax for this, then?
to declare a variable to be of
type pointer-to-some-type?
In C++, you indicate a pointer variable
by putting an asterisk between the
type-pointing-to and the variable name
int *quant_ptr;
double *num_ptr;
* like any variable in C++,
just declaring it does not generally
give it initial values -- it is considered
undefined
* it is considered good STYLE to initialize
any declared variable before you use it
* it you don't want a pointer variable
to point to ANYTHING yet,
one common value to make it point to
is NULL
* NULL is a named constant (I *think*
defined in cstdlib)
Any pointer CAN be set to it.
THEN a COMMMON action is to make
sure a pointer is NOT NULL before
you follow it!
if (my_ptr != NULL)
{
...follow my_ptr...
}
* what if I want to point to something?
OUR FIRST way:
to use & as a prefix operator!
val
&val <-- the address of val
double my_double = 43.5;
double *my_dbl_ptr;
// set my_dbl_ptr to the address of my_double,
// and now it can be set to point to my_double
my_dbl_ptr = &my_double;
^ I tend to read this as
"set my_dbl_ptr to the address of my_double"
* can I get the thing AT the address within a pointer?
that is, can I get the thing the pointer is
pointing TO?
YES -- use the * as a prefix operator in that
case!
* desired_ptr -> the value at the address within
desired_ptr
cout << (*my_dbl_ptr) << endl;
* If you change the value at the address being
pointed to, and then follow the pointer again,
it sees the new value
my_double = 4008;
cout << (*my_dbl_ptr) << endl; // print 4008
* you are allowed to CHANGE what is AT an
address using this syntax!!!
*my_dbl_ptr = 32;
cout << "my_double: " << my_double << endl;
...prints:
my_double: 32
* BUT -- pointers are MORE TYPICALLY used
with DYNAMIC memory, memory allocated
by the programmer while the program is
running;
* how can I write a statement requesting
dynamically-allocated memory?
...the operator new
new desired_type
...allocates a chunk of dynamic memory
of the size good for desired_type
and returns the ADDRESS of that
dynamic memory chunk
new double // allocate a double-size chunk
// and return its address
new int // allocate an int-size chunk
// and return its address
...this is GREAT to assign to a pointer!
int *num_ptr;
num_ptr = new int;
*num_ptr = 13;
* BUT: what a programmer dynamically allocates
using new,
they are expected to DEallocate using:
delete
delete <desired_addr>;
delete desired_ptr;
delete num_ptr;
num_ptr = NULL; // if program is not ending now!
// basically, unless the program or function is
// about to end, either set the pointer
// pointing to deallocated memory to
// NULL or to whatever it is intended to point
// to next -- don't leave it pointing to
// the deallocted memory