Pointers C ++. Teil 2

Bewerten Sie diesen Artikel





C ++ Zeiger, c ++ Zeiger

das Teil wir haben betrachtet, als einen Zeiger-Operator neu chunk während das Programm direkt in der erforderlichen Größe identifiziert werden,. Gerade gelernt, wie dieser Teil des Speichers kann befreit werden, Verwendung löschen. Wir sahen, wie die Parameter auf die Zeigerfunktion übertragen werden. und, es macht es möglich, den Wert der Variablen zu ändern,, welche an die Funktion übergeben.

Wir betrachten nun ein Beispiel, wo wir auf die Funktion einen Zeiger auf einen String übergeben (Indizes wie verkohlen). Diese Funktion gibt einen Zeiger auf sich selbst. Die Aufgabe, folgende: Es gibt zwei Zeiger auf Strings, unter dem sie die notwendigen Speicherbereiche zugewiesen. Es ist notwendig, diese beiden Zeilen zu kombinieren. Das heißt, ist es notwendig, einen neuen Teil des Speichers für die erste Zeile zuzuweisen, es möglich zu machen, um es einer zweiten Zeile hinzufügen.

vor, wie man tippt Code, dass Sie nicht “begraben” Fehler – die neueste Version von Microsoft Visual Studio-Umgebung zu installieren. Например Microsoft Visual Studio 2013 ausdrücken. Wenn Sie eine frühere Version verwenden, stattdessen Funktionen strcat_s() anwenden strcat() und strcpy() statt strcpy_s().

Lassen Sie uns gehen, um. On line 4 Es ist ein Funktionsprototyp. seine Mission – einen neuen Teil des Speichers für die Zeichenfolge zuweisen, am Ende von denen eine andere Zeile geschrieben. Dies wird weiter unten diskutiert, wenn wir in der Definition dieser Funktion kommen,. Gehe zu Zeile 11 – 12. Sie definieren Variablen, dass die Werte der Längen der Zeichenfolgen speichern, "Reihe 1 " und "+ Reihe 2". Die Länge wird mit Hilfe von eingebauten Funktionen berechnet strlen(). Es wird die String-Länge zurückzukehren, ohne das Symbol \0 . Daher wird, wenn die Initialisierung von Variablen strsize1 und strsize2 wir hinzufügen, dass die Rückkehr strlen(…) edïnïcw.

On line 14 definiert Zeiger pStr1 die erste Zeile. So schreiben Sie einen String, Sie müssen es zuerst durch den Speicher wählen: verkohlen* pStr1 = neu verkohlen[strsize1]; Die folgende kopieren, um eine Zeichenfolge in dem zugewiesenen Speicher: strcpy_s(pStr1, strsize1, "Reihe 1 "); . Der erste Parameter, die Funktion erhält strcpy_s() – ein Zeiger auf die Adresse, wo Sie eine Zeichenfolge kopieren möchten; zweite – Zeilengröße; dritte – die Zeichenfolge selbst. Der zweite Zeiger pStr2 Wir definieren genau.

Die Seite. 20 – 21, Sie zeigen auf dem Bildschirm die aufgezeichnete Linie. Es ist genug, um sie mit Namen Zeichen zu verweisen. Pointer speichert die Adresse null Zelle. Wenn wir fragen, es auf dem Bildschirm zu zeigen, – wird abwechselnd eine Reihe von Zeichen dargestellt werden, (Speicherbereich, die vorher isoliert), bis ein Newline-Zeichen – \0 .

pp. 23-24 – sehen, wie viele Bytes Speicher jede Zeile nimmt. Reihe 26 gelöscht Kommentar. Es machte einen Versuch, eine zweite Linie in der ersten hinzufügen. Versuchen Sie zu entfernen // und kompilieren Sie das Programm. Die Durchführung des Programms wird Fehler abbrechen. Sie werden den folgenden Bildschirm sehen:

указатели на строки с++, Zeiger auf die Linie c ++, neu, löschennatürlich – weil der zugeordnete Speicherbereich unter der ersten Leitung zu klein ist, zu beenden es irgendwelche Daten enthält. On line 28 Variable schreiben RequiredSize wirklich notwendig, Speichergröße zwei Linien aufzeichnen: int RequiredSize = (strsize1 + strsize2) - 1; Einheit subtrahieren, weil, Variablen, die strsize1 und strsize2 bereits enthalten zwei \0 , und wir brauchen nur ein.

Navigieren Sie zu der Definition von giveNewMem() – pp. 42 – 51. Es wird die erste Zeile (einen Zeiger darauf) und integer (eine ausreichende Menge an Speicher,). sehen – wir müssen für das Schreiben von Zeichen in ihm einen neuen Teil des Speichers in dieser Funktion zuweisen. So sollte die Funktion einen Zeiger auf den neuen Speicherplatz zurückkehren. So können wir auf den Index schreiben pStr1 neue Adresse, in dem der Speicher zwei Zeilen zu schreiben,. Daher schreiben im Funktionskopf so verkohlen* giveNewMem(verkohlen *pstr1, int reqSize)

