I don't know how to explain it the best... Look, there are variables, which in c terms are really called objects. We can consider these objects as folders, which contain something. Folder has two different properties, it usually has a name, and it has its physical location, somewhere on the shelf. Now we can give someone a copy of the folder, in which case he doesn't see the folder itself and may not know anything about the physical location of the folder. Or we can give him access to the folder, in which case he knows its physical location, can change its content, and can also rearrange the folders on the shelf. The folder name is the name of the object (variable), and the physical location of the folder is its reference, which is the value of the pointer (we may consider that the physical location of some folder may be written in another folder, which is pointer). By knowing the physical location of the objects, we can do many things. We may refer to these objects anywhere, giving access to them (enabling others to change them), and we can arrange the objects, physically or logically, any way, the simplest is the array, which in c can always be accessed by pointer (when array is a pointer, then array [n] is always the same as *(array + n)). More complex are the linked lists, binary trees etc, which enable some dynamic arrangement, ie we don't have to change the physical location of many objects, for any rearrangement. Pointers are often members of the structures, which makes the structures some kind of nodes, to build a bigger system, such structures can be arranged into arrays, or into more complex arrangements. There are also function pointers, which enable to refer to different functions as the need may be, instead of always using one fixed function, this also enables to create entities in c which are called objects in c++. Pointers also enable to allocate storage for objects -- when we allocate memory, we get the location of the beginning of the allocated storage area, where we can put diferent objects, this enables a dynamic memory management. I hope that i could somewhat explain why the pointers are necessary, but unfortunately i have not much idea how understandable it would be for someone who yet knows nothing about pointers.
Concerning the pointers tutorial, one of the classic ones is the ted jensen tutorial on pointers and arrays in c
http://home.netcom.com/~tjensen/ptr/pointers.htm The code in the examples is not exactly the best possible, this is usually the case in any tutorial, though there are so many which are so much worse. But it is also a good tutorial because it's the only pointers tutorial i know, where the examples are in public domain. The programming examples and tutorials in general must be in the public domain, because one should be able to use the code from examples freely, without any license restrictions.