Dein ganzes Programm hat undefiniertes Verhalten.
Ein String-Literal (also ein konstanter Text, wie zb "Hello") ist 
unveränderlich! Du darfst gar nicht versuchen, ihn zu ändern.
| 1 |     char *Text; /* Zeiger vom Typ char */
 | 
hierdurch hast du einen Zeiger eingerichtet
jetzt lässt du diesen Zeiger auf einen konstanten Text zeigen
und jetzt versuchst du, über den Zeiger den konstanten Text zu 
verändern. Und das darfst du nicht.
Das geht zwar in C nicht, weil ein Integer-Literal (anders als ein 
String) keine Adresse besitzt. Aber im Grunde, analogiemässig gesehen, 
versuchst du jetzt gerade dieses hier zu machen
| 1 |   int * p;
 | 
| 2 |   p = &78;
 | 
| 3 | 
 | 
| 4 |   *p = 5;
 | 
Deine Variante 3 hingegen, macht etwas ganz anderes. Sie setzt den 
Zeiger um. Der zeigt nicht mehr auf den konstante Text "Hello" sondern 
auf den ebenfalls konstanten Text "Bello"
vorher:
| 1 |    Text
 | 
| 2 |    +--------+
 | 
| 3 |    |   o-------------------------->"Hello"
 | 
| 4 |    +--------+
 | 
| 5 |                           "Bello"
 | 
nachher
| 1 |    Text
 | 
| 2 |    +--------+
 | 
| 3 |    |   o--------------+            "Hello"
 | 
| 4 |    +--------+         |
 | 
| 5 |                       +-->"Bello"
 |