Da die neue Speicherblock markiert ist, dann wird der Speicher, das belegt die erste Zeile freigegeben werden soll. Wenn wir das tun, dieses Recht am Anfang der Funktion – Daten (Zeichen Linie) verschwinden, weil wir verlieren die Adresse, an der sie sich befinden,. Deshalb sollten wir in einer Funktion, einen neuen Teil des Speichers zu beantragen, in denen kopieren wir die Zeichen der ersten Zeile, vor vacate Speicher.

Erstellen Sie ein neues Verzeichnis und sofort Speicher zuweisen, für sie, genug, um zwei Reihen von Symbolen aufzunehmen (pp. 44). Kopieren Sie dann den ausgewählten Speicher in der ersten Reihe von Zeichen: strcpy_s(strInFunc, reqSize, pstr1); String skopirovana – müssen Sie Speicherplatz freizugeben, sie hielt, damit es einen Speicherverlust (pp. 48). Wir kehren von einer Funktion Zeiger auf den neuen Speicherplatz: Rückkehr strInFunc;

Es stellt sich heraus,, wenn wir rufen Sie diese Funktion aus Main() (pp. 31) pStr1 = giveNewMem(pStr1, RequiredSize); – indiziert pStr1 geschrieben Adresse des neuen Speicherabschnitt, welche in der Lage ist zwei Zeilen unterzubringen. Es bleibt nur noch in der zweiten Zeile der Speichererweiterung (pp. 33) und zeigen Sie es auf dem Bildschirm. Vor dem Verlassen des Programms gibt den Speicher. Der erste, der in der Funktion zugewiesen wurde, und dann ist der, wo die zweite Leitung.

kompilieren Programm:

указатели на строки с++, Zeiger auf die Linie c ++, neu, löschen

Dieses Beispiel zeigte,, wie wir, mit Zeigern, Wir können RAM verfügen, bis auf das Byte.

Am Ende zusammenfassen und schreiben Grund, ist es notwendig, über Zeiger zu erinnern.

Warum Zeiger in C ++?

  • mit Zeigern, mögliche Zuordnung von dynamischen Speicher. Weil Speicher für Daten im Verlauf des Arbeitsprogramms veröffentlicht, anstatt bei der Kompilierung. Dies ist sehr vorteilhaft,, wenn man im Voraus des Programms wird als Ist-Daten wissen nicht verwendet werden, (Variablen). Zur Zuweisung von Speicher und frei, es, von den Betreibern genutzten neu und löschen.
  • Indizes werden häufig zugreifen Teile des Datenvolumens der Funktionen. Daten symbolische und numerische Arrays solche, die außerhalb der Funktion definiert. Dieser Ansatz kam von der Programmiersprache C. In C ++ relativen numerischen Variablen und Arrays einfacher zu bedienen Verbindungsübertragung. Bald werden wir zu diesem Thema suchen. In Bezug auf die Linien C-Stil besser für die Übertragung des Zeichens zu beantragen.
  • mit Zeigern – Wir arbeiten mit dem Speicher an den Adressen direkt. Es ist schneller, als mit Namen von Variablen gehen.

deklarieren Zeiger, wobei Adressen, Dereference

Betrachten Sie das Beispiel im Detail:

On line 8 definiert regelmäßige Integer-Variable. On line 9 kommentierte declare und den Zeiger initialisieren. Versuchen Sie die Kommentarzeichen zu entfernen // und kompilieren. Wir werden einen Fehler melden. In Ordnung. Es sollte ein Zeiger sein, um die Adresse zu speichern, (Hexadezimalzahl), nicht der Wert (Dezimalzahl oder Symbol). zu, die Adresse einer Variablen, die von den Erfassungsvorgang Adressen verwendet zu erhalten & (Ampersand: Verschiebung + 7). On line 10 erstellen Index und schreibt die Adresse der Variablen:

инициализация указателя

Zur Ermittlung des Index, Wir müssen seine Art erklären, für ein Sternchen * und geben Sie ihm einen Namen. Initialisieren Sie den Zeiger nur adressieren. Wenn Sie nicht über einen Adressenzeiger in ihrer Erklärung zuweisen, Initialisieren auf Null. Dann kann ein Zeiger auf komplexen Fehlern führen, Das ist schwer zu finden. Er alles nur nicht zeigen.

Normalerweise sind wir nicht besonders interessiert, die speichert einen Adressenzeiger. Wir interessieren uns für die Daten, an dieser Adresse befindet. So zeigen diese Daten (oder ändern sie) Zeiger auf den Namen der Operation ist es erforderlich, die dereferenzieren anzuwenden. Dies ist der gleiche Stern *, sowie die Erklärung.

Pointer-Dereference

Cout Strom wird nur anders behandelt – nicht so viel wie in der Cursordeklaration. Es hilft, den Zugriff auf Daten, an der Adresse gespeichert,. Dies ist in der Zeile angezeigt 15 Quelle.

