Pointers are something you meet in the real world all the time - just you don't recognise them.
For example, if you want to watch something on TV, you can pick up a TV listing magazine and look at what is on now - you get a list of programs that are currently showing. Those aren't the program itself, they are "pointers" to the channel, and time, and a description of the program. To use the listed item, you look at the "pointer to the channel" - the channel name, or maybe number - and use that to reference the actual program via your TV.
A filing system is another example (and one that translates to computers at lot more easily). You don't store everything in one file in a cabinet, you store them by customer name in separate files so you can find all the related information together. All you have to do is use the customer name as a pointer to the right file and you have the data.
Computers do this all the time: memory is just a long list of locations that can store information, and each location has an address. A pointer just stores the address instead of the value at the address. This means that you can have several places in your code pointing at the same place instead of repeating the information - so if a customer changes his address if gets altered in one location, but all the places in your app that use the address get updated!
Take an example: you have a string from the user, and you want to truncate it at the first "dot" character: '.'
You could refer to each character in the string by name:
if (char1 == '.') char1 = '\0';
if (char2 == '.') char2 = '\0';
if (char3 == '.') char3 = '\0';
if (char4 == '.') char4 = '\0';
...
but that gets very difficult when you don't know how long the input is, or its a very long string.
Instead you could just use a pointer in a loop:
for (i = 0, pstr = startOfString; i < lengthOfString; i++, pstr++)
{
if (*pstr == '.')
{
*pstr = '\0';
break;
}
}
Now you don't need to worry about individual names, or about how long the string is.