Let's take a look at a very simple example of how pointers work. In this program fragment, we have declared two ordinary integer variables, and one pointer to an integer. We should highlight one important thing about C syntax here. In the pointer declaration, the * operator here is used only to indicate that the variable p is a pointer to an int, not an int itself. Anywhere else in code, this notation will mean something else, as we will see in a moment.
The first line of code assigns the hex value 0xDEAD to the variable x, as we have seen in previous examples. When this code is compiled, we can look at the map file to see where x was located by the linker. Every time you compile a program, a map file will be generated by the linker to document where it placed the various elements of your program. When this example is compiled, we find that x was placed at 0x08BC.
Next, we assign the hex value 0xBEEF to y. Using the map file as we did with x, we found that y was located at address 0x08BE.
And now, we start working with the pointer variable p. On this line, we assign the address of x to p by using the unary & (address of) operator in front of x. Note that the value stored in p is 0x08BC – this is the address of x (that we can verify with the map file). Now we can say that p points to x.
Now that we have initialized the pointer variable p, we can use it to access the data it points to. This line of code basically says, assign the value 0x0100 to the variable pointed to by p. Also note that now, the * in front of p indicates that we want to use the location that p points to – not the location of p itself. Although the syntax of *p is the same as what we saw in its declaration, it has a different meaning: use the variable that is pointed to by p.
The net result of this operation is that the value of x is changed to 0x100. Since p contains the address of x, using *p is the same as using x.
On this line, we change the value of the pointer p to contain the address of y. So now, p points to y.
Finally, we write the value 0x0200 to the variable pointed to by p, which is y since that is what we just set it to. The net effect is that the value of y was changed to 0x0200. After changing p in the previous line, any time we use *p now, will be the same as if we used y.