 <p>A pointer is a variable, that store a memory address</p> <p>The stored address in the pointer is the address of the first-block of the memory-structure of the object it points at</p> <p>The syntax of a pointer that points at an object of type <code>TYPE</code>:</p> <pre><code>TYPE * pointer; // define a pointer of type TYPE </code></pre> <p><code>NULL</code> (address <code>0</code>) denotes a pointer that doesn't point anywhere currently:</p> <pre><code>pointer = 0; </code></pre> <p>To get the memory address of a variable or object:</p> <pre><code>pointer = &amp;object; // pointer now stores the address of object </code></pre> <p>To get the pointed <code>TYPE</code> variable, you de-reference the pointer:</p> <pre><code>assert(&amp;(*pointer) == &amp;object); // *pointer ~ object </code></pre> <p>In example:</p> <pre><code>int a = 10; // type int int * b = &amp;a; // pointer to int int* * c = &amp;b; // pointer to int* printf(" %d \n ", a ); printf(" %d \n ", *b ); printf(" %d \n ", **c ); char t [256] = "Not Possible ?"; char * x = t; char * y = (x + 4); // address arithmetic printf(" %s \n ", x ); // Not Possible ? printf(" %s \n ", y ); // Possible ? </code></pre> <p><code>void*</code> is a special pointer-type that can store any pointer of any degree, but cannot be used until you cast it to a compatible type ..</p> <pre><code>void * z = &amp;c; // c holds int** printf(" %d \n ", **((int**)c) ); </code></pre>