Pointers C ++. Teil 1

Pointers C ++. Teil 1
3.3 (66.67%) 6 Stimmen





указатели с++, указатели c++, new delete c++

Das Sammeln von Informationen für diesen Artikel, Ich erinnerte mich an meine erste Begegnung mit Zeigern – Trauer-Traurigkeit war… Deshalb wird nach ein paar Kapitel über das Thema aus verschiedenen Bücher über das Programmieren in C ++ lesen, es wurde beschlossen, einen anderen Weg zu gehen und das Thema C ++ Zeiger in der Sequenz vorhanden, die ich halte es für notwendig. geben Sie einfach eine kurze Definition und betrachten die Zeichen in – Beispiele. Im nächsten Artikel (Pointers C ++. Teil 2) Sie werden die Nuancen festgelegten, mit der Verwendung von Zeigern Profis in Si stile (Zeichen-Arrays) und Grund, dass wir sollten nicht vergessen,.

Pointer in C ++ – Variable, die speichert die Adresse eines Daten (Bedeutung) in-memory, und nicht die Daten selbst.

Betrachten Sie das folgende Beispiel, Sie werden die Haupt verstehen – Warum brauchen wir Indikatoren zu programmieren, wie zu deklarieren und zu verwenden.

Lassen Sie uns, im Programm benötigen wir ein Integer-Array zu erstellen, die genaue Größe, die nicht zu uns vor dem Start des Programms bekannt. Das heißt, wir wissen nicht, wie viele Zahlen der Benutzer in diesem Array zu machen müssen. natürlich, wir können ein Array von mehreren tausend Einzelteile sicherzustellen und erklären, (beispielsweise auf 5 000). es (In unserer subjektiven Meinung) Es sollte genug sein für den Benutzer zu arbeiten. dass – wirklich – Dies kann ausreichen, um. Aber lassen Sie uns nicht vergessen,, dass die Anordnung viel Platz im RAM aufnehmen wird (5 000 * 4 (тип int) = 20 000 Byte). Wir haben dann irren, und der Benutzer wird nur füllen, 10 Elemente unserer Array. Es stellt sich heraus,, dass wirklich 40 Bytes in, und 19 960 Byte nehmen unnötig up Speicher.

Die Standard-Library-Funktion Größe von() eine Mitteilung an das Array schicken arrWithDigits Reihe 10. Sie kehren an den Ort des Anrufs in Bytes, welches nimmt diese Anordnung im Speicher. die Frage “Wie viele Zahlen, die Sie eingeben in ein Array?” antworten – 10. On line 15, Ausdruck Menge * Größe von(int) wäre gleichbedeutend mit 10 * 4, da die Funktion Größe von(int) Rückkehr 4 (Bytes des Typs int size). Als nächstes wird eine Nummer über die Tastatur eingeben und das Programm sich auf dem Bildschirm angezeigt. Es stellt sich heraus,, der Rest 4990 Elemente werden die Nullen halten. So macht es keinen Sinn, sie zu zeigen,.

C ++ Zeiger, c ++ Zeiger, neu, löschen

Home Information auf dem Bildschirm: Massa nahm 20 000 Byte, aber wirklich ist es notwendig, 40 Byte. Wie aus dieser Situation zu bekommen,? vielleicht, jemand will das Programm neu zu schreiben, so, ein Benutzer Tasteneingabefeldgröße, und einen Wert nach der Eingabe eines Arrays mit der gewünschten Anzahl von Elementen zu erklären. Aber das kann nicht ohne Zeiger realisiert werden. Wie Sie erinnern sich vielleicht, – Größe des Arrays muss eine Konstante sein. Dh Integer-Konstante muss auf eine Array-Deklaration initialisiert werden, und wir können für ihre Eingabe von der Tastatur nicht fragen. Experiment – überprüfen.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

указатели с++, указатели c++, new, delete
Hier zeigen wir in rot Operator >> da kann man nicht den konstanten Wert ändern.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

указатели с++, указатели c++, new, delete
Hier sind wir gewarnt, , dass die Array-Größe ein Wert ist, kann ein normaler variabel sein. Es ist notwendig, auf einen konstanten Wert!

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Im nächsten Beispiel werden wir einen Zeiger und neue Operatoren für Sie verwenden neu (Speicher zuzuteilen) und löschen (gibt Speicher frei).

Der Benutzer gibt einen Wert mit der Tastatur, – Reihe 12. Unterhalb eines bestimmten Index: int* arrWithDigits Dieser Eintrag bedeutet,, dass arrWithDigits – ein Zeiger. Es ist so konzipiert Zelladressen speichern, das wird eine ganze Zahl. In diesem Fall arrWithDigits Punkt wird auf ein Array von Zellindex 0. Markierung * – die gleichen, die für die Vermehrung verwendet wird. Kontext-bezogene Compiler “verstehen”, es ist Klein Index, nicht vermehren. Gefolgt von den Zeichen = und Betreiber neu, die Speicherstelle ordnet. wir erinnern, dass unser Speicher sollte für das Array zugeordnet werden, anstatt unter einer Nummer. Rekord neu int [sizeOfArray] so kann man entziffern: neu (Speicher zuzuteilen) int (Lagerung ganzen Zahlen) [sizeOfArray] (in Höhe von sizeOfArray).

