Viele Fragen ... versuchen, Antworten auf jede zu erfassen:
/* macht * str = opal oder tut * str = o, da der Zeiger str char ist? */
*str
ist 'o'
, da es beim ersten Zeichen weist
/* Was ist der Unterschied zwischen char * Ende und char * Ende? und * zeigt jetzt auf Opal?*/
Es gibt keinen Unterschied zwischen char *end
und char* end
. Es wird schwieriger, wenn Sie
char* a, b;
schreiben, da dies zu
entspricht
char *a, b;
und nicht, wie Sie
char *a, *b;
vielleicht denken Aus diesem Grund ist es sauberer char *end;
zu schreiben.
Und end
zeigt auf opal
jetzt - *end
ist 'o'
.
if (str) {/ * wenn str nicht null ist? */
Ja - Tests, die Sie nicht einen NULL-Zeiger
Um zu testen, dass Sie nicht eine Zeichenfolge der Länge 0, übergeben bekommen haben würden Sie *str
testen (nach der Prüfung übergeben bekommen haben, dass str
nicht NULL ist, sonst hat man einen Segmentation Fehler erhalten für "gewagt an * NULL suchen")
während (str < Ende) {/ * warum nicht * str < * end? fragt das, während o < l? */
Testen der Zeiger - man gegen Ende bewegt, der andere zurück bewegt. Wenn du dich in der Mitte triffst, hörst du auf; sonst haben Sie die Swap zweimal, und es wird kein Nettoeffekt sein ...
*str++ = *end; /* what is the difference between *str++ and ++str? does *str++ = l? */
Sie zuerst den Wert von *end
-*str
kopieren, dann erhöhen Sie die str
Zeiger. Wenn Sie ++str
eingeben, inkrementieren Sie zuerst, dann verwenden Sie es. Und das würde bedeuten, dass Sie die l
an Stelle der anstelle der o
setzen.
bearbeiten eine Kritik an Ihrem Code (geht über die gestellten Fragen Sie, und auf einen Kommentar von @chux reagiert): Wenn Sie für if(str){}
testen Sie wirklich brauchen eine else return;
Aussage, da Sie tatsächlich end--;
tun und dann verwenden *end
. Ziemlich sicher, dass 0xFFFFFFFFFFFFFFFF
ist fast immer eine ungültige Adresse ...
Wenn Sie in der Tat für if(*str!='\0')
testen, dann sollten Sie immer noch nur zurückgeben (eine leere Zeichenfolge ist "irreversible" - oder vielmehr, es braucht nichts zu gilt als umgekehrt).
Übrigens ziehe ich es vor, die Bedingung explizit zu machen (wie damals); es zeigt nicht nur Ihre Absicht deutlicher, aber der Compiler könnte tatsächlich beschweren, wenn Sie if(str!='\0')
oder if(*str != NULL)
getan haben, da die Typen, die Sie vergleichen, inkompatibel sind. Dies bedeutet, dass Sie einen Code haben, der robuster, lesbarer und mit größerer Wahrscheinlichkeit für das geeignet ist, was Sie vorhaben.
Wenn Sie "opal" 'wortwörtlich weitergeben, wäre dies ein undefiniertes Verhalten, da Sie kein Zeichenfolgenliteral ändern dürfen. –
@ShafikYaghmour was würdest du dann passieren? – Opal
Ein char-Array, 'char arr [] =" opal ";'. –