- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 6 von 6

Thema: Fragen zu Zeigern, Adressen und Operatoren (*, &, ->)

  1. #1
    sineP
    Gast

    Fragen zu Zeigern, Adressen und Operatoren (*, &, ->)

    Anzeige

    Praxistest und DIY Projekte
    Hallo, ich habe eine Frage zu Zeigern:
    und zwar geht es darum, Werte von Zeigern zu übergeben und Adressen zu übergeben. Ich bin mir bei der Sache nicht 100% im klaren. Es wäre also sehr nett von euch, wenn jemand mitteilen kann, ob mein Wissen so korrekt ist, oder ob ich da ein Fehler mache bzw. was falsch verstehe.

    Beispiel 1:

    zeiger1 = zeiger2;
    Da kein Dereferenzierungsoperator angegeben ist, wird die Adresse von zeiger2 an zeiger1 übergeben. Das heißt: Ändere ich etwas an Zeiger 1, wird dies auch beim original (zeiger2) geschehen, da ja beide die gleiche Adresse haben.
    So weit richtig?

    Beispiel 2:
    (*zeiger1).wert = 20;
    Durch den Dereferenzierungsoperator, wird der Wert "wert" von zeiger1 verändert bzw. auf 20 geändert.
    Alternativ geht auch:
    zeiger1->wert = 20;
    richtig?

    Beispiel3:

    zeiger1 = &variable;
    Der &-Operator vor der variable, gibt an, das mit der Adresse gearbeitet werden soll statt mit dem Wert der Variablen. Dem zeiger1 wird also die Adresse der Variablen "variable" übergeben. Man kann jetzt z.B. werte ausgeben oder verändern:
    (*zeiger1) = 20
    Gibt es hier eigentlich auch eine alternative wie z.B. weiter oben unter Beispiel 2 mit dem -> Operator? so funktionierts nämlich nicht:
    zeiger1-> = 20;

    Soweit alles richtig? Gibt es noch andere Möglichkeiten?

    vielen Dank!

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    66
    Beiträge
    2.435
    Hallo,

    Da hast da etwas grundlegend noch nicht verstanden, aber aller Anfang ist schwer!

    Damit man irgendetwas im Speicher ablegen kann, braucht man dazu einen Speicherplatz.
    Technisch wird dieser über seine Speicheradresse angesprochen.
    Programmiersprachen sind nun aber für Menschen gemacht und da ist es einfacher eine Variable mit einem Namen anzusprechen. Wo diese Variable versteckt wird, ist dir als Programmierer meistens egal.
    In manchen Fällen ist es aber besser mit der Speicheradresse zu arbeiten.

    Hier hat es auch eine hübsche Graphik, welche zeigt wie das im Speicher aussieht:
    http://www.peacesoftware.de/ckurs12.html

    MfG Peter(TOO)
    Manchmal frage ich mich, wieso meine Generation Geräte ohne Simulation entwickeln konnte?

  3. #3
    Unregistriert
    Gast
    zunächst fehlen in allen deinen Beispielen sämtliche Variablen-Definitionen (nicht nur für die Pointer), und außerdem sehe ich nirgends, ob du von ANSI C oder C++ in ggf. welcher Version du sprichst (ANSI C99? C++11? C++14?) - von daher führen deine Beispiele zunächst sowieso komplett ins Leere.
    Andererseits habe ich zumindest in ANSI C so etwas wie dies
    (*zeiger1).wert = 20;
    noch nie gesehen.

  4. #4
    sineP
    Gast
    Hallo und danke für die Antworten.
    Ich arbeite mit C++11

    Muss ich, um etwas in einen Speicher abzulegen zuerst mit new einen Speicher reservieren? Beispiel anhand einer Struktur und einem Pointer:

    struct typ
    {
    int t1;
    int t2;
    } structvar;

    1. Jetzt könnte ich t1 einen Wert zu weisen ohne mit "new" Speicher zu reservieren:
    structvar->t1 = 10;

    2. Ich könnte es aber auch anders machen und mit new vorher Speicher reservieren:
    structvar = new(typ);
    structvar->t1 = 10;

    Wer kann mir genau erklären was genau in den Anweisungen passiert?
    Wird unter 1 automatisch Speicher reserviert, und bei 2. geschieht dies manuell? Warum muss man denn mit new vorher Speicher reservieren, wenn es automatissch geschieht?

    Danke!!

    - - - Aktualisiert - - -

    sorry, ich habe das Sternchen bei "} structvar;" vergessen. So meinte ich das:
    ...
    } *structvar;

    (also ein Zeiger)

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    13.01.2014
    Beiträge
    454
    Blog-Einträge
    3
    Gegeben:
    Code:
    struct typ
    {
    int t1;
    int t2;
    } *structvar;
    Gleichwertig mit:
    Code:
    struct typ
    {
    int t1;
    int t2;
    }; // Typdefinition
    typ *structvar; // Reservierung Speicher für Zeiger
    Weiter mit Variante 1:
    Es wird eine Operation auf structvar ausgeführt. Da der Kompiler merkt, dass die Variable benutzt werden soll, wird sie im Stack angelegt.
    Code:
    structvar->t1 = 10; // Operation auf structvar
    Variante 2:
    Durch das Schlüsselwort 'new' wird Speicher im Heap reserviert. In diesem wird dann die Zuweisungsoperation ausgeführt.
    Code:
    structvar = new(typ);
    structvar->t1 = 10;
    Geändert von Sisor (02.01.2017 um 22:56 Uhr)

  6. #6
    Hallo Sisor,

    zu deinem ersten Beitrag:
    1. richtig
    2. richtig
    3. richtig, wenn du kein * benutzen willst könntest du auch zeiger[0] = 20 schreiben. Das ist aber eher unsauber und verwirrt nur den Quellcodeleser

    Dein anderer Beitrag ist etwas wirr... google mal reservierter Speicher, heap und stack...

    VG

    Basti

Ähnliche Themen

  1. I2C Adressen
    Von oderlachs im Forum C - Programmierung (GCC u.a.)
    Antworten: 27
    Letzter Beitrag: 29.06.2013, 17:34
  2. Bitweise Operatoren in SwitchTest() Funktion
    Von Swordfish6 im Forum Asuro
    Antworten: 3
    Letzter Beitrag: 14.11.2012, 15:31
  3. Bootloader Adressen
    Von geronet im Forum AVR Hardwarethemen
    Antworten: 1
    Letzter Beitrag: 10.02.2007, 21:27
  4. Operatoren frage
    Von shamanu im Forum C - Programmierung (GCC u.a.)
    Antworten: 4
    Letzter Beitrag: 07.02.2006, 17:42
  5. logische Operatoren
    Von recycle im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 1
    Letzter Beitrag: 29.03.2004, 10:45

Benutzer, die dieses Thema gelesen haben: 0

Derzeit gibt es keine Benutzer zum Anzeigen.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress