Zum Inhalt springen

Zeiger ? Eine fremde Welt...


Empfohlene Beiträge

Geschrieben

Hallo,

an sich finde ich C bisher ganz OK, nur jetzt sind die Zeiger dran und ich krieg es nicht so richtig in die Birne rein...

Kennt eine evtl. einen guten Text wo es sehr gut auch für Anfänger erklärt wird evtl. mit Bildchen usw... ???

Oder hat eine irgendwelche Tipps Tricks dazu ???

wäre wirklich super...

Gruß

Milos

Geschrieben

Auch Informatik-Studenten belegen - so habe ich es zumindest gehört - zum Teil mehrere Monate mit diesem Thema.

Zusammengefasst sind Zeiger Zeiger auf Speicherstellen -> also direkt, ohne Umwege, in denen etwas steht bzw. in die geschrieben bzw. aus denen ausgelesen werden kann.

Weil es so direkt ist, muß man auch entsprechend vorsichtig sein, und den Zeiger unbedingt wieder löschen bzw. außer Kraft setzen, wenn er nicht mehr gebraucht wird.

Ich habe einmal durch einen Zeiger mein Win98-System inklusive Registrierung zum Absturz begracht...

Seitdem programmiere ich lieber (in) Java. :D

Geschrieben

Hallo,

mir gehts ähnlich wie dem Thread-Eröffner hier : beschäftige mich gerade auch intensiv mit den Zeigern in C.

Ich sage mal, verstanden WIE sie arbeiten hab ich soweit schon, nur WIESO sie eingesetzt werden müssen, verstehe ich noch nicht. Zumindest nicht an den Beispielen in meinem bisherigen Übungsbuch "Jetzt lerne ich C" (MuT-Verlag).

Vielleicht kann mir das hier jemand näherbringen, WARUM hier Zeiger verwendet werden ?!?!

In dem folgenden Programm werden die Werte zweier short-Variablen mit Hilfe von Zeigern vertauscht :

#include <stdio.h>


void tausch(short*, short*);


void main()

{

   short *Zeiger1;

   short *Zeiger2;


   short Wert1 = 1111;

   short Wert2 = 2222;

   Zeiger1 = &Wert1;

   Zeiger2 = &Wert2;


   tausch(Zeiger1, Zeiger2);


   printf("Der Wert von Wert1: %d\n",Wert1);

   printf("Der Wert von Wert2: %d\n",Wert2);

}


void tausch(short *WertZeiger1, short *WertZeiger2)

{

   short h;

   h = *WertZeiger1;

   *WertZeiger1 = *WertZeiger2;

   *WertZeiger2 = h;

}
Soweit so gut, funktioniert auch ! Ich bin aber noch immer nicht überzeugt, WARUM ich hier Zeiger verwenden soll, wenn doch das nun folgende von der Ausführung her dasselbe Ergebnis bringt !!!
#include <stdio.h>


void main()

{

   short Wert1 = 1111;

   short Wert2 = 2222;

   short h;


   h = Wert1;

   Wert1 = Wert2;

   Wert2 = h;


   printf("Der Wert von Wert1: %d\n",Wert1);

   printf("Der Wert von Wert2: %d\n",Wert2);

}

Welchen Unterschied gibt es nun zwischen den beiden Varianten - beide sind doch richtig oder ?! Gibt es dann für die CPU irgendeinen Vorteil bei dem Tausch oder wieso Zeiger ?!

Denke ja mal, daß die Verwendung von Zeigern den Vorteil in einer nicht sichtbaren Ebene bringt, wenn überhaupt !

Denn wie gesagt bei der Ausführung wird dasselbe angezeigt : die Werte der Variablen Wert1 und Wert2 werden wie gewünscht vertauscht.

Wäre super, wenn sich jemand die Mühe machen würde und mir (oder uns) näher bringen könnte oder ne Adresse weiß, wo die Notwendigkeit von Zeigern allgemein nochmal einsehbar erklärt wird.

Danke vorab !

Grüße Flori

Geschrieben

Also, in dem Beispiel bräuchtest Du keine Zeiger. Allerdings werden in dem Beispiel mit den Zeigern nicht die Werte in den anderen Zeiger geschrieben. In einen Zeiger kann man nichts schreiben. Man weißt ihm eine Adresse zu, auf die er zeigt.

In dem Beispiel mit den Zeigern sie das dann so aus:

Vorher:

Variable 1 hat Wert 2 und Adresse ???

