Diskussion:Zeiger (Informatik)

aus Wikipedia, der freien Enzyklopädie
Wechseln zu: Navigation, Suche

Programmbeispiel[Bearbeiten]

Was soll das Programmbeispiel aussagen? Und wo werden da Zeiger benutzt? --RokerHRO 18:22, 20. Dez 2004 (CET)

bitte auch noch ein Beispiel in der Programmiersprache C einfügen --Raymond83 22:47, 28. Jan 2005 (CET)

Überarbeitung am 30.1.2005[Bearbeiten]

Ich wollte meine Änderungen von gerade kurz kommentieren:

  • (1) Ich habe Delphi gerade aus dem ersten Abschnitt über maschinennahe Programmiersprachen herausgenommen, weil die Sprache zwar wüste Zeigeroperationen ermöglicht, aber dies im Gegensatz zu Assembler/C/C++ nicht der Normalfall ist. Erst recht ist damit keine Zeigerarithmetik im engeren Sinn möglich (außer durch wüste Typumwandlungen).
  • (2) Die Verwendung von Zeigern (die sogenannte Zeigerarithmetik), kann in bestimmten Fällen den Programmablauf beschleunigen habe ich herausgenommen, weil das eher ein Sonderfall ist.
  • (3) Ein gerne genutzter Trick in der Programmierung ist es, auch mittels Zeigerinkrement durch ein Feld hindurchzulaufen. Anstatt einen Index zu verwenden und so die Feldelemente über diesen anzusprechen, setzt man zu Beginn des Ablaufs einen Zeiger auf den Anfang des Feldes und inkrementiert diesen Zeiger bei jedem Durchlauf.
Das ist kein Trick, sondern das, was der Compiler sowieso intern erzeugt, wenn man die Feldelemente über den Index anspricht.
  • (4) Bei der Verwendung von Feldern/Vektoren kann man mittels Zeigern schnell innerhalb des Feldes springen und navigieren.
    s.o.
  • (5) Das Java-Beispiel ist sehr kompliziert, aber undokumentiert und daher nutzlos. Ich habe es nur drinnengelassen, weil ich auf die schnelle nichts besseres hatte.

Mh 12:33, 30. Jan 2005 (CET)

