Can't access an array-type member of a structure?

I would like to revise my above understanding as follows:

While initializing s with "012345678", the characters are stored in an array space. The pointer (the base address) of the array space is used to read the charaters one-by-one, which are written into the destination space whose base address (the pointer) is in s. The following codes are supposed to be executed (in the backgorund) to implement "char s[10] = "012345678"; instruction in order to initialize s.

 char s[10];
 char *ptrS;
 ptrS = "012345678";  //"012345678" is pointer by definition
 Serial.println((uint16_t)ptrS, HEX); //shows: 112

 char *ptrD;   //pointer variable to point the destination space (the s[])
 ptrD = s;
 for(int i=0; i<sizeof(s); i++)
 {
  char ch = *ptrS;
  *ptrD = ch;
  ++ptrS;
  ++ptrD;
 }
 Serial.println(s); //shows: 012345678

That's closer, but not right yet. No copying is involved. Well, there is a copy on AVR that copies all of the ".data" space into RAM, but that's just because of the flash not being directly addressable.

By the time to main(), some section of RAM has a copy of all of your initialized variables, including bytes 01234... beginning at some address xxxx. The compiler knew what address that would be, so s is just xxxx (an address, or 'pointer') When you call Serial.print(), xxxx (the address of the first byte of the string in RAM is passed as the argument - no additional copy occurs at runtime.

That makes the original problem even simpler to define.
C does not support the assignment of a whole array to another. That's even exactly what the error message said, right? error: invalid array assignment

I call it a hack/kludge/whatever because C has no other mechanism for specifying a constant array (or other complex structure.) I don't think C++ does, either (though invoking a constructor to create an object is pretty close?)
You can't say birthday.name = {'R', 'a', 'k', 'i', 'b', 0}; either, for example, because the {val, val, val} format is only for initializers; it doesn't "create" a constant.

Please don't use C-style casts, especially not on pointers or to cast away const.

Yeah, yeah. I was hoping to avoid dealing with "const" in this discussion, but I didn't want the code I posted to generate warnings, either.
I'm vaguely annoyed that the type of string literals changed somewhere along the lines. Academically, anyway. I concede that it's almost always the right thing to do, but:

    char s[] = "abcd";
    char *s1 = "abcd";

not behaving the same (s1 initialization gives a warning) is ... uncomfortable.