Das Inkrementieren von Zeigern ist idiomatisch in C ++, da die Zeigersemantik einen grundlegenden Aspekt der Designphilosophie hinter der C ++ - Standardbibliothek widerspiegelt (basierend auf der STL von Alexander Stepanov ).
Das wichtige Konzept hierbei ist, dass die STL auf Containern, Algorithmen und Iteratoren basiert. Zeiger sind einfach Iteratoren .
Natürlich geht die Fähigkeit, Zeiger zu inkrementieren (oder zu subtrahieren), auf C zurück. Viele C-String-Manipulationsalgorithmen können einfach unter Verwendung von Zeigerarithmetik geschrieben werden. Betrachten Sie den folgenden Code:
char string1[4] = "abc";
char string2[4];
char* src = string1;
char* dest = string2;
while ((*dest++ = *src++));
Dieser Code verwendet Zeigerarithmetik, um eine nullterminierte C-Zeichenfolge zu kopieren. Die Schleife wird automatisch beendet, wenn sie auf die Null stößt.
In C ++ wird die Zeigersemantik auf das Konzept der Iteratoren verallgemeinert . Die meisten Standard-C ++ - Container bieten Iteratoren, auf die über die Funktionen begin
und end
member zugegriffen werden kann. Iteratoren verhalten sich wie Zeiger, da sie inkrementiert, dereferenziert und manchmal dekrementiert oder erweitert werden können.
Um über eine zu iterieren std::string
, würden wir sagen:
std::string s = "abcdef";
std::string::iterator it = s.begin();
for (; it != s.end(); ++it) std::cout << *it;
Wir erhöhen den Iterator genauso, wie wir einen Zeiger auf einen einfachen C-String erhöhen würden. Der Grund für die Leistungsfähigkeit dieses Konzepts liegt darin, dass Sie Vorlagen zum Schreiben von Funktionen verwenden können, die für jeden Iteratortyp geeignet sind, der die erforderlichen Konzeptanforderungen erfüllt. Und das ist die Kraft der STL:
std::string s1 = "abcdef";
std::vector<char> buf;
std::copy(s1.begin(), s1.end(), std::back_inserter(buf));
Dieser Code kopiert eine Zeichenfolge in einen Vektor. Die copy
Funktion ist eine Vorlage, die mit jedem Iterator funktioniert , der Inkrementierung unterstützt (einschließlich einfacher Zeiger). Wir könnten die gleiche copy
Funktion für einen einfachen C-String verwenden:
const char* s1 = "abcdef";
std::vector<char> buf;
std::copy(s1, s1 + std::strlen(s1), std::back_inserter(buf));
Wir könnten copy
einen std::map
oder einen std::set
oder einen beliebigen benutzerdefinierten Container verwenden, der Iteratoren unterstützt.
Beachten Sie, dass Zeiger eine bestimmte Art von Iterator sind: Iterator mit wahlfreiem Zugriff. Dies bedeutet, dass sie das Inkrementieren, Dekrementieren und Vorrücken mit dem Operator +
und unterstützen -
. Andere Iteratortypen unterstützen nur eine Teilmenge der Zeigersemantik: Ein bidirektionaler Iterator unterstützt mindestens das Inkrementieren und Dekrementieren. Ein Forward-Iterator unterstützt mindestens das Inkrementieren. (Alle Iteratortypen unterstützen die Dereferenzierung.) Für die copy
Funktion ist ein Iterator erforderlich, der zumindest das Inkrementieren unterstützt.
Sie können über verschiedene Iterator Konzepte lesen hier .
Das Inkrementieren von Zeigern ist also eine idiomatische C ++ - Methode, um über ein C-Array zu iterieren oder auf Elemente / Offsets in einem C-Array zuzugreifen.