+++ Zeiger +++
-
Hallo,
bin grade dabei etwas über "Zeiger" zu lernen, jedoch verstehe ich nur Bahnhof! Was ist den jetzt nun ein "Zeiger" und wozu wird er eingesetzt ??
Bitte um HILFE !
M F G - Robb.
-
http://pw1.netcom.com/~tjensen/ptr/pointers.htm
oder schau in dein C Buch
-
Es gibt in C grundsätzlich zwei Sorten von Variablen. Die Zeigervariablen und die "normalen".
Zeigervariablen zeigen auf eine normale oder auf eine andere Zeigervariable.Das bedeutet sie speichern die Speicheradresse an der eine Variable liegt.
z.B.:
int a=5;
int *b=&a;In a ist jetzt der Wert 5 gespeichert und in b ist die Adresse von a gespeichert. Wenn a z.B. im Arbeitsspeicher an der Adresse Nr. 1034784666 gespeichert ist (wozu man allerings mindestens 1GB RAM bräuchte). Dann wäre in b nun 1034784666 gespeichert.
Natürlich hat b auch eine Adresse im RAM. Die könnte dann z.B. 1034784670 sein.
-
Verstehe! Aber wozu braucht man Zeiger? In welchen Programmen werden Sie z.B. verwendet? Das ist es, was ich nicht verstehe!
[ Dieser Beitrag wurde am 14.02.2003 um 20:11 Uhr von Robb editiert. ]
-
Du bist entweder lernresistent oder hast dich nicht wirklich damit beschäftigt. Das steht in jedem Tutorial über Zeiger.
-
dann sind wir in 100 Jahren fertig.
z.bstruct biggie { char x[1024]; }; void f(biggie b) { b.x[1023] = '\0'; cout << b << '\n'; } void f(biggie *b) { b->x[1023] = '\0'; //bzw. (*b).x[1023] = '\0'; cout << b << '\n'; } int main () { biggie b; f(b); f(&b); }
Was denkst du ist schneller, f(biggie), bei der 1024 chars kopiert oder f(biggie*), bei der eine Zeigeradresse kopiert werden muss?
außerdem:int main () { biggie *b = new biggie[1024*10]; //Fein, kannst auch biggie b[1024*1024*10] schreiben, wenn du einen stack hast, der so groß ist :D f(b); f(*b); //*pups* }
Jetzt mal von Polymorphie, Referenzen, etc ganz zu schweigen
-
sorry, ist ja das c forum :p
-
Zeiger werden eigentlich in so gut wie jedem Programm verwendet. Eine Hauptaufgabe dabei ist die Wertübergabe an Funktionen. Stell dir vor, du hast ein Array oder eine Struktur von mehreren KB an Grösse. Und das möchtest du an eine Funktion weitergeben. Anstatt den Compiler allzu sehr zu fordern und ihm aufzuerlegen, Code zu erzeugen, um den gesamten Bereich in den Stack zu kopieren, gibst du der Funktion lediglich die Anfangsadresse auf diesen Bereich in einem Zeiger-Argument mit. Dies hat ausserdem den Vorteil, dass du die Daten in dem Bereich direkt ändern kannst. Würde er lediglich im Stack, sozusagen als Kopie, der Funktion zur Verfügung stehen, hast du zwar die aktuellen Werte, alle Änderungen wären aber beim Verlassen der Funktion verloren.