Take a look first at: http://www.udel.edu/CIS/181/pconrad/06S/examInfo/E02_practice_06S.pdf For problems 1-4, I could instead give you: void foo(char *a) { } void bar(char * const c) { } void fum(const char *b) { } void fiddle(const char * const d) { } I'd do a function call such as foo(mascot); bar(hometown); Which of the following, is legal? Assume that any reference to a appears in foo, reference to b appears in bar, etc. [There are a few details, such as the assignments to things like hometown, etc... those variables aren't in scope, but you get the idea, I hope.] Simple Rules for Type Expressions: & (address of) adds a star * (dereference) takes away a star [if there isn't one to take away => error!] Heap vs. Stack vs. Error Pretty much everything is on the stack unless: (1) you are following a pointer to something allocated with new (heap) (2) you are dereferencing something not a pointer (error)