Zeiger... :)
-
Halli hallo. Ich habe mir bis eben das Kapitel Zeiger in meinem C-Buch durchgelesen, doch mir ist nicht wirklich klar, wozu die jetzt da sind. Ich mein, ich hab zwar verstanden wie man sie benuzt, und was sie machen etc., aber mir ist nich ganz klar, wozu man sie dennoch brauch.
Kann ich denn nicht, statt auf die Adresse zu Zeigen, nicht einfach gleich von vorn herein die Variable nennen? Warum der Umweg über einen Zeiger???
Danke fürs Verständniscu
-
Hallo,
Zeiger brauchst Du z.B., wenn Du Variablen an eine Funktion übergibst und deren Inhalt (dauerhaft) verändern willst. Beliebtest Beispiel:
void swap(int a, int b) { int temp = a; a = b b = temp; }
Das sieht zwar richtig aus, hat aber nicht den gewünschten Effekt; wenn die Funktion beendet ist, haben die Variablen a und b immer noch die selben Werte. Warum? Weil die Variablen, wenn sie an die Funktion übergeben werden, kopiert werden (call by value). Du arbeitest also sozusagen mit Kopien und nicht mit den Orginalen und folglich kannst Du die Originale auch nicht innerhlab der Funktion verändern.
Um den Inhalt der Variablen a und b wirklich zu ändern, reicht es nicht, nur Kopien selbiger an die Funktion zu übergeben. Deswegen setzt man in diesem Fall Zeiger ein. Du übergibst der FUnktion die Adressen der Variablen (setzt also Zeiger ein) und änderst, wenn Du innerhalb der Funktion mithilfe der Zeiger den SPeicher der Ausgangsvariablen manipulierst, deren tatsächlichen Wert und nicht nur den Wert einer Kopie. Die Swap-Funktion sähe so also richtig aus:void swap(int *a, int *b) { int temp = *a; *a = *b; *b = *temp; }
Ausserdem kann man mithilfe von Zeigern Speicher zur Laufzeit des Programms dynamisch reservieren. Stell Dir z.B. vor, Du hast ein Programm, in dem viele große Arrays verwendet werden. Wenn Du nun z.B. aus einer Datei Daten einliesst, kann es sein, dass manchmal 10 Datensätze vorhanden sind, manchmal aber auch 10000. Wenn Du diese jedesmal im gleichen Array speicherst, das beipeilsweise 10000 Speicherplätze hat, wäre das ja bei nur 10 Datensätzen eine ziemliche Platzverschwendung. Deswegen wäre es vielleicht sinnvoller, wenn Du den Speicherplatz an die Anzahl der Datensätze anpassen könntest. Das ginge z.B. so:
int groesse = 10; foo *datensaetze = (foo*)malloc(groesse*sizeof(foo));
Je nachdem wie viel Speicherplatz Du brauchst, kannst Du groesse entsprechend anpassen, was ja zur Laufzeit des Programms ohne weiteres möglich ist. Dann wird nur so viel Speicher reserviert, wie Du brauchst.
-
Ausserdem könnte es z. B. sein, dass du dir eine Struktur aufbaust, die einigen hundert KB gross ist.
Wenn du die komplett an eine Funktion übergibst, müsste jedesmal alles kopiert werden, was sich auf die Performance niederschlägt...
Übergibst du allerdings einen Zeiger auf die Struktur, so müssen, egal wie gross das Ding is, nur 4 Byte (auf einer 32 Bit Maschine) kopiert werden. Und das geht relativ schnell...
-
Anderes Beispiel wären verkettete Listen.....
-
ein call by reference wie in pascal gibt es in C nicht. Auch Adressen werden im call by value Verfahren übergeben.
Pointer werden dort eingesetzt, wo das Kopieren der ganzen Struktur viel zu aufwendig ist.
-
@ghost
Stellt sich hald die Frage, wie das in Pascal intern gehandhabt wird mit dem Call by Reference
-
AJ schrieb:
@ghost
Stellt sich hald die Frage, wie das in Pascal intern gehandhabt wird mit dem Call by Referencewird bestimmt genauso gehandhabt. Ich finde jedoch das schreiben von
&
viel bequemer als das Schreiben von
var
-
Wenn es im Prinzip genauso gehandhabt wird, warum kann man dann nicht auch in C von Call by Reference sprechen?
-
Asgard schrieb:
Wenn es im Prinzip genauso gehandhabt wird, warum kann man dann nicht auch in C von Call by Reference sprechen?
Weil es kein "call by reference" ist?
void f(int *p, int *q) { p = q; }
-
Daniel E. schrieb:
Asgard schrieb:
Wenn es im Prinzip genauso gehandhabt wird, warum kann man dann nicht auch in C von Call by Reference sprechen?
Weil es kein "call by reference" ist?
void f(int *p, int *q) { p = q; }
Das ist interessant was du da sagst. Aus welchem Grund sollte das bitte kein "Call-by-Reference" sein.
Was gehoert den zu einem "Call-by-Reference".
-
Was gehoert den zu einem "Call-by-Reference".
Referenzen? In C kann man das mit Zeigern zwar emulieren, aber Referenzen gibts eben dort nicht. In C++ werden Referenzen intern auch über Zeiger gehandhabt, aber darum muss sich der Benutzer nicht kümmern, ganz im Gegensatz zu C.
-
Edit: hat sich erledigt
-
Referenzen? In C kann man das mit Zeigern zwar emulieren, aber Referenzen
gibts eben dort nicht.das stimmt sowas gilt für ANSI C.
Aber es gibt zb. Compiler wie den lccwin32, der dem Programmierer noch viel mehr bietet. Unteranderem Referenzen.
Ist aber halt kein ANSI C mehr. Aber sehr bequem ;). Weiterhin gibts auch noch operatorenüberladung im C++ style uvm. Aber wie schon gesagt das ist KEIN ANSI C. Und sowas sollte nur der verwenden der ANSI Kompatibilität aufgeben möchte um Komfort zu nutzen.bye
tt
PS: das war nur eine Randinformation
-
könnte man nicht auch einfach die gewünschten werte zurückgeben lassen? da brauch man doch keine zeiger für..
-
Andi2004 schrieb:
könnte man nicht auch einfach die gewünschten werte zurückgeben lassen? da brauch man doch keine zeiger für..
Welche Werte meinst Du jetzt genau?
Wenn es allgemein gemeint war:
Es gibt genug Fälle, wo es nicht reicht, nur einen Wert zurückzugeben (siehe z.B. die Swap-Funktion in einem meinem Posting ganz oben).@all:
Achja, ich habe übrigens ganz oben das "setzt man call by reference ein" durch "setzt man Zeiger ein" ersetzt. Da bin ich wohl irgendwann mal einem ungenauen Buch auf den Leim gegangen...