Read const and pointer declarations from right to left:
TPhone * const * arrayCopy
^ ^ ^ ^ ^
| | | | \---- arrayCopy is a
| | | \------------ pointer to
| | \------------------- const
| \-------------------------- pointer to
\--------------------------------- TPhone
So, arrayCopy is effectively an array of constant pointers (and so is array). Constant pointers cannot be moved (i.e. you cannot change where they point). Thus, you cannot overwrite them, and thus, you cannot sort them.
If you wanted an array of pointers to constant TPhone (i.e., you cannot change the fields of TPhone, but you can move pointers around), then you should move the const:
pointer to constant TPhone:
TPhone const * // right-to-left
array of pointer to constant TPhone:
TPhone const * [] // right-to-left
but since arrays can't easily be passed to functions, you can use a pointer:
TPhone const * * // right-to-left
Then you can change the pointers (which are just memory addresses), but you cannot change the actual TPhone objects.