Yes, in this case you can. Later on, you'll see that sometimes you can't lose a pointer or you'll produce a memory leak. But don't concern yourself with it yet.
A pointer holds the address of a variable. In the case of char* n, by assigning it the value of m, you are actually making this assignment:
n = &m[0]
That's because C/C++ provides two ways to refer to the first element of an array, T; &T[0] and T. A pointer variable contains an address but an address isn't a pointer. That is, m is the address of the array but isn't a pointer to itself.
Consider this; m++; is equivalent to the statement m = m+1; Now, since m is another way of writing &m[0], then this is the same as making the following assignment:
&m[0] = &m[0] + 1;
If this was allowed, the address of the first element of an array would now be the same as the address of the second element of the same array. Hopefully, you see that this would make no sense. Indeed, the left side of this statement is not allowed to be on the left side of an assignmnt, which is what the second error message is telling you "error: non-lvalue in assignment"
Your use of char* n is correct and is what you should use to reference the elements of the array m.