printf in C--Zeiger-variable %p %c %s
void say(char msg[])
{ //using pointer to print out the first char of string
printf("%c\n", *msg);
}
void say(char msg[])
{ //using pointer to print out the memory address of the first char of string
printf("%p\n", msg);
}
void say(char msg[])
{ //using pointer to print out the whole string
printf("%s\n", msg);
}
Den ersten beiden Sinn machen, aber ich verstehe nicht ganz, wie die Dritte Funktion funktioniert. Alles was ich weiß ist, dass die msg-Punkte auf die Speicheradresse des ersten Zeichens der Zeichenfolge. Vielen Dank im Voraus.
Du musst angemeldet sein, um einen Kommentar abzugeben.
%s
interpretieren die Adresse vonmsg
als die Basis-Adresse einer C-saite, die eine NULL-terminiert ('\0'
) Sequenz von bytes, und damit die printf mit der%s
wird die Basis-Adresse desmsg
und drucken der Zeichen entspricht jedes byte abmsg
und fortfahren, bis es nicht auf ein NULL-Zeichen.Letzten Drucke string.. es beginnt bei Speicher-Adresse von msg und geht bis terminierungszeichen '\0'
Da eine C-Zeichenkette NUL-Zeichen
\0
, dieprintf
Funktion, die Annahme und Verwendung der Adresse in der pointer zum ausdrucken alle Zeichen bis Zeichen NUL\0
gefunden wird.Wenn die
char
array übergeben wird, wird nicht NUL beendet, wird Ihr Programm Abstürzen, da kann es nicht finden, die NUL-Zeichen und-Ausgabe wird Unsinn, bis es auf einen nicht zugeordneten Speicherbereich.Die Letzte Anweisung erwartet String weil format specifier %s . Es dauert in der Basis-Adresse von msg als Startadresse ein und drucken Sie alle Zeichen bis '\0', denn string ist eine null-terminierte zeichenarray.
%P druckt den stack-Wert Adresse gestoßen mit der variable genannt.
zum Beispiel, wenn ein Wert gespeichert ist, an eine Adresse, 2000.
und wir tun, %P in printf () - Anweisung, die Ausgabe ist die Adresse gestoßen in Stapel der Funktion.
eine Adresse wäre in Stapel geschoben, wenn wir printf("%P",a); es gibt den stack-Wert geschoben.
%s
.