A pointer is a variable which contains the address of another variable.

When you use pointers, you must give them the respect they deserve. If you do not code carefully, and you make an off-by-one error, your program will behave very badly. This is many times worse with malloc()ed memory, because some implementations will store their internal data right after your data, making it so your little error only shows up at the next malloc(), which can be in a totally unrelated section of code.

On the other hand, a correctly used pointer is a wonderful thing. You can run along a string with speed and ease using a pointer. You can build efficient, intricate webs of inter-linkage in memory. And then there's the function pointer, which allows amazing flexibility when used with libdl. A pointer is a Good Thing, but don't mistreat it, or it will become a Very Bad Thing.