 <p>A pointer is not a <em>variable</em>. A pointer is a <em>value</em>.</p> <p>A variable, in C, designates a storage location, and a value can be stored in that location. Thus, if you have a variable <code>a</code> declared with <code>int a</code>, then <code>a</code> is a variable in which an integer value can be stored. If you have a variable <code>int *x</code>, then <code>x</code> is a variable in which a <em>pointer</em> to an integer value can be stored. </p> <p>The address of a storage location can be obtained using the <code>&amp;</code> operator. E.g., <code>&amp;a</code> is the address of the storage location designated by <code>a</code>, or the <em>address</em> of <code>a</code>, and can be stored in (among other things) a variable of the corresponding type. Thus you can have:</p> <pre><code>int a = 42; /* a is a variable of type int, and has value 42 */ int* x = &amp;a; /* x is a variable of type int*, and has value &amp;a */ </code></pre> <p>Although analogies in programming are often dangerous, you might think of things like page numbers in a book. The page number of a page is not the same thing as the page, but page numbers can still be written down on pages. E.g., the table of contents page has lots of page numbers written down on it. Thus:</p> <pre><code>actual_page p = ...; /* a page structure */ page_number n = &amp;p; /* a page number */ </code></pre>