So ist in Reihe 16 Es wurde festgestellt dynamisches Array. Das heisst, dass der Speicher wird für sie zugeordnet (oder abheben) während des Programms, anstatt bei der Kompilierung, wie es der Fall bei herkömmlichen Anordnungen. Das heißt, die Speicherzuweisung ist abhängig von der Entwicklung von Programmen und Lösungen, direkt an ihre Arbeit aufgenommen. In diesem Fall – Es hängt davon ab,, das wird der Benutzer auf die Variable einführen sizeOfArray

On line 25 der Betreiber gilt löschen. Es löst den gewählten Betreiber neu Speicher. Als neu Es weist Speicher für eine Reihe von Unterkünften, auch wenn seine Freigabe erforderlich ist, um es an den Compiler deutlich zu machen,, es ist notwendig, den Array-Speicher freizugeben, und nicht nur die Null-Zelle, Er zeigte auf arrWithDigits. Daher zwischen löschen und der Name des Index setzt eckige Klammern [] – löschen [] arrWithDigits; Denken Sie daran,, dass jedes Mal,, Wenn der Speicher wird durch eine zugewiesene neu, Sie müssen diese Speicher freigeben Verwendung löschen. natürlich, am Ende des Programmspeichers, belegt es, Es wird automatisch freigegeben werden. Aber lassen Sie eine gute Gewohnheit, mit Operatoren werden wird neu und löschen paarig. Schließlich kann das Programm befindet 5-6 zB Arrays. Und wenn Sie den Speicher wird frei, jedes Mal, wenn es nicht mehr erforderlich, in Zukunft im laufenden Programm – der Speicher sinnvoll ausgegeben werden mehr.

Nehmen wir in unserem Programm füllten wir das Array mit zehn Werten. Als nächstes finden sie, und die Menge in irgendeiner Variable aufgezeichnet. Und alle – desto mehr arbeiten wir mit dem Array wird nicht mehr sein. Das Programm setzt sich auch arbeiten und neue dynamische Arrays sind in es für alle Zwecke. In diesem Fall ist es ratsam, um Speicherplatz freizugeben, das belegt die erste Reihe. Dann, wenn die Speicherzuweisung für den Rest dieses Speicherarrays verwendet werden kann, um eine Umprogrammierung.

Betrachten Sie die Verwendung von Zeigern, als Parameter Funktion. Für den Anfang, eingeben und kompilieren den folgenden Code. Es wird eine zwei Variablen-Funktion und schlägt Änderungen in ihren Werten.

Führen Sie das Programm und geben Sie neue Werte für die Variablen. Sie werden am Ende sehen, Nach Abschluss der Funktion, Variablen haben sich nicht geändert und sind 0.

C ++ Zeiger, c ++ Zeiger, neu, löschen

Wie Sie erinnern sich vielleicht,, Funktion arbeitet nicht direkt mit Variablen, und erstellen ihre Repliken. Diese Kopien werden zerstört, nachdem die Funktion verlassen. Das ist die Funktion in Form von Parametern einiger variable erhalten, Ich habe eine Kopie davon erstellt, Ich arbeitete mit ihr und zerstören. Die Variable selbst bleibt unverändert in diesem Fall.

mit Zeigern, wir können auf die Funktionsvariablen Adressen übergeben. Dann wird die Funktion der Lage sein, direkt Variablen mit Daten arbeiten an. Vnesom Änderung zum vorherigen Programm.

der Titel (Reihe 27) und Funktionsprototypen (Reihe 5), Add-Operation * vor dem Parameternamen. Dies legt nahe,, diese Funktion eine Adresse zu bekommen, eher als die Werte der Variablen. Beim Aufruf einer Funktion der Main() zu den Namen der Variablen übertragen Betrieb hinzufügen & (Ampersand – Verschiebung + 7). & Es bedeutet, unter Adressen. Erinnern Sie sich an, daß speichert einen Adreßzeiger. Deshalb können wir nicht die gewöhnliche Bedeutung passieren, wenn im Titel angegeben, daß die Funktion nimmt einen Zeiger. Verwendung & vor den Variablennamen, Funktion erhalten ihre Adressen.

Der Körper der Funktion, bei der Eingabe von Werten in die Variablen, Sie müssen den Pointer-Dereference verwenden. Dies geschieht alle die gleiche Operation mit * : Gin >> *varForCh1; So werden wir Änderungen in den Werten der Variablen machen, anstatt Adresse. Überprüfen Sie den Betrieb des Programms:

C ++ Zeiger, c ++ Zeiger, neu, löschen

alle einge – Variablen wurden in der Funktion geändert.

Ein solches Verfahren (Parameter an die Funktion über einen Zeiger Passieren) weit verbreitet in der Programmierung C verwendet. In C ++, verwenden sie zunehmend die Übertragungsparameter in der Link-Funktion. Es gibt keine Notwendigkeit, das dereferenzieren zu verwenden * und unter Adressen & Variablen. Daher ist die Verwendung Pass von Referenz bequemer. Diese Methode werden wir schauen in den folgenden Lektionen.