(zu Punkt 1) Ich sehe nicht, wo da der wesentliche Unterschied zwischen Delphi und C++ sein soll.
(Der vorstehende Beitrag stammt von Snert – 12.2.2005, 17:02 (MEZ) – und wurde nachträglich unterschrieben.)
Dann lern' doch einfach mal Delphi (oder eine andere Hochsprache) ;-) . Der wesentliche Unterschied ist im Kern, daß eine Hochsprache Zeigeroperationen teilweise oder vollständig verbirgt. Mh 22:55, 3. Mai 2005 (CEST)
(zu Punkt 2) Das ist kein Sonderfall, sondern eine verbreitete Technik.
(Der vorstehende Beitrag stammt von Snert – 12.2.2005, 17:02 (MEZ) – und wurde nachträglich unterschrieben.)
In maschinennahen Programmiersprachen, die aber nicht der allgemeine Fall sind. Schön, daß wir da also einer Meinung sind. Mh 22:55, 3. Mai 2005 (CEST)
(zu Punkt 3) Was ein Compiler intern erzeugt, ist von Compiler zu Compiler verschieden. Deshalb ist die beschriebene Technik ein gern genutzter Trick in der Programmierung.
(Der vorstehende Beitrag stammt von Snert – 12.2.2005, 17:02 (MEZ) – und wurde nachträglich unterschrieben.)
Das ist Blödsinn. Entweder unterstützt die Sprache das (z. B. in C, wo es für viele Fälle keine Alternative zu Pointerarithmetik gibt) oder sie unterstützt es nicht (z. B. Java, Pascal, LISP, ...). Und in letzterem Fall ist es je nach Sprache schwierig oder unmöglich und außerdem meist unsinnig. Mh 22:55, 3. Mai 2005 (CEST)
Nicht immer nur auf die PC Technik schauen. Im Embedded Bereich kenne ich persönlich etliche Firmen, die die Verwendung von Indizes verbieten. Und nur aus dem Grund, weil die eingesetzten Compiler Zeiger effizienter umsetzen. schlupp2002 15:08, 1. November 2006 (CET)
Also http://www.amd.com/us-en/assets/content_type/white_papers_and_tech_docs/40546.pdf sagt: Man möge die array Schreibweise (a[i]) gegenüber der pointer Schreibweise (*(a+1)) bevorzugen weil die modernen Compiler ersteres besser optimieren können. Für mich klingt es logisch zunächst so zu schreiben das es der Compiler (und auch ein Leser) gut versteht und man erst dann, wenns ums Eingemachte geht (wenn man mit Profilern die entsprechende Stelle als bottleneck erkannt hat) die H4X0r Skills drauf loslässt und kryptischen Zeug schreibt um evtl. die letzten paar Prozent rauszukitzeln. Kurz gesagt: nur in extrem optimiertem Code hat Zeigerarithmetik oder gar asm() was zu suchen. Heute sind die Compiler meistens besser als wir selber, ja auch besser als die erfahrenen Leute (Bsp: Compiler schreiben die richtige Anzahl NOPs damit die Pipeline ned abreisst[und sowas macht kein Mensch]). Kann ja jeder erstmal leicht kontrollieren was sein Compiler so für Ideen hat und später noch dran rumfeilen. --Evxxvi 03:01, 27. Nov. 2008 (CET)
(zu Punkt 4) s.o.
(Der vorstehende Beitrag stammt von Snert – 12.2.2005, 17:02 (MEZ) – und wurde nachträglich unterschrieben.)
(zu Punkt 5) Java-Beispiel raus.
(Der vorstehende Beitrag stammt von Snert – 12.2.2005, 17:02 (MEZ) – und wurde nachträglich unterschrieben.)
Es macht auch keinen Sinn Java als "Zeigerfrei" zu bezeichnen, dass ist inkonsistent gegenüber dem Java-Artikel. Desweiteren hat Java so etwas wie "NullPointerExceptions", was ein weiterer Hinweis ist das Java Zieger verwendet.
(Der vorstehende Beitrag stammt von 137.226.77.2 – 16.3.2005, 03:10 (MEZ) – und wurde nachträglich unterschrieben.)
Ich weiss nicht, was daran ein "Trick" sein soll. Es ist ein Werkzeug bzw. eine Möglichkeit Zeiger zu nutzen. Was der Compiler daraus macht, ist eine ganz andere Frage, d.h. es gibt durchaus CPUs, die mit Indices (also im Prinzip relativen Zeigern) schneller arbeiten, bzw. Compiler, die den Code besser optimieren können, wenn man Array[Index] statt Pointern verwendet. Außerdem ist es beispielweise auf 64-Bit Architekturen ratsam - soweit sinnvoll - 8/16/32-Bit Indices statt Pointern zu verwenden, um Speicherbandbreite und -platz sparen, da sich anderenfalls der breitere Bus durch die breiteren Pointer leicht armortisiert. --82.141.48.8 23:49, 5. Jun 2005 (CEST)

Verweis „Listen“[Bearbeiten]

Habe mal den verweis "Listen" unter vorteile in den Informatik Konnotierten Listenverweis umgewandelt. Was eine Liste als abstrakter Begriff ist, ist für die meisten Menschen die hier lesen wohl recht uninteressant. --213.196.192.169 02:16, 19. Nov. 2006 (CET)

Redundanzbaustein entfernt[Bearbeiten]

Nach lesen der Beiträge auf Wikipedia:Redundanz/Januar_2007#Handle_und_Zeiger_.28Informatik.29 wurde der Redundanzbaustein zu Handle entfernt.
(Der vorstehende Beitrag stammt von 217.229.14.114 – 25.2.2007, 14:00 (MEZ) – und wurde nachträglich unterschrieben.)

Oder diese Variablen selbst?[Bearbeiten]