Variable 2 hat Wert 4 und Adresse !!!

Zeiger a zeigt auf ???

Zeiger b Zeigt auf !!!

Nach dem Tausch:

Variable 1 hat Wert 2 und Adresse ???

Variable 2 hat Wert 4 und Adresse !!!

Zeiger a zeigt auf !!!

Zeiger b zeigt auf ???

In dem andern Beispiel was Du angebracht hast, sieht es so aus:

Variable 1 hat Wert 2 und Adresse ???

Variable 2 hat Wert 4 und Adresse !!!

Zeiger a zeigt auf ???

Zeiger b Zeigt auf !!!

Nach dem Tausch:

Variable 1 hat Wert 4 und Adresse ???

Variable 2 hat Wert 2 und Adresse !!!

Zeiger a zeigt auf !!!

Zeiger b zeigt auf ???

Es funktioniert beides, ist aber doch etwas anderes.

Wenn Du anfängst und dynamisch programmierst, also nur den Speicherplatz belegst den Du wirklich brauchst, dann kommst Du ohne Zeiger nicht aus.

Bine

Geschrieben

void main () ist kein C, gewöhn es Dir gar nicht erst an.

Der Unterschied zwischen Deinen Programmen ist, daß die Variablen einmal an Ort und Stelle vertauscht werden und einmal in einer Funktion. Es ist ja ganz praktisch, eine Funktion zu haben, wenn man öfter das Gleiche (zum Beispiel zwei Werte vertauschen) machen möchte. Wenn Du nun Dein Programm folgendermaßen umschreiben würdest, dann hättest Du nicht mehr den gewünschten Effekt:


#include <stdio.h>


void tausch ( short, short );


int main()

{  

   short Wert1 = 1111;

   short Wert2 = 2222;


   tausch (Wert1, Wert2 );


   printf("Der Wert von Wert1: %d\n",Wert1);

   printf("Der Wert von Wert2: %d\n",Wert2);

   return 0;

}


void tausch (short W1, short W2)

{

   short h = W2;

   W2 = W1;

   W1 = h;

}

Was hast Du mit diesem Programm erreicht? Nicht viel, denn Du hast die lokalen Kopien vertauscht, aber nicht die Werte in der main-Funktion. Um das zu erreichen brauchst Du Zeiger. (siehe Dein erstes Beispiel) Mit Zeigern kannst Du nun die Adresse Deiner Variablen übergeben und so die Variablen direkt manipulieren.

HTH

Jan

Geschrieben

Danke schon mal bis hierhin !

Hab schon mal wieder ein paar Seiten gelesen und dort auch noch ein paar einleuchtendere Beispiele für die Verwendung von Zeigern gefunden (z.B. Zeichenketten) und es zumindest schon mal in einigen Übungen intuitiv verwenden können.

Auf alle Fälle haben mir die beiden Ausführungen auch dabei geholfen, das ganze besser gedanklich umsetzen können ! Thx!

Flori

Geschrieben

Folgende Kurzdefinition schreibe ich meinen Schuelis manchmal an die Tafel und trage ihnen auf, ganz fest dran zu glauben und auswendig zu lernen:

Ein Zeiger p auf Typ typ (typ* p) ist eine Variable (des Typs typ*), von der angenommen wird, dass ihr Wert eine Adresse enthaelt, an der man einen Wert des Typs typ findet.

Geschrieben
Original geschrieben von Alrik Fassbauer

Ich habe einmal durch einen Zeiger mein Win98-System inklusive Registrierung zum Absturz begracht...

Seitdem programmiere ich lieber (in) Java. :D

Wenn mit nem einfachen Zeiger das Betriebsystem zum Absturz bringst , dann wechsele lieber das Betriebssystem als die Programmiersprache.

( Sorry OFF-TOpic , konnte ich mir aber nicht verkneipfen )

Geschrieben

*seufz* Es war ein Zeiger, der auf ein Datenbankobjekt deutete. Wie ich später herausbekommen habe, wurde das Objekt an einer Stelle bei der Übergabe von Werten daraus nicht richtig geschlossen.

Naja, ich war damals Anfänger, und mußte mich fast ganz alleine durch das Programm quälen, mit Gruppenarbeit war da nicht viel.

Ich habe daraus gelernt (für mich persönlich) Zeigern aus dem Weg zu gehen, wo es nur geht.

Ich wette, da gibt es jetzt viel an meinem Programmierstil zu kritisieren... :rolleyes:pbsmile.gif

