Das trifft es nicht ganz. Der String "Hallo" steht im Speicher, und der Zeiger wird so initialisiert, dass er darauf zeigt.
Es sind 6 Bytes (die Nullterminierung nicht vergessen), und es ist auch nicht irgendwo, sondern ausdrücklich an einer Stelle im Speicher, auf die du nicht schreibend zugreifen darfst.
Du kannst den String also nicht ändern.
Nein. Printf kann uninitialisierte Zeiger nicht erkennen. Es wird trotzdem versuchen, den Speicher, auf den der Zeiger zeigt, als String zu interpretieren. Da der Zeiger in aller Regel aber nicht auf eine gültige Speicheradresse verweisen wird, wird das in die Hose gehen.
Sicher geht das.
Wieso ein Byte?
Wenn du bei der Definition eines Arrays die Größe nicht angibst, wird sie aus dem Ausdruck ermittelt, mit dem du das Arrray initialisierst. Das ist bei char-Arrays nicht anders.
Da du hier ein Literal der Größe 6 für die Initialisierung benutzt, ist das Array 6 char groß.
Das geht nicht, das Array ist zu klein für das Literal.