Binäre additiven Operatoren +
und -
können verwendet werden, wenn ein Argument einen Zeiger auf jede vollständige Typ ist (sagen wir, T* p
) und das andere Argument eine ganze Zahl ist (sagen wir, i
). Sie implementieren so genannte Zeigerarithmetik.
Der Compiler wird davon ausgegangen, dass der Zeiger auf ein Element irgendeiner Anordnung zeigt (sagen wir, T array[N]
). Die Operation erzeugt einen Zeiger auf ein anderes Element des Arrays, das i
Elemente vom ursprünglichen Element entfernt ist. Es ist möglich, den Zeiger in jede Richtung zu "bewegen", d. H. Zum Anfang des Arrays oder zum Ende des Arrays hin. Wenn beispielsweise auf array[3]
zeigt, wird p + 4
auf array[7]
zeigen.
Der Betrieb ist nur gültig, wenn das Ergebnis zeigt auf ein vorhandenes Element des Arrays oder einem hinter dem letzten Elemente der Anordnung, dh die Anordnung gegebene T array[N]
ist es möglich, Verweise auf Elemente aus array[0]
zum imaginären Elemente zu schaffen, array[N]
. Alle Versuche, diese Grenzen unter Verwendung der Zeigerarithmetik zu überschreiten, führen zu undefiniertem Verhalten.
Der Typ T
hat vollständig sein, dass die Zeigerarithmetik verwendet werden kann, nicht mit void *
Zeiger bedeutet, für ein Beispiel, auch wenn einige Compiler dies als Erweiterung ermöglichen (void *
Zeiger als äquivalent zu char *
Zeiger Behandlung).
Neben den binären Additionsoperatoren, Zeigerarithmetik enthält auch Präfix und Postfix unären ++
und --
Operatoren (auf Zeiger angewendet) sowie Verbindung Zuweisungsoperatoren +=
und -=
(mit Zeigern auf ihrer linken Seite und die ganzen Zahlen auf die rechte Seite).
In Ihrem Fall wird str + strlen(str)
Ausdruck einen Zeiger von char *
Typ erzeugen, die str
in der Zeichenfolge an den Abschluss \0
Charakter zeigt.
'strlen()' gibt tatsächlich ein 'size_t' zurück, nicht ein' int'. Einer der wichtigen Unterschiede besteht darin, dass "size_t" ein vorzeichenloser Typ ist, d. H. Er kann nur positive Zahlen enthalten. Dies ist sinnvoll - Zeichenkettenlängen können 0, 1 oder 30000 Zeichen sein, aber niemals -7. – MSalters