Machen Sie sich keine Sorgen, wenn etwas nicht klar ist. Sie haben eine Menge neuer Informationen in dieser Lektion – und es ist ganz normal,, dass nicht alles sofort festgenommen. Das Verständnis Zeiger kommt mit der Praxis. Wir werden über Zeiger sprechen in Der zweite Teil dieses Artikels und poreshat Aufgabe. So wird alles in Ordnung sein.

Wenn möglich, das Video über Zeiger (mit einer 12-minütigen):

Parameter (Argumente) Funktion:




Newsletter neue Lektionen über die Programmierung:

9 Gedanken zu "Pointers C ++. Teil 1

  1. Über die 45. Minute der 8. Lektion sagt, dass, wenn Sie die Konstante nicht verwenden Sie, dann für jeden Festspeicher durch neue zuteilen. Aber zu der Zeit, dachte ich,, das der Fall ist eine weitere Variable gelöst.
    int N;
    Gin>>N;
    const int M = N;
    int d[M];

    für (int i = 0;ich!= M;i ++)
    {
    d[ich] = i;
    cout <<d[ich]<<endl;
    }

    Und das habe ich ganz zusammengestellt.

    1. Sie konnten nicht M = N zuweisen, nur schreiben: int d[N].
      Aber das widerspricht nicht, was gesagt wurde nichts – Das Erweiterung Standard C ++, kam aus der Standard-C99 C-Sprache (wie Sie sehen können, all diese Standards sind die letzten Jahre!), und es heißt VLA (Variable Legth Array).
      Diese Erweiterung ermöglicht es Ihnen, zu schaffen lokale innerhalb der Funktion Arrays mit dynamisch bestimmt die Größe. In diesem Fall wird das Array geschaffen der Stapel die aufgerufene Funktion. Im Prinzip, in C die gleiche Sache zu tun, bisher verborgene Art und Weise durch den Aufruf wurde:

      Sie müssen die VLA verwenden, dennoch, vorsichtig:
      – es wird nur dann kompiliert, wenn Sie einen Compiler installiert Option auf neue Standards;
      – Diese Innovation ist eine Menge Kontroversen, und es kann in Zukunft Standards rückgängig gemacht werden.

      1. Vielen Dank für Ihre ausführlichen Erklärungen. Ich gehe davon aus M = N, weil, dass der Autor des Videos gezeigt, sowohl direkt, wenn Sie die const Schlüsselwort nicht, nicht kompiliert. Ich beschloss, sofort zu überprüfen, aber ein wenig anders. übrigens, Compiler für eine lange Zeit, wies ich darauf hin zu ++ 11.

    2. Array nimmt Ihr Gedächtnis, dynamisches Array arbeitet als normale, Jetzt nur der Speicher dann gelöscht, in großen Projekten ist es sehr nützlich,

      1. Es ist sehr zweifelhaft Aussage!
        Ein Array von lokal deklariert (in Funktion) Es ist auf dem Stapel angeordnet und wird durch das Ende der Funktion gelöscht. Vor allem nach der Auflösung effektiv Arrays mit dynamischen Grenzen C ++ 11 Standard.
        Und die Verwendung von dynamisch zugewiesenen Arrays, unter bestimmten Verdienst, Es hat noch mehr Nachteile.

  2. Paradox!!!
    Compiler “Compiler: GNU GCC Compiler” Ich nahm den folgenden Code:

    #einschließen
    #einschließen

    using namespace std;

    int main()
    {
    setlocale(LC_ALL, “Russisch”);

    int SizeOfArray;
    cout << "Сколько чисел вы введёте в массив? " <> SizeOfArray;
    int arrWithDigits[SizeOfArray] = {};

    für (int i = 0; ich < SizeOfArray; i ++)
    {
    cout << ich + 1 <> arrWithDigits[ich];
    }
    cout << endl;

    für (int i = 0; ich < SizeOfArray; i ++)
    {
    cout << setw(3) << arrWithDigits[ich] << " |";
    }
    cout << endl;
    Rückkehr 0;
    }

    Programm, in dem der Arbeits-Code::Block 16.01.
    ————– Bauen: Debug in Zadacha12 (Compiler: GNU GCC Compiler)—————

    mingw32-g ++. exe -Wall -G -c C:\2\codeblocks-16.01\Code\Zadacha12\Zadacha12.cpp -o obj\Debug\Zadacha12.o
    mingw32-g++.exe -o bin\Debug\Zadacha12.exe obj\Debug\Zadacha12.o
    Output file is bin\Debug\Zadacha12.exe with size 1,01 MB
    Prozess mit Status beendet 0 (0 Minute(s), 0 zweite(s))
    0 Fehler(s), 0 Warnung(s) (0 Minute(s), 0 zweite(s))

    1. Das Paradoxe ist, was?
      GCC-Compiler ist viel perfekter als der Compiler von Microsoft, und viel genauer in der Syntax entspricht die C ++ Sprache.

Hinterlasse eine Antwort

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