PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Verwendung von Pointern/Zeigern!?



elsen
11.08.2008, 21:10
Für alle die Ahnung im Umgang mit sogenannten Pointern/Zeigern haben!

Ich lerne gerade C und dabei habe ich auch den Umgang mit Pointern gelernt, allerdings fällt mir kein Verwendungszweck dafür ein...
Folgendes: Ich bitte einfach mal darum zusammen zu tragen, wo man Pointer einsetzt! Desweiteren vllt Tipps im Umgang mit Pointern, soweit es welche dazu gibt ;D

Schüssikowski
elsen

The Best Isaac
11.08.2008, 21:29
Wieso willst du etwas anwenden, von dem du nicht weißt, wofür du es benutzen könntest/solltest? Das ergibt doch keinen Sinn? Wenn du, wie du sagst, weißt, wie sie funktionieren, sollte dir im Bedarfsfall sowieso ein Verwendungszweck einfallen.

Generell ist es nicht ganz einfach und ich manchen Fällen sogar gefährlich (wenn man eben etwas falsch macht) mit Zeigern zu arbeiten. Ich würde nicht unbedingt dazu raten.
Zeiger sind nichts, was du unbedingt bräuchtest, man kann auch alles ohne schaffen.

Kannst dir ja mal die Vor- und Nachteile im Wikipedia-Artikel durchlesen, ist meiner Meinung nach sehr hilfreich.

http://de.wikipedia.org/wiki/Zeiger_%28Informatik%29

elsen
11.08.2008, 21:43
Den Wikipedia-artikel hab ich schon mal gelesen...

Zeiger sind nichts, was du unbedingt bräuchtest, man kann auch alles ohne schaffen.
Das ist doch der Punkt... wenn man alles ohne schaffen kann, wofür sind sie dann gedacht? (mag eine dumme Frage sein, aber deshalb stell ich sie ja)
Ich will auch nicht den Umgang mit Pointern sondern lediglich einige Verwendungsbeispiele genannt haben... (jaa "The Best Isaac", das hattest du auch nicht gesagt, schon klar^^, sag ja nur..)

The Best Isaac
11.08.2008, 22:20
wofür sind sie dann gedacht?
Wie ja schon unter Vorteile im Wikiartikel zu lesen ist:
"Die Verwendung von Zeigern kann in bestimmten Fällen den Programmablauf beschleunigen oder helfen, Speicherplatz zu sparen."

Konkrete Verwendungsbeispiele hab ich nicht genannt, weil ich keine kenne. Hab noch nie mit C programmiert und auch so noch keinen wirklichen Kontakt mit Zeigern gehabt.
Mir ging es halt eher darum, dass ich deine Frage halt irgendwie unsinnig fand. Warum, hatte ich ja schon gesagt.

Ich weiß jetzt auch nicht, wie weit du schon bist, in C. Du schreibst ja, dass du es gerade lernst. Solltest du allerdings noch Anfänger sein, würde ich sowieso Abstand von Zeigern nehmen.

Aber naja, kann mir auch egal sein.

Hier gibt es sicherlich welche, die dir einige Verwendungszwecke nennen können. Daher halte ich lieber meine Klappe, weil so richtig auskennen tu ich mich ja doch nicht, was Pointer angeht. xD

Manuel
11.08.2008, 22:20
Du hast Glück, vor nicht allzu langer Zeit musste ich ebenfalls diese IMHO dämlichen Pointer in C anwenden.

Folgendes Beispiel hat mich dazu gebracht, Pointer wirklich zu verstehen:
http://home.fhtw-berlin.de/~junghans/cref/EXAMPLES/linklst1.c

Ein ganz allgemeiner Verwendungszweck: Du kannst dir jederzeit zusätzlichen Speicher abzwacken, wenn du ihn brauchst (anstatt von vornherein zig Speicherstellen zu belegen). Einfaches Beispiel: Ein Adressbuch, was nur soviel Speicher braucht, wie viele Einträge im Adressbuch vorhanden sind.

