[Verständnisfrage] Pointer

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • [Verständnisfrage] Pointer

    Guten Abend EC,

    vielleicht gibt es dieses Thema in der Suchfunktion. Wenn ja, tut es mir leid, aber dennoch würde es mir nicht weiterhelfen, denn ich möchte
    von euch wissen, ob ich das Thema Pointer richtig verstanden habe.

    Ich programmiere jetzt schon eine Weile mit C#. Nicht hochtechnisches und aufwendiges und vor dem Thema Pointer hab ich mich stets gut gedrückt.
    Doch nun wollte ich mich noch mal aus "just for fun" in die Basics von C++ ein lesen und komme auf das Thema.

    Nun gut. Back to topic...

    Zeiger sind nichts anderes als die "Verlinkung" zum Speicher. Kurz gefasst und eigentlich simpel. Nur stell ich mir die Frage wozu?
    Wenn ich es richtig verstanden habe, ist der Zweck OOP? Wenn ich einen Code von 50 Zeilen habe, in dem eine Variable zig mal vorkommt, benutze ich den Pointer.
    Wenn nun Veränderungen an der Variable (nicht die Pointervariable !) auftauchen, muss ich nur an der "normalen" Variable etwas verändern.

    Eigentlich vergleichbar mit #define?

    Ist das so richtig? Wenn nicht, warum?

    Mit freundlichen Grüßen

    Sheldon
  • OOP hat hiermit nix zu tun.

    Wie du schon gesagt hast ist ein Pointer nichts anderes wie ein Zeiger auf eine Addresse im Speicher und ist mit der Präprozessorderektive #define nicht zu vergleichen, dass sind zwei verschieden paar Schuhe.

    Pointer kann man zu vielem verwenden.
    - Interpretieren des selben Speicherereichs als verschiedenen Typ (Bsp: 4*char <-> integer <-> 2*short)
    - Zum Üergeben einer Pointervariable an Funktionen und Klassen, was sich bei größeren Strukturen als Ressourcenschonend erweisst, da keine Kopie erstellt wird sonder nur ein Zeiger auf das Objekt
    - Verwalten eines dynamisch angefordeten Speicherbereichs dessen größe erst zur Leufzeit bestimmt werdenn kann
    - Anwenden von Kompressions-, Verschlüsselungs- und anderen Algorithmen mittels Zeigern auf einen Datenblock

    Mfg Rushh0ur
  • Vielen Dank schon mal.

    Rushh0ur schrieb:

    OOP hat hiermit nix zu tun.


    Ist OOP wirklich so falsch? Im Grunde kann ich doch einfach die Hauptstruktur des Quellcodes (inklusive Pointervariable) belassen und die Daten im Speicher verändern?
    Oder geht das nicht, weil ich ja nicht weiss wo die Daten im Speicher abgespeichert werden. ? Ist das nicht der Zweck objekt orientiert zu programmieren. Jeden Quelltext
    auf jegliches Objekt übertragen zu können ohne aufwendige Veränderungsarbeit zu leisten?

    Rushh0ur schrieb:

    Wie du schon gesagt hast ist ein Pointer nichts anderes wie ein Zeiger auf eine Addresse im Speicher und ist mit der Präprozessorderektive #define nicht zu vergleichen, dass sind zwei verschieden paar Schuhe.


    Sorry, stimmt, das war von mir ein völlig falsche Ansicht. Brainafk

    Rushh0ur schrieb:

    Pointer kann man zu vielem verwenden.
    - Interpretieren des selben Speicherereichs als verschiedenen Typ (Bsp: 4*char <-> integer <-> 2*short)
    - Zum Üergeben einer Pointervariable an Funktionen und Klassen, was sich bei größeren Strukturen als Ressourcenschonend erweisst, da keine Kopie erstellt wird sonder nur ein Zeiger auf das Objekt
    - Verwalten eines dynamisch angefordeten Speicherbereichs dessen größe erst zur Leufzeit bestimmt werdenn kann
    - Anwenden von Kompressions-, Verschlüsselungs- und anderen Algorithmen mittels Zeigern auf einen Datenblock


    Punkt 1 verstehe ich rein gar nicht.

    Punkt 2. Pointer dienen also auch der Überschaubarkeit des Codes? Du meinst also, dass nicht jedesmal die Funktion oder Klasse neu kopiert werden muss, sondern nur die Pointervariable?

    Punkt 3 verstehe ich auch nicht.

    Punkt 4. Darüber werde ich bestimmt noch einiges Lesen und ist glaub ich noch zu früh.

    Mit freundlichen Grüßen

    Sheldon
  • Objektorientierte Programmierung heist nicht, dass man Pointer verwenden muss, man kann objektorientiert programmieren auch ohne Pointer.

    Bei OOP werden logische Verknüpufngen in Objekten mit gleichen oder ähnlichen Eigenschaften zussamengefasst. Oft ist es so, dass durch solch eine Kapselung mehrerer Eigenschaften in einem Objekt, der Speicherverbrauch steigt
    und um ein unnötiges Kopieren dieser Objekte zu verhinden, was ja auch Speicherbenötigt, wird einfach ein Pointer auf das Original-Objekt erstellt, welcher relativ nur wenig Speicher brauch.

    Beispiel:
    Ein Objekt Auto mit den Eigenschaften Farbe, Gewicht, Model, Tankkapazität (l), Tankfüllstand (l), Kilometerstand soll an eine Funktion übergeben werden, welche den aktuellen Tankfüllstand in Prozent ausrechnen soll.
    Macht man dies auf die gewöhnliche Art wird von dem Objekt eine Kopie erstellt und an die Funktion übergeben; Rechnet man hier mit 4 Byte pro Eigenschaft währen dies 24Bytes von dennen eine Kopie erstellt werden müsste.
    Geht man hingegen hin und Zeigt mittels Pointer auf das ursprüngliche Objekt braucht man nur 4Byte zu kopieren, denn ein Pointer braucht nur 4Byte (32Bit-System): Einsparung: 20Bytes (~80%).


    - Interpretieren des selben Speicherbereichs als verschiedenen Typ


    Beispiel: Farbmischung 32Bit (8Bit -> unsigned char -> Wertebereich 0..255) (32Bit -> unsigned int -> Wertebereich 0..4294967295)

    Quellcode

    1. Byteweise:
    2. -> Rot (8Bit) = 0 (dec) = 0x00 (hex)
    3. -> Grün (8Bit) = 127 (dec) = 0x7F (hex)
    4. -> Blau (8Bit) = 255 (dec) = 0xFF (hex)
    5. -> Alpha (8Bit) = 255 (dec) = 0xFF (hex)
    6. Integerweise:
    7. -> RGBA (32Bit) = 8388607 (dec) = 0x007FFFFF (hex)
    8. -> Beide Arten repräsentieren die selben Daten



    - Verwalten eines dynamisch angefordeten Speicherbereichs dessen größe erst zur Leufzeit bestimmt werdenn kann

    Beispiel:
    Ein Benutzer bestimmt welche Dimensionen zwei Matritzen, die mit einander Multiplitziert werden sollen, haben: die größe dieser Matritzen wird erst zur Laufzeit festgestellt.
    Es würde keinen Sinn machen, übertrieben gesagt, eine 2D-Array mit der größe 10000*10000 zu erstellen, damit könnte man sagen, dass jede Benutzereingabe sicher bearbeitet werden könne, jedoch wird nicht jedes System den benötigten Speicher für diese Matrixgröße aufweissen.
    Genauso kann man auch nicht sagen man nehme ein 3x3 Feld, der grund sollte klar sein.
    Deswegen wird der speicher dynamsich zur Laufzeit vom Betriebsystem angefordert, die Rückgabe ist ein Pointer auf das erste Element, bzw. bei einem Fehler entweder eine exception oder NULL, wenn zB der angeforderte Speicher vom System nicht zur verfügung gestellt werden kann.
    Der angeforderte Speicher muss wenn er nicht mehr benötigt wird wieder freigegeben werden, damit andere "Programme" diesen wieder verwenden können.

    Mfg Rushh0ur

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Rushh0ur ()

  • Rushh0ur schrieb:

    Bei OOP werden logische Verknüpufngen in Objekten mit gleichen oder ähnlichen Eigenschaften zussamengefasst. Oft ist es so, dass durch solch eine Kapselung mehrerer Eigenschaften in einem Objekt, der Speicherverbrauch steigt
    und um ein unnötiges Kopieren dieser Objekte zu verhinden, was ja auch Speicherbenötigt, wird einfach ein Pointer auf das Original-Objekt erstellt, welcher relativ nur wenig Speicher brauch.

    Man muss nicht unbedingt Pointer verwenden, aber wie du selbst sagt, dient es der OOP.

    Rushh0ur schrieb:

    Beispiel:
    Ein Objekt Auto mit den Eigenschaften Farbe, Gewicht, Model, Tankkapazität (l), Tankfüllstand (l), Kilometerstand soll an eine Funktion übergeben werden, welche den aktuellen Tankfüllstand in Prozent ausrechnen soll.
    Macht man dies auf die gewöhnliche Art wird von dem Objekt eine Kopie erstellt und an die Funktion übergeben; Rechnet man hier mit 4 Byte pro Eigenschaft währen dies 24Bytes von dennen eine Kopie erstellt werden müsste.
    Geht man hingegen hin und Zeigt mittels Pointer auf das ursprüngliche Objekt braucht man nur 4Byte zu kopieren, denn ein Pointer braucht nur 4Byte (32Bit-System): Einsparung: 20Bytes (~80%).

    Praxisnahe Erklärung. Perfekt! Vielen Dank.

    Mit freundlichen Grüßen

    Sheldon