Ein Zeiger oder Pointer bezeichnet in der Informatik eine spezielle Klasse von Variablen, die auf einen anderen Speicherbereich verweisen, "oder diese Variablen selbst"
ich verstehe den letzten teil dieses Satzes leider nicht, ( in Anfür.strichen)
ok, ein pointer zeigt auf eine Addresse im Speicher,...
so...nun verstehe ich das jetzt richtig? wurde zb. auf "diese" Addresse eine Variable zuvor gespeichert? Oder deren Wert?...und gibt es nun auch noch die Möglichkeit, direkt auf diese Variable zu zeigen? also nicht mehr auf den Wert der Variable im Speicher, sondern praktisch auf die Stelle im Quelltext wo die Variable ist oder wie? Springt der dann auf die Variable?
oder heisst dieser Teil der pointer zeigt auf sich selbst, weil...in diesem Satz 2 mal von variablen gesprochen wird, und aus dem Satz nicht klar wird das es verschiedene sind....vorallem weil da auch noch steht "diese" könnte man meinen, der Autor meinte diese gleichen, pointer Variablen
mfg
(Der vorstehende Beitrag stammt von 77.180.151.94 – 12.3.2007, 18:41 (MEZ) – und wurde nachträglich unterschrieben.)

Ein Zeiger ist eine Variable, die angibt, wo ein beliebiger Wert im Speicher zu finden ist. Beispielsweise hast du eine Variable, in der du einen Wert gespeichert hast, und einen Zeiger, den du auf diese Variable zeigen lässt. Dann enthält der Zeiger die Position im Hauptspeicher (man sagt dazu auch "Adresse" ;-)), wo deine Variable mit dem Wert abgelegt ist. Hoffe, das ist so etwas verständlicher. --Rohieb 会話 +/- 19:23, 12. Jan. 2008 (CET)

Zeigeroperationen[Bearbeiten]

  • Subtrahieren: zwei Zeiger dürfen subtrahiert werden. Das Ergebnis ist eine Ganzzahl.
  • Addieren: diese Operation ist verboten, da dies keinen Sinn ergibt! Erlaubt ist hingegen in einigen Programmiersprachen die Addition einer Ganzzahl zu einem Zeigerwert (was bei Arrays zum Einsatz kommt).

Warum steht bei Addieren das die Operation verboten ist weil sie keinen Sinn ergibt? Subtraktion ergibt doch noch weniger Sinn! --62.180.146.106 11:29, 12. Jan. 2008 (CET)

Hm, in der Subtraktion sehe ich nun auch überhaupt keinen Sinn... Man hat dann zwar eine Ganzzahl, die die Größe des Bereichs zwischen den Zeigern angibt, aber was will man dann damit anfangen...? Das kann ich höchstens benutzen, wenn ich weiß, dass zwei Objekte im Speicher genau hintereinander liegen, aber wann weiß ich das als normalsterblicher Programmierer schon? Die Addition eines Zeigers mit einer Zahl kommt (zumindest in C/C++) bei Arrays zum Einsatz, oder bei Assembler beim Zugriff auf den Hauptspeicher, aber eine Addition von zwei Zeigern kann ich mir auch nicht erklären.
So, also scheint der ganze Abschnitt bis auf die Addition Zeiger+Ganzzahl wohl sinnlos zu sein :-) --Rohieb 会話 +/- 19:17, 12. Jan. 2008 (CET)
Danke.
Bei Object-Pascal/Delphi geht das übrigens auch, aber nicht nur mit Arrays sondern auch mit PChars, Records usw. --62.180.145.129 11:13, 13. Jan. 2008 (CET)

Zeigertyp[Bearbeiten]

  • Der Begriff wird häufig fälschlicherweise auch für den Datentyp solcher Variablen benutzt, wobei diese Bedeutung richtig Zeigertyp genannt wird.

Kann mir jemand erklären, was damit gemeint sein soll? Wird der Typ der referenzierten oder der referenzierenden Variable (also des Zeigers selber) „Zeigertyp“ genannt? --Rohieb 会話 +/- 19:33, 12. Jan. 2008 (CET)

der Zeiger selbst.
Integer ist der Datentyp; PInteger (oder ^Integer) der Zeigertyp --62.180.145.129 11:21, 13. Jan. 2008 (CET)
OK, so hab ich das auch verstanden. Ich änder das mal in etwas verständlicheres. --Rohieb 会話 +/- 16:22, 13. Jan. 2008 (CET)

Größere Änderungen[Bearbeiten]

Hallo ich habe mal nach dem Motto trau dich den Artikel hier neu formuliert und um strukturiert. Da ich noch neu bei der Wikipedia bin, hab ich mich nicht getraut die Änderungen in - place durchzuführen und bitte um Feedback:

  • Formulierung und typos
  • Inhaltliche Fehler
  • Ich bin hauptsächlich C / C++ Programmierer, deswegen ein bisschen auf Allgemeingültigkeit schauen.
  • Beispiel in anderer Sprache oder Wie soll mans machen...
  • Hilfe beim Mergen

Danke und Gruss --Gleu 19:27, 25. Dez. 2009 (CET)

Ein paar Anmerkungen zu Deiner Artikel Version:
  • Wie im aktuellen Artikel ist von 'Intelligenten Zeigern' die Rede. Ist wohl eine Begriffsfindung. Smart-Pointer ist der Fachbegriff.
  • 'fester Wert' -> Konstante
  • Abschnitt 'Verwendung in Datenstrukturen' erklärt nicht wirklich wie Pointer in Datenstrukturen verwendet werden. An der Stelle könnte vielleicht auch ein konkretes einfaches Beispiel hilfreich sein (z.B. verkette Liste)
  • Funktionszeiger -> umfangreicher, was konkret passiert
  • 'Abschließende Betrachtungen' als Gliederungsebene für einen WP-Artikel ist problematisch, Unterabschnitte sollten in den eigentlichen Artikel integriert werden
  • 'Vorteile/Nachteile' - nicht neutral! Beispielsweise 'Der Umgang mit Zeigern ist schwierig zu erlernen ...' - Listen sollten besser in einen Fliesstext umgewandelt werden und in passende Abschnitte integriert werden, so dass neutral Einsatzgebiete/Anwendungsfälle/... von Pointern beschrieben werden
  • Den Sinn von Abschnitt 'Arbeiten mit Zeigern' verstehe ich nicht - ist das eine Art Best-Practice-Rules?
  • Zur Gliederung: 'Verwendung' ist wenig hilfreich als Abschnitt, da zu unspezifisch, bzw. zuviel darunter auftaucht. Die meisten Unteabschnitte könnte man auch auf die oberste Ebene heben. Der Text zu typysierte, untypsiertere bzw. Funktionspointer könnte man in einem Abschnitt 'Arten' oder ähnliches zusammenfassen. 'Zeigerarithmetik' sollte mit 'Operationen' gemerge't werden, da die arithmetischen Operationen ja auch Operationen sind.
  • 'Diese Operationen sind jedoch sehr fehleranfällig und sollten nur an wirklich zeitkritischen Stellen verwendet werden. In manchen Programmiersprachen wird diese Art der Verwendung nicht unterstützt.' - der erste Hinweise ist eher in einem Tutorial relevant, nicht in einem enzyklopädischen Artikel - der 2. Satz wird schon durch den Programmiersprachen-Absatz abgedeckt.
--Gms 16:20, 29. Dez. 2009 (CET)
Sind vllt. ein paar brauchbare Verbesserungen bei. Kann auch nicht alles beurteilen. Vielleicht solltest du Abschnitt für Abschnitt mögliche Verbesserungen vornehmen. Kritik kommt dann schnell und speziell ; ) --WissensDürster 18:21, 22. Jan. 2010 (CET)

Fehler: Grafik passt nicht mehr zum Text![Bearbeiten]

Die Grafik wurde ersetzt und zeigt für b einen neuen Hexadezimalwert (01101101). Dieser stimmt jetzt leider nicht mehr mit der im Text genannten 17 überein! (nicht signierter Beitrag von 131.246.227.209 (Diskussion | Beiträge) 20:48, 3. Feb. 2010 (CET))

Verzeiht bitte, wenn ich hier an der falschen Stelle meine Bemerkung festhalte - ich hab' noch nie einen Wikiartikel diskutiert. Ich möchte anregen, dass die Werte in der Graphik durch andere ersetzt werden, denn eine achtstellige Zahl, bestehend aus Nullen und Einsen wird wohl von vielen intuitiv als Binärzahl interpretiert. Könntet Ihr bitte noch ein paar Buchstaben oder Ziffern > 1 hinzunehmen, damit man nicht erst in die "aha, 8-Bitwert, okay!"-Sackgasse rennt und sich dann im Nachgang wundert, warum eine 8-Bit-Zahl so dermaßen groß (17830145) sein kann? Oder vielleicht ein "0x" davorschreiben oder ein subscript "16" dahinter oder so. Ich denke, dass es vor allem Einsteigern / Neulingen den Zugang zum Artikel erleichterte. Ich bin weder das eine noch das andere, aber müde und deswegen voll hineingetappt und habe mich schwer gewundert, wie das zusammenpassen soll. (nicht signierter Beitrag von 84.178.44.107 (Diskussion | Beiträge) 10:47, 10. Mai 2010 (CEST))

