In the line
str1 = "Adieu";
the array str
will decay to a pointer to the first element of the array, which is an rvalue (not an lvalue) and therefore cannot be modified.
This behavior is specified in §6.3.2.1 ¶3 of the ISO C11 standard:
Except when it is the operand of the sizeof operator, the _Alignof operator, or the unary & operator, or is a string literal used to initialize an array, an expression that has type ''array of type'' is converted to an expression with type ''pointer to type'' that points to the initial element of the array object and is not an lvalue. [...]
Note that in the quote above, "initialize an array" means initialize it inside a declaration, not assign it a value outside a declaration (which would be an "assignment", not an "initialization").
For this reason, the error message in your book
error, constant pointer cannot change
is correct. An rvalue cannot be modified and it is therefore not wrong to describe it as "constant".
However, the error message from your compiler
error: assignment to expression with array type
is also correct and probably more useful.