Okay, suppose you are writing a word-processing program. You need to use a string variable to hold the text of the document currently being written or edited, right? Your first instinct would be to hold the text ('buffer' in CS lingo) of the file in a regular, static C-string, and declare it to be very large. For example:
char textbuf[1024] ;
But some documents can be very long, thousands, or even millions of characters. For automatically generated text or xml files, they can even reach the billion-character mark. Would you want to say:
char textbuf[1048576] /* one megabyte */
or even
char textbuf[1073741824] /* one gigabyte */
That's going to make your program take up a lot of resources every time it is run, even if you're just editing a two-line file. It may crash your system, or not even run at all.
So the solution is to dynamically allocate memory from something called the freestore, or 'heap' of unused memory. That way, when your program is ready to edit the file, it simply has to find out how large the file is (not hard but I won't go into it here), and then allocate the that much memory + a little more so you can actually edit the file. A very smart program will figure out when it's about to reach the end of the buffer, and add more memory as needed. That way, your program only takes the resources it needs to meet its immediate needs.
You can do some more interesting stuff with pointers too, but dynamic data allocation is the basic purpose.