Pointer sind allerdings etwas tückisch: Gerade mit denen entstehen sog. Speicherleks, wenn du z.B. beim Löschen bestimmte Speicherstellen vergisst. Ein gutes Programm sollte (O-Ton meines Ausbilders) beim Beenden JEDE Speicherstelle, die per Pointer allociert wurde, wieder löschen.

elsen
11.08.2008, 22:47
@ The best Isaac: Dann wär die Sache ja gegessen ;D dank dir trotzdem!

@ Manuel: Dein Post war wirklich sehr hilfreich, thx a lot...:A

N8 allerseits
elsen

MagicMagor
12.08.2008, 09:20
Zeiger sind sehr mächtig und ein sehr wichtiges Werkzeug für Programmierer. Da sie allerdings auch sehr gefährlich sind und leicht Speicherlecks verursachen verstecken viele Sprachen die Zeiger vor dem Programmierer, der dann gar nicht merkt, das er im Grunde gerade mit einem Zeiger arbeitet.
Du wirst an vielen Stellen Zeigern begegnen, auch wenn dir das nicht so erscheint.
In C gibt es nicht soviele Beispiele dafür, zwei die mir spontan einfallen sind Strings und Arrays.
In C gibt es keinen eigenen Datentyp für Zeichenketten, C kennt nur den Datentyp Char. Um eine Zeichenkette zu realisieren verwendet man als Programmierer daher häufig einen Char-Pointer/Zeiger oder ein Char-Array. Das Array hat den Nachteil, daß ich genau wissen muss wieviele Zeichen ich in meiner Zeichenkette haben muss um genau soviel Speicher zu reservieren.
Wenn ich diesen String aber zB. nutzen will um eine Eingabe von aussen zu speichern (bspw. einen Befehl von der Kommandozeile) kriege ich damit Probleme. Entweder ich kann den ganzen Befehl nicht speichern oder ich verbrauche mehr Platz als ich eigentlich brauche.
Über einen Char-Pointer kann ich beliebig lange Zeichenketten "in" meiner Variable speichern. Das Ende des Strings wird dabei durch ein 0-Byte dargestellt.

Arrays sind ein weiteres Phänomen, wo im Grund Zeiger verwendet werden, ohne daß man es merkt. Wenn du ein Array von 10.000 Integern anlegst erscheint dir das wie eine Variable, die einen entsprechend großen Block Speicher belegt. Problem dabei ist, daß nicht unbedingt 40k Byte an Speicher an einem Stück gerade frei sind.
Tatsächlich ist deine Array-Variable ein Zeiger vom Typ Integer auf den ersten Wert des Arrays. Wenn du nun auf den i-ten Wert deines Arrays zugreifst wird einfache Zeigerarithmetik angewendet und der Zeiger springt eben um i*4byte weiter. (Sollte diese Speicherstelle aber nicht frei sein und daher nicht zum Array gehören wird der Zeiger vermutlich vom Betriebssystem an die richtige Speicherstelle umgeleitet)
In Objektorientierten Sprachen sind auch Objektvariablen nichts weiter als Zeiger auf die Datenstruktur im Speicher, welche das Objekt darstellt.
Im Grunde genommen läßt sich alles ohne Zeiger theoretisch realisieren, praktisch kannst du mit Zeigern aber Datenstrukturen erstellen die intern einen viel komplexeren Aufbau haben als nur ein einfacher Integer oder Char-wert, von aussen aber wie eine normale Variable behandelt werden können. Wann immer du etwas abspeicherst, was nicht ein Char, ein Integer, ein Float oder ein Bool ist, verwendest du Zeiger.

elsen
13.08.2008, 12:24
@ 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 :D

Schüssikowski
elsen

Mog
17.08.2008, 23:03
Das man alles ohne Pointer erledigen kann, halte ich für eine Fehlinformation sondergleichen. :rolleyes: 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. ;)

elsen
18.08.2008, 08:58
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 :p

also wer noch was weiß, immer her damit xD

Schüssikowski
elsen

Rolus
18.08.2008, 13:16
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

makenshi
23.08.2008, 21:14
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.

elsen
23.08.2008, 21:50
folgendes steht im Wikipedia-Artikel von Java:

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...

Ynnus
24.08.2008, 07:28
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.


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.