header

Departments

Main

About

Errata

FAQ

Compiler Tips

Supplemental Lessons

NCurses

Source Code Files

On-line Book Ordering

 

Pointer Cheat Sheet

This page is based on information that appeared on the tear-out Cheat Sheet from C For Dummies, Volume II.

Pointer Pointers

  • A pointer must always be of the same type as the variable it's pointing at.
  • Declaring a pointer variable does not create the type of variable it points at. It creates a pointer variable.
  • Though pointers are declared with an asterisk they are not always used with an asterisk.
  • Pointers must be initialized before they can be used.
  • Initialize a pointer by assigning it to a variable (of the same type).
  • To assign a pointer to a variable, use an ampersand with the variable's name.
  • m_address = &memory;

  • To assign a pointer to an array, do not use the ampersand:
  • s_address = string;

  • To assign a pointer to an array element, use the ampersand:
  • element = &string[2];

  • Without an asterisk, an initialized pointer holds a memory address.
  • With an asterisk, an initialized pointer holds a value (the value of the variable the pointer points at).

Typical Pointer Setup and Use

First, create a pointer of the proper type:

float *f;

Second assign it to a variable's memory location:

f = &boat;

Finally, use the pointer:

printf("%.0f",*f);

  • Without its asterisk, the pointer is a memory location.
  • With its asterisk, the pointer equals the value at the memory location.
  • Always use the same type of pointer as the variables it examines: floats for floats, ints for ints, and so on.
  • Remember: Always initialize a pointer before you use it! Set the pointer equal to the address of some variable in memory.

Pointers, Parenthesis and Math

Pointer Thing Memory Address Memory Contents

p

Yup

Nope

*p

Nope

Yup

*p++

Incremented after value is read

Unchanged

*(p++)

Incremented after value is read

Unchanged

(*p)++

Unchanged

Incremented after it's used

*++p

Incremented before value is read

Unchanged

*(++p)

Incremented before value is read

Unchanged

++*p

Unchanged

Incremented before it's used

++(*p)

Unchanged

Incremented before it's used

p*++

Not a pointer

Not a pointer

p++*

Not a pointer

Not a pointer

The ++ operator is used above, though any math operation can be substituted.

As a tip: Use parenthesis to isolate part of the pointer problem and the answer will always work out the way you intended.

Pointers and array brackets

Array Notation Pointer Equivalent

array[0]

*a

array[1]

*(a+1)

array[2]

*(a+2)

array[3]

*(a+3)

array[x]

*(a+x)

Ugly ** notation

Doodad What It Is How The Compiler Sees It

array+1

An address

A pointer

*(array+1)

Contents of address, what lives there

A string

*(*(array+1))

Contents of a character array

A character

**(array+1)

Same as above

Same as above