Warum Zeiger?[Bearbeiten]

Ich bin leider kein C Programmierer. Zeiger habe ich nie ganz verstanden. Aber ich habe vor nicht allzulanger Zeit einen guten Hinweis in einem Artikel gelesen: Zeiger steigern die Effizienz von Programmen, da sie Informationen aus dem Speicher nicht in die Funktion kopieren müssen, sondern durch den Zeiger die Informationen einfach aus dem Speicherbereich holen. Ich bin mir im Klaren, dass dies nicht der einzige Grund ist. Aber es war für mich den am einfachsten nachvollziehbare Grund. Frage an die Autoren: kann man diese Information auch auf der Seite schreiben? Viele Grüße Sandstorm 21:15, 21. Nov. 2010 (CET)

Ich denke dieser Hinweis wäre besser im Artikel Referenzparameter aufgehoben. Dieser Artikel behandelt Zeiger allgemein und die kann man für einen ganzen Haufen dinge gebrauchen, nicht nur als Übergabeparameter. --Bernedom 14:24, 24. Nov. 2010 (CET)

Memberpointer[Bearbeiten]

Gibts sowas nur in C++ oder auch in anderen Sprachen? Wenn ja, wäre es sicher sinnvoll, sie hier auch zu erwähnen, was meint ihr? --RokerHRO 20:53, 22. Dez. 2011 (CET)

Nachteile und Gefahren[Bearbeiten]

Der folgende Absatz gefällt mir nicht:

Im Allgemeinen ist keine Datentyp-Kontrolle möglich, das heißt, beim Ausführen kann nicht kontrolliert werden, was für Daten an der Zieladresse stehen, und ob diese den Erwartungen (Spezifikationen) des Programmablauf entsprechen

Es gibt sehr wohl Programmiersprachen, die eine Datentyp-Kontrolle ermöglichen, so kann ein Zeiger unter ABAP z. B. so aussehen:

*Deklarationen
DATA char TYPE C LENGTH 4 VALUE 'test'.
DATA num TYPE N LENGTH 4 VALUE '4711'.
FIELD-SYMBOLS <zeiger> TYPE C.
FIELD-SYMBOLS <zeiger_2> TYPE C LENGTH 4.
FIELD-SYMBOLS <zeiger_3> TYPE ANY.
*Zuweisungen
ASSIGN char TO <zeiger>. "funktioniert
ASSIGN char TO <zeiger_2>. "funktioniert
ASSIGN char TO <zeiger_3>. "funktioniert
ASSIGN num TO <zeiger>. "funktioniert nicht
ASSIGN num TO <zeiger_2>. "funktioniert nicht
ASSIGN num TO <zeiger_3>. "funktioniert
*Zusatz CASTING (Datenfelder müssen die selbe Länge haben, sonst klappt es nicht)
ASSIGN num TO <zeiger> CASTING. "funktioniert nicht
ASSIGN num TO <zeiger_2> CASTING. "funktioniert
ASSIGN num TO <zeiger_3> CASTING. "funktioniert nicht

-- 87.164.166.65 02:02, 30. Dez. 2011 (CET)

Es wäre erstmal zu klären, was mit "Datentypkontrolle" genau gemeint sein soll. Ich habe die Aussage erstmal entschärft. Denn selbst in C und C++ muss man schon explizit das Typsystem aushebeln (mit Type-Casts), damit das klappt. Und da ein Paradigma von C nunmal "trust the programmer" ist, heißt dies: Wenn der Programmierer über einen expliziten Cast die Typprüfung übergeht, vertraut der Compiler darauf, dass der Programmierer weiß, was er tut. --RokerHRO 20:09, 30. Dez. 2011 (CET)