Ergebnis 1 bis 14 von 14

Thema: Verwendung von Pointern/Zeigern!?

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    @ MagicMagor: wow, jetzt hab ich einiges verstanden! Ich dank dir wie verrückt
    Besonders die Sache mit dem Char-Array und Char-Pointer, das war die Sache die mich die letzten Tage beschäftigt hat und siehe da: Antwort erhalten

    Schüssikowski
    elsen

  2. #2
    Das man alles ohne Pointer erledigen kann, halte ich für eine Fehlinformation sondergleichen. Such dir dringend andere Informationsquellen, als diesen Thread hier.


    Es fehlen hier eigentlich noch einige wichtige Anwendungsgebiete, wie zum Beispiel funktionszeiger. Eigentlich wäre ganz C ohne Pointer ziemlich nutzlos: Wie sollte man denn ohne Zeiger auf Hardware eines Computers, oder prozessorinterne Register (Temparatur, Watchdog, IRQ, die Ringe, und was weiß ich noch alles) zugreifen?

    Sonst haben wir ja noch die klassischen komplexen Datentypen: Denke mal an einen Stack:

    0 (irgendwas im Speicher)
    1 (irgendwas im Speicher)
    5 (irgendwas im Speicher)
    3<- oberster Eintrag
    4 (irgendwas im Speicher)
    6 (irgendwas im Speicher)
    5 (irgendwas im Speicher)
    7<- Startadresse
    0 (irgendwas im Speicher)
    1 (irgendwas im Speicher)


    Pointer sind toll und das Grundelement einer brauchbaren Sprache. Man sieht ja bei Java was passiert, wenn man keine Pointer und ordentliches Constantness hat.

  3. #3
    Zitat Zitat
    Das man alles ohne Pointer erledigen kann, halte ich für eine Fehlinformation sondergleichen. Such dir dringend andere Informationsquellen, als diesen Thread hier.
    Ich habe gestern mit meinem Schwager sprechen können, der Technische Informatik studiert hat und seit Anfang des Jahres arbeitet und wie es aussieht... hast du vollkommen Recht!!
    Jedoch ist es trotzdem gut, weitere Anwendungsbeispiele niederzuschreiben und den riesen Irrtum, dass Pointer unnütz sind, hat man hier ja erfolgreich beiseite geschafft

    also wer noch was weiß, immer her damit xD

    Schüssikowski
    elsen

  4. #4
    Sinnlos sind Zeiger natürlich nicht. Manche Sprachen nehmen dem Programmierer allerdings das Arbeiten mit Zeigern ab. In manchen Programmiersprachen kommt man also sehr gut ohne Zeiger zurecht (die Sprache selbst nutzt dann intern Zeiger, der Programmierer merkt davon nichts), bei einer Sprache wie C ist der Einsatz von Zeiger jedoch an vielen Stellen notwendig.

    Unser Arbeitsspeicher besteht ja gewissermaßen aus Byte-Zellen, die sich adressieren lassen. Wenn die CPU eine Speicherzelle ansprechen möchte, muss sie deren Adresse kennen. Im Prinzip benutzt die CPU also bei jedem Befehl einen Zeiger, denn der Befehl muss erstmal aus dem Arbeitsspeicher geholt werden. Wenn der Befehl dann noch Daten aus dem Arbeitsspeicher braucht, wird wieder ein Zeiger verwendet.
    Zeiger sind für die Arbeit eines Computers also essentiell. Auch C-Variablen sind eigentlich nur Zeiger. Eine Zuweisung der Art a = 5;, wird vom Compiler z.B. so übersetzt (wenn a an der Adresse 0x402000 liegt): mov dword [0x402000],5.
    Das bedeutet eigentlich nur: Schreibe den 32bit-Wert 5 an die Adresse 0x402000. Die Adresse 0x402000 ist hier also der Zeiger (sie zeigt auf den Speicherbereich, den wir als Variable a definiert haben).

    Bei den normalen Variablen-Typen in C, nimmt uns der Compiler die Arbeit also gut ab und bei solchen Variablen ist das direkte Anwenden von C-Zeigern meistens nicht notwendig (sofern die Variablen einzeln verwendet werden). Anders sieht das bei Speicherbereichen aus, die größer als 4 Byte sind (ich rede von 32bit PCs).
    Die bereits genannten Zeichenketten sind da nur ein Beispiel, aber auch jede andere Art von Daten, die mehr als 4 Byte benötigt (z.B. Arrays, größere Datenblöcke von Strukturen oder jegliche Art von Rohdaten wie Bilder, Musik, etc.), wird von einem C-Programmierer in der Regel mit Zeigern angesprochen.

    Ein richtiges Verständnis für Zeiger entwickelt sich wohl erst, wenn man mit diesen arbeitet oder wenn man Assembler lernt. Was du nun genau unter Anwendungsbeispielen verstehst, ist mir nicht genau klar. Eigentlich jedes größere und halbwegs sinnvolle C-Programm nutzt Zeiger.

    freundliche Grüße, Rolus

  5. #5
    Zitat Zitat von Mog Beitrag anzeigen
    Pointer sind toll und das Grundelement einer brauchbaren Sprache. Man sieht ja bei Java was passiert, wenn man keine Pointer und ordentliches Constantness hat.
    Java mag keine Pointer im Sinne von C++ haben, jedoch sind
    die Referenzen vom Konzept her equivalent.
    Wer nun unbedingt Sachen wie eine verlinkte Liste haben möchte,
    der findet dafür immerhin eine eigene Collection. Nur so als Beispiel.

    Du verschweigst außerdem das Pointer "mal eben" für einige
    große Programmierfehler die Quelle sind. Die sich dann meist
    auch noch schlecht nachvollziehen lassen. Pointer sind also
    kein allheiliges Wundermittel.

    Aber mal nebenbei: Was sieht man denn bei Java? Mich würde
    da irgendwo deine Meinung mal interessieren. Mal schauen ob
    du nur ein C++ Narr bist der gegen Java wettert oder ob du
    wirklich so etwas wie sinnige Argumente hast.

  6. #6
    folgendes steht im Wikipedia-Artikel von Java:
    Zitat Zitat
    Der Objektzugriff in Java ist über Referenzen implementiert. Aus Sicherheitsgründen ist es nicht möglich, deren Speicheradresse zu modifizieren. So genannte Zeigerarithmetik ist mit der Sprache also ausgeschlossen. Per Design können so Fehler, welche häufig in anderen Programmiersprachen auftreten, von vornherein ausgeschlossen werden.
    mich interessiert das "aus Sicherheitsgründen"! Ist das "nur" auf die in anderen Programmiersprachen auftretenden Fehler, welche da angesprochen werden, bezogen oder gibts da noch speziell für Java zutreffende Gründe?

    nur so btw...

  7. #7
    Zitat Zitat von elsen Beitrag anzeigen
    folgendes steht im Wikipedia-Artikel von Java:

    mich interessiert das "aus Sicherheitsgründen"! Ist das "nur" auf die in anderen Programmiersprachen auftretenden Fehler, welche da angesprochen werden, bezogen oder gibts da noch speziell für Java zutreffende Gründe?

    nur so btw...
    Java wurde so entworfen, dass es simpel und trotzdem einigermaßen mächtig sein sollte. Daher wurden Zeiger anders implementiert, nämlich als Referenzen. Diese Referenzen können nicht verändert werden, um zu verhindern, dass sie auf fehlerhafte oder geschützte Speicherbereiche verweisen und das Programm damit zum Absturz bringen.
    Der häufigste Fehler bei Pointern dürfte nämlich der sein, dass man mit dem Freimachen, verschieben und löschen von Speicherstellen und Pointer auf diese einen Fehler einbaut, der zumeist zum Absturz führt. Und diese Fehler sind dann nicht immer leicht zu finden, weil es in der Regel Laufzeitfehler sind, die manchmal nicht reproduzierbar sind, weil sie nur zu ganz bestimmten Konstellationen auftreten (z.B. wenn Speicherbereich X gerade mit Wert Y belegt ist und Programm Z darauf zugreift, das eigene Programm diesen Bereich aber anders belegen will)
    Um solche Fehler zu vermeiden gibt es keine echten Pointer in Java sondern nur die Referenzen, die weniger mächtig sind, aber nach einem ähnlichen Prinzip arbeiten.

    In Java wirst du es öffters antreffen, dass gewisse Dinge nicht machbar sind. Beispielsweise per Applet Dateien auf dem Client-System verändern geht nicht. Das hat auch wieder Sicherheitsgründe, damit Java nicht zur Programmierung von schädlicher Software eingesetzt wird, die dir beim laden einer Website plötzlich die Platte formatiert oder sonstige Sachen anrichtet. Andere Formate wie ActiveX haben die Möglichkeit, Daten zu ändern. Dies stellt ein erhebliches Risiko dar, dafür ist es in diesem Punkt aber auch mächtiger in den Möglichkeiten als eben Java. Nach dem gleichen Prinzip werden dir noch ein paar Dinge unterkommen, die Java aus Sicherheitsgründen nicht unterstützt.

    Zitat Zitat
    Wer nun unbedingt Sachen wie eine verlinkte Liste haben möchte,
    der findet dafür immerhin eine eigene Collection.
    Eine LinkedList ist doch auch in Java kein Thema - eine Referenz übernimmt den Verweis auf das vorherige bzw nächste Element der Liste und schon hast du die Möglichkeit die Liste zu durchlaufen und dynamisch hinzuzufügen. Dafür braucht man keine Pointer.

    Geändert von Ynnus (24.08.2008 um 07:34 Uhr)

Berechtigungen

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