Zeiger - ich raff es nich
-
Hallo zusammen,
kann mir mal jemand das "Warum Zeiger?" erklären? Ich bin noch nicht sehr lange beim programmieren und bin jetzt bei den Zeigern ins stolpern gekommen.
Ich meine, ich weiß wie man einen Zeiger initialisiert, ich weiß, das man mit einem Zeiger auf einen Adressbereich anstatt auf den darunter gespeicherten Wert zurückgreift, aber warum der ganze Umstand? Warum nicht gleich auf den Inhalt statt auf die Adresse zugreifen?
Ich verstehe die Logik dabei nicht und ich hab schon etliche Tutorials im Internet, so wie Bücher zu dem Thema gelesen, aber bei keinem Beitrag steht, warum man das macht, nur das und wie man es macht.
Was habe ich durch Zeiger für Vorteile, denn für irgendwas muß es ja gut sein??? *ratlos sei
-
versuch dir die frage mal selber zu beantworten.
was wuerde der sprache fehlen, wenn du keine zeiger mehr haettest?hoehere sprachen wie scheme oder python haben keine zeiger mehr, weil sie dafuer schon zu abstrakt sind. zeiger sind nunmal sehr nah an der hardware.
-
Also durch die Zeiger (oder später Referenzen) kannst du eben bestimmen, ob jemand Schreibzugriff auf deine Daten bekommt.
Stell dir doch mal vor, jeder Funktionsaufruf wäre call-by-reference. Dann könnte jede Funktion alle übergebenen Parameter *wirksam* verändern.Wenn du mit Zeigern arbeitest, kannst DU aber bestimmen, welche Funktion was darf.
-
Versuche ich ja, aber ich erhalte keine Antwort, sondern es wirft neue Fragen aus.
In Basic (nich schlagen *g) gabs früher keine Zeiger und so weit ich weiß, verwendet PHP auch keine Zeiger.
Und gefehlt haben sie mir bisher nicht. Konnte wohl auch alles ohne sie erstellen, aber da ich nicht weiß, was mir Zeiger bringen, kann ich nicht sagen, ob mir was fehlt/gefehlt hat?!Beispiel:
Ich habe eine Variable
int varia=10;
Warum soll ich da umständlich erst noch einen Zeiger deklarieren und initialisieren, wenn ich doch auch direkt auf varia zugreifen kann, oder ist das Beispiel zu popelig und es wird erst interessant, wenn es an komplexere Strukturen geht?
Wenn Du aber schreibst sehr nah an der Hardware, vermute ich mal, ich habe durch Zeiger einen schnelleren Zugriff, also Performance-Vorteile?
-
hehejo schrieb:
Also durch die Zeiger (oder später Referenzen) kannst du eben bestimmen, ob jemand Schreibzugriff auf deine Daten bekommt.
Stell dir doch mal vor, jeder Funktionsaufruf wäre call-by-reference. Dann könnte jede Funktion alle übergebenen Parameter *wirksam* verändern.Wenn du mit Zeigern arbeitest, kannst DU aber bestimmen, welche Funktion was darf.
was bitte? mit schreibzugriff hat das wenig zu tun. ausserdem wollen wir mal annehmen, dass es KEINE zeiger gibt und was uns dann fehlen wuerde.
@c-noob: zeiger werden erst bei komplexeren dingen interessant, wie z.b. verkettete listen oder binaere baeume. das sind dynamische strukturen, bei denen sich daten und zuordungen im speicher unvorhersehbar veraendern koennen. mit festen arrays geht da garnichts mehr. php loest das mit nem garbage collector und dynamischen arrays. in c gehts eben nur mit zeigern und malloc().
-
c.rackwitz schrieb:
@c-noob: zeiger werden erst bei komplexeren dingen interessant, wie z.b. verkettete listen oder binaere baeume. das sind dynamische strukturen, bei denen sich daten und zuordungen im speicher unvorhersehbar veraendern koennen. mit festen arrays geht da garnichts mehr.
Es geht schon. Du würdest dann die Verkettungen durch Array-Indizes darstellen. Das ist aber wahrscheinlich nicht übermäßig performant und außerdem sehr unübersichtlich.
-
c.rackwitz schrieb:
ausserdem wollen wir mal annehmen, dass es KEINE zeiger gibt und was uns dann fehlen wuerde.
ich glaube viele einsteiger sind auch ohne zeiger glücklich...
-
Zeiger sind auch manchmal für die Performance ganz nützlich. Angenommen, du hast ein riesiges Array, das du einer Funktion übergeben willst, die daraus Werte ließt. Gäbs keine Zeiger, müsste das gesamte Array kopiert werden, und als lokale Variable in der Funktion existieren. So kann auf das orginale Array zugegriffen werden, ohne lange rumzukopiern und Speicherplatz zu verschwenden.
mfg
Xul
-
Erstmal danke an alle, die geantwortet haben.
Dank Euren diversen Antworten hab ich unter Anderem mit call-by-reference, dynamische Strukturen und binäre Bäume so einiges Interessantes im Netz gefunden, und so langsam versteh ich den Sinn der Zeiger schon mehr.
@net: Ich geb Dir vollkommen Recht. Ohne Zeiger wäre ich sehr glücklich *g, aber da ich jetzt gelesen habe, das es alternativen (auch wenn sie eher unglücklich sind) gibt um ein Problem zu lösen, so reicht mir das erst einmal. Ich dachte nur, ich komme überhaupt nicht mehr weiter, wenn ich das mit den Zeigern schon nicht raffe.
Früher oder später wird es dann sicher klarer.
Hab auch ein wenig länger gebraucht, bis ich hinter die Logik einer Klasse gekommen bin und plötzlich hat es Klick gemacht.
-
C-Noob schrieb:
Ich dachte nur, ich komme überhaupt nicht mehr weiter, wenn ich das mit den Zeigern schon nicht raffe. Früher oder später wird es dann sicher klarer.
eigentlich ist es ganz einfach. wenn man weiss was eine variable ist (also so'n ding in dem man was speichern kann) dann versteht man auch, das zeiger variablen für den datentyp 'adresse' sind. bleibt nur noch die kleine hürde der anwendung. also immer schön damit rumspielen und dann kommste schon dahinter.
C-Noob schrieb:
Hab auch ein wenig länger gebraucht, bis ich hinter die Logik einer Klasse gekommen bin und plötzlich hat es Klick gemacht.
naja, als ich das erste mal mit klassen rumgefummelt hab, war das was total abstraktes. hab' mich zwar gefreut dass das alles so toll funktioniert aber ich hatte überhaupt keine vorstellung davon, wie so'n objekt erzeugt wird usw...