This notes were extracted and modified from Prof. Lucia Moura's notes at http://www.cs.toronto.edu/~lucia/courses/csc270S98/notes/CforA2notes.html

CSI2131 Pointers

Each byte of memory has a different address.

Each variable is stored in some number of contiguous bytes of memory.
The address of a variable is the address of the first byte in which
it's stored.

    0100
    0101 xxx      <-- An integer might take 4 bytes.  This integer's
    0102 xxx          address is 0101
    0103 xxx
    0104 xxx
    0105
    0106
    0107 ccc      <-- A character only takes one byte.  This character's
    0108              address is 0107

In C/C++, a pointer is a variable that stores an address.  If a
pointer 'p' contains the address of a variable 'x', we say p points
to x.  This is typically drawn with an arrow from p to x:

     p           x
   +---+       +---+
   | O |   --> | 5 |
   +-+-+  /    +---+
     |    |
     +----+

Each pointer can point to many different variables at different times
during the program execution, but each variable must be of the same
type.

Declarations

The following declares integers 'a' and 'b' and a "pointer to integer"
'p'.  The asterisk before 'p' shows that it is a pointer.  There can
be a space between the asterisk and 'p' if you wish.

    int a, b;
    int *p;

"Address of''

To get 'p' pointing to 'a', we assign 'p' the address of 'a':

    p = &a;

The ampersand, when appearing in front of a variable, gives that
variable's address.  The above statement is read 'p is assigned the
address of a'.

Dereferencing

To assign a value to the variable pointed to by 'p', we use the
asterisk.

    *p = 55;
    cout << a << *p;

    output ---> 55 55

The above statement is read 'the integer pointed to by p is assigned
55'.  This operation ''dereferences'' p.  In other words, p is a
''reference'' to something and *p is the actual something.

To get the value, we also use the asterisk:

    b = *p;
    cout << b;

    output ---> 55

Layout in memory

Suppose things are laid out in memory as follows:

    0100 aaa      < -- integer a
    0101 aaa
    0102 aaa
    0103 aaa
    0104 bbb      < -- integer b
    0105 bbb
    0106 bbb
    0107 bbb
    0108
    0109
    010A
    010B
    010C ppp      < -- pointer p
    010D ppp
    010E ppp
    010F ppp

Then after the following statements, memory would look as shown below
(the hyphens are placeholder for the remainder of the variable).

    a = 55;
    p = &a;
    b = *p + 22;

    0100  55      < -- integer a
    0101  -
    0102  -
    0103  -
    0104  77      < -- integer b
    0105  -
    0106  -
    0107  -
    0108
    0109
    010A
    010B
    010C 0100     < -- pointer p
    010D  -
    010E  -
    010F  -
 

Pointers and classes

C++ pointers can also be defined to point to class objects:

    Myclass m;
    Myclass *p;
    p = &m;         // "&" here is the address of m

The following then, are the same (call the method "print" in Myclass)

    m.print();
    (*p).print();
    p->print();