With very simple programs you are unlikely to use the heap, but when, as you say, programs become more complex it is invaluable.
Imagine you have a function that given a filename will create an object for you that contains that files data. Rather than creating the object yourself and then passing it into the function, you could have the function allocate the object on the heap and then return a pointer to it. Passing a pointer is *much* more efficient than copying an entire object.
That's just an example. I'm sure later on in your book you'll find out clearer scenarios where heap memory is useful.

QuantumPete