char *pc = 'H';
Die obige Anweisung definiert pc
vom Typ char *
das heißt, es char
die Adresse eines Objektes des Typs aufnehmen kann. Sie initialisieren es mit dem Zeichen H
- ein anderer Typ. Beachten Sie, dass ein Zeichenliteral vom Typ int
ist und seinen Zeichencode auswertet, der in ASCII 72
ist.So ist die obige Aussage entspricht
char *pc = 72;
Dies ist eine illegale Operation und Compiler sollte man darüber warnen (in gcc, verwenden Sie das Flag -Wall
). Sie sollten einem Zeiger keine Adresse direkt zuweisen, weil Sie nicht wissen, ob Sie Zugriff auf die Speicheradresse haben. Sie sollten den Operator address of
&
verwenden, um die Adresse eines Objekts abzurufen und einem Zeiger zuzuweisen.
In der obigen Anweisung wertet das Zeichenfolgenliteral einen Zeiger auf sein erstes Element aus. Diese Adresse wird ps
zugewiesen, die vom gleichen Typ ist, d. H. char *
. Zeichenfolgenliterale sind jedoch in C
schreibgeschützt, sind jedoch nicht const
qualifiziert (im Gegensatz zu C++
), und der Versuch, das Zeichenfolgenliteral mithilfe des Zeigers ps
zu ändern, würde nicht zu einem Compilerfehler, sondern zu undefiniertem Verhalten und höchstwahrscheinlich Programmabsturz aufgrund von segfault führen. Daher Sie ps
als Zeiger auf einen const definieren sollte object
-
const char *ps = "hello";
Ich glaube nicht, 'char * pc =‚H'' tut, was Sie denken. – clcto
Wenn Sie 'printf ("% s ", pc);' versucht haben, könnten sehr interessante Dinge passieren. Wahrscheinlich Müllausgabe oder ein Crash. –
Hören Sie sich Ihre Warnungen an oder erhöhen Sie Ihre Warnstufe. –