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.