The only difference between the two elements is semantics. Both elements, by default, have the CSS rule [font=courier]display: block[/font] (hence block-level) applied to them; nothing more (except somewhat extra margin in some instances). However, as aforementioned, they both different greatly in terms of semantics.
The [font=courier]<p>[/font] element, as its name somewhat implies, is for paragraphs. Thus, [font=courier]<p>[/font] should be used when you want to create blocks of paragraph text.
The [font=courier]<div>[/font] element, however, has little to no meaning semantically and therefore can be used as a generic block-level element — most commonly, people use it within layouts because it is meaningless semantically and can be used for generally anything you might require a block-level element for.
If you don't quite get what I'm referring to when I say "semantic markup", you might consider checking this post.