Geschrieben
Original geschrieben von Alrik Fassbauer

Ich habe daraus gelernt (für mich persönlich) Zeigern aus dem Weg zu gehen, wo es nur geht.

Ich wette, da gibt es jetzt viel an meinem Programmierstil zu kritisieren... :rolleyes:pbsmile.gif

Ganz alte Weisheit: Benutze Referenzen, wenn Du kannst und Zeiger, wenn Du musst. ;)

Wann muss man denn? - Strings, dynamische Objekte, Arrays, Dateizugriffe... Welcher C/C++-Programmierer koennte darauf verzichten?

Geschrieben

Eine Grundregel besagt: Verwende Referenzen wenn möglich und Zeiger nur wenn nötig. Da steckt schon ein Hinweis auf die Problematik drin, aber es gibt eben Anwendungsfälle, die ohne Zeiger schwierig, langsam oder gar unmöglich zu realisieren sind.

(habe grad gesehen, daß Gaius jUlius zeitgleich denselben Gedanken hatte)

Trotzdem ist es sinnvoll die Technik zu beherrschen anstatt sich von ihr abzuwenden, weil es "gefährlich" ist. Man kann Programme auch ohne Zeiger abschießen. Selbst manche scheinbar simple Funktionsaufrufe können Exceptions auslösen bis zum Abwinken und Speicherlücken erzeugen, daß es nur so kracht.

Sobald irgendwo irgendwas manipuliert wird, geht man schon Gefahren ein. Jegliche Schreibzugriffe aller Art stellen immer eine mögliche Absturzquelle dar, aber ohne solche Funktionen und Programmteile könnte man ja gar nichts mehr auf die Beine stellen. Man muß sich damit auseinandersetzen und versuchen die Problematik zu begreifen, erfassen, in den Griff zu bekommen und zukünftig zu kontrollieren.

Ich jedenfalls verwende sooft Zeiger, daß ich mir erst gar nicht vorstellen kann ohne sie zu arbeiten.

Geschrieben
Original geschrieben von Alrik Fassbauer

Auch Informatik-Studenten belegen - so habe ich es zumindest gehört - zum Teil mehrere Monate mit diesem Thema.

??? Also wir hatten nur eine Vorlesung für Zeiger... also 45 minuten.... den rest sollten wir uns selbst erklären.

Das war aber nicht der Grund warum ich abgebrochen hab. C war die geilste Vorlesung überhaupt :D

Geschrieben
Original geschrieben von Flori

Ich sage mal, verstanden WIE sie arbeiten hab ich soweit schon, nur WIESO sie eingesetzt werden müssen, verstehe ich noch nicht.

warum man sie einsetzen muss...naja müssen tu tman eigentlich nur wenn z.B. in der WinAPI (oder anderen DLLs o.ä.) der Programmierer Zeiger haben wollte. Zeiger haben dann einen großen Vorteil, wenn du große Strukturen verwendest. Z.B. große Structs (um bei C zu bleiben) und diese an verschiedene Funktionen übergibst. Ohne Zeiger wird jedesmal eine Kopie angelegt, mit der Zeit für das Kopieren und dem mehrfachen Speicherverbrauch. Auch beim Programmieren mit Komponenten machen Zeiger manchmal einen Sinn. Ich hatte es schon öfter, dass mehrere Komponente eigentlich gleich sind nur andere Werte bzw. auf eine andere Art darstellten (z.B. Chart-Komponente, bei der für jede Art (torte, Balken etc.) eine neue Komponente genutzt wurde) du programmierst einmal, und übergibst die Komponente als Zeiger auf die eigentliche Komponente...spart viel Arbeit und funktioniert genauso. Pointer sind ganz hilfreich und nicht so kompliziert wie sie (gerade in C, ich sag nur Zeiger auf Zeiger ...) öfters benutzt werden ;)

Geschrieben

Ich bin heute etwas faul, deshalb verweise ich auf ein paar alte Threads, in denen ich mal versucht habe (mehr oder weniger korrekt) Zeiger und Referenzen zu erklären (wiederholt sich eh alles ständig von vorne).

!!!Aber Vorsicht!!!

Meine Sicht auf Referenzen ist nur deklarativ aus technischem Verständnis heraus erklärt und nicht ganz realistisch - dafür aber verständlich, jedoch überhaupt nicht im Sinne der C/C++-Entwickler.

Simpel

Komplizierter

Syntaxproblematik

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...