In the C language, the following rules apply (some of them don't apply to others like C++):
- Arrays may degrade to pointers, possibly lossing their constant properties as described in rule 4.
- Any expression of the form x[y]is equivalent to*(x + y).
- A string literal represents a null-terminated array of characters.
- A variable name afor a given array is constant, and is equivalent to&a[0].
- For any non-constant, non-volatile type T, an expression of typeTmay be assigned to a variable name whose type may or not include the constant and/o volatile qualifiers, and if non-qualified would have typeT, but an expression that constant and/or volatile qualified, and has typeTwhen non-qualified, may not be assigned to a variable name that lacks the qualifiers of such an expression.
This implies that all the following assignments all valid:
- char str[] = "Hello, world!\n", due to rule 3.
- const char str[] = "Hello, world!\n", due to rules 3 and 5.
- volatile char str[] = "Hello, world!\n", due to rules 3 and 5.
- const volatile char str[] = "Hello, world!\n", due to rules 3 and 5.
- char *str = "Hello, world!\n", due to rules 3 and 1.
- const char *str = "Hello, world!\n", due to rules 3, 1, and 5.
- volatile char *str = "Hello, world!\n", due to rules 3, 1, and 5.
- const volatile char *str = "Hello, world!\n", due to rules 3, 1, and 5.
Given rules 4 and 5, a call to void fit(char*, int) shall fail if the expression assigned to the first argument is non-qualified, such as if given the statement const char *mesg = "Hey, Lisa. You look so beautiful!";, the variable name mesg is assigned to the first argument in a call to void fit(char*, int).
Just for completeness, rule 1 is strongered by rule 2, as seen in the expression *(p + n) = '\0' whenever p was degraded from an array at its assignment.
tl;dr: Most differences between both of the situations you described occur whenever a mismatch of qualifiers occur, as described in rule 5 above. This is mostly due to "historical reasons" (i.e: lazyness), and has affected other languages. For example, C++ saves some "compatibility with C", or in other words, compatibility with lazyness.