On line 18 bestimmte tselochislennыy Feld fünf Elemente. Im Folgenden angegebenen Zeiger. beachten Sie – einen Zeiger auf das Adreßfeld zu initialisieren, Betrieb & nicht anwendbar. Dies liegt daran,, dass der Name des Arrays bezieht sich auf die Adresse der Zelle Null. Es stellt sich heraus, dass der Datensatz

Zeiger Initialisierung

ganz normal kompiliert. Die Zeigervariable pFirstArr Adresse wird Null-Array-Zelle aufgezeichnet werden firstArr. Dieser Eintrag ist ähnlich der folgenden

Zeiger Initialisierung

On line 25 zeigt ein Beispiel von Datenelementen in dem Array durch einen Zeiger zugreift. Verwenden Sie Array-Notation. Das heißt, wir brauchen nicht die dereferenzieren Betrieb anzuwenden, das Datenfeld zugreifen:

cout << "pfirstArr[0] = " << pFirstArr[0] << endl << endl;

können, natürlich die Datenarray zugreifen, Mit der Notation von Zeigern, aber es ist unpraktisch. schauen, sah aus, als ob die Zuordnung der Werte der Elemente des Arrays und die Werte auf dem Bildschirm angezeigt werden:

Linien 27 – 28 Quelle – Definition Si-stroki und Bestimmung auf dieser Linie Zeiger. Zeiger sind sehr gut bei der Arbeit mit Strings. Wenn wir in den Stream cout Anruf mit Namen auf einen Zeiger auf ein Zeichen-Array, Er wird uns zeigen, die gesamte Linie. Wie im Falle von Arrays,, wird der Compiler die Zeichen auf dem Bildschirm angezeigt werden, bis es findet das Ende der Zeichenkette in dem Array symbol \0

Schauen Sie sich die Ergebnisse des Programms und den Quellcode wieder. Versuchen Sie zu verstehen, wie es funktioniert.

Zeiger Initialisierung, Pointer-Dereference, & wobei Adressen

Eine weitere Abschweifung, zu ermutigen, diejenigen, wer schwieriges Thema Zeiger gegeben :) Du bist nicht allein. Alles kommt mit der Praxis! Und es kommt zu Ihnen! Keine Panik, wenn es so aussieht für Sie zu verwirrend. Lösen möglichst viele Programmieraufgaben. Selbst wenn Sie etwas tun, tun Sie nicht in den Prozess des Schreibens Code, unsere wunderbare Entwicklungsumgebung wird es wissen.

Achten Sie darauf, um das Video von Markern zu sehen (mit einer 12-minütigen), wenn Sie nicht, dass es im ersten Teil des Artikels beobachtet:

Pointers, als Parameter (Argumente) Funktion:




Newsletter neue Lektionen über die Programmierung:

7 Gedanken zu "Pointers C ++. Teil 2

  1. Ich kann nicht verstehen , in 15 Codezeile – strcpy_s(pStr1, strsize1, “Reihe 1 “);
    Funktion wird in strcpy_s verwendet 3 Argument, früher in der Beschreibung dieser Funktion, ist es nur anzeigt, 2 Argument (in dem die Kopie und dass die Kopie).
    Tatsächlich ist die Frage : Deshalb ist es jetzt 3 Argument? Weil wir einen Zeiger als erstes Argument verwenden? Oder weil es eine neue Version dieser Funktion (strcpy_s вместо strcpy)? Oder diese Funktion Visual Studio? unnötigerweise. в Code:: blockiert die Funktion strcpy nimmt 2 Argument <>.

    1. Die Beispielcode verwendete Funktion strcpy_s(), anstelle von strcpy(), dass wirklich 2 Argument. Siehe die Namen aufmerksam.

      P.S. Dies bedeutet nicht,, so dass getan werden sollte,: strcpy_s() – Funktion, nicht in allen POSIX-Standards enthalten, ни C, oder Linux, etc.. usw. … und wird nur unter Windows-Betriebssystemen verwendet (Sie hat seine Beschreibung in der Literatur nicht einmal finden). Aber dieses besondere Beispiel – richtig.

      1. Ich habe, was ich nicht die Beschreibung von strcpy_s finden, Und warum diese Funktion, müssen Sie die Größe der Zeichenfolge zu wissen, ist nicht klar,.
        Zeilengröße ist es notwendig, da das erste Argument ein Zeiger auf weiß? Oder ist es ein Merkmal der aktualisierten Features? Und wie viele Argumente dieser Funktion dauert in der Regel (kann dauern) ?

    2. Geben Sie die Größe der kopierten Zeichenfolge ist sehr nützlich,: wenn die Zeilenquelle, durch Zufall, solange der Empfänger, Sie werden einen Speicherzugriffsfehler mit dem Zusammenbruch der gesamten Anwendung erhalten.

      Siehe die Beschreibung der Bibliothek und Standardfunktionen Strncpy(), Das ist sicherer und zunehmend auch in professionellen Code als strcpy verwendet().

Hinterlasse eine Antwort

Platz Code in Tags: <pre class="lang:c ++ dekodieren:true ">DEIN CODE</Vor>