Explaining pointers to highschoolers
A prerequisite to understanding pointers is a basic understanding of memory. At least on the broadest level, students need to know that when they declare a variable in their programs, that variable is stored somewhere, so they can use it, access it, update it, etc. Where that variable is stored also has some address, so it can be located (specific addressing techniques need not be introduced yet). The specifics of heap v. stack, memory size (int v. long long), and other such concepts are not necessary to understand what a pointer is (but they certainly would help). 

All this background established, here is the easy way to think of pointers:


  A pointer is a variable that contains an address of a variable.


Simple enough on the surface. That sentence comes from Chapter 5 of K&amp;R (The C Programming Language by Kernighan and Ritchie). This chapter has a great explanation of pointers and arrays, and I would highly recommend it for an understanding of pointers, at least in the context of C. One key point for C is the following:


  Since C passes arguments to functions by value, there is no direct way
  for the called function to alter a variable in the calling function.
  ... Pointer arguments enable a function to access and change objects
  in the function that called it.


Now, to get into the details of pointer arithmetic, passing by reference, syntactic sugar vis-a-vis arrays, pointers do become more complicated. However, always keep in mind the simple definition that gets at their essence: pointers store addresses for other locations in memory.