Q:

Why doesn't strcpy use a const pointer for dest? 

Is there a reason strcpy's signature is this:
char *strcpy(char *dest, const char *src);

instead of this? 
char *strcpy(char *const dest, const char *src);

As far as I know, the function will never change the pointer.  
Am I misunderstanding what const pointers should be used for?  In my mind, when a function I write accepts a pointer which won't be changed (via realloc, etc.),  then I mark it as a const pointer so the caller can be assured their pointer won't be moved on them. ( In case they have other structs/etc.  referencing that pointer location that would become outdated)
Is that an OK practice, or will it have unintended consequences? 

A:

The source code for strcpy is very roughly this:
char *strcpy(char *dest, const char *src)
{
  while (*dest++ = *src++);
}

Here we actually do modify dest but this has no consequence for the caller because inside the strcpyfunction, dest is a local variable. 
But following code won't compile because dest is const:
char *strcpy(char * const dest, const char *src)
{
  while (*dest++ = *src++);
}

we would need to write this:
char *strcpy(char * const dest, const char *src)
{
  char *temp = dest;
  while (*temp++ = *src++);
}

which introduces a non necessary temp variable. 

A:

Qualifiers on function arguments are completely ignored in declarations (prototypes).  This is required by the C language, and it makes sense, because there is no possible meaning such qualification could have to callers of the function. 
In the case of const char *src, the argument src is not what's qualified; the type it points to is qualified.  In your hypothetical declaration for dest, the qualifier applies to dest and is thus meaningless.