As Vladimir F said in a comment to another answer, there may well be some confusion as to what the example code is doing. Although not a wide answer all about pointers (which is already partly covered), I'll comment briefly.
real(kind=jp), target :: bt(100,100)
real(kind=jp), pointer :: pt(:,:)
The pointer pt is not at this point pointing to anything: it has undefined association status. That you have the two objects declared together, one with the target attribute and one with the pointer attribute, doesn't signify something.
To associate pt with the target bt, pointer assignment is required:
pt => bt
In this way, one can go ahead and do things to bt through the pointer pt without any extra memory allocation (there will be some overhead associated with the pointer variable, but let's ignore that).
Yes, one also could do pointer allocation as in the question
allocate(pt(100,100))
but this newly minted lump of memory has nothing to do with bt.
As Alexander Vogt said in modern times there are reduced reasons to want to do that sort of thing (using allocatable arrays instead is a good thing to consider).
In summary, for "what are the pros and cons?": pointer assignment and allocation do totally different things. Choose whichever is appropriate.