Zeiger / Pointer
-
Tag ich habe hier mal ein kleines Programm geschrieben um die Funktion von Zeigern
besser zu verstehen.#include <stdio.h> void main ( void ) { int a = 5; int b = 10; /* * Aufruf der Funktion "vertausche". * Den Zeigern im Konstruktor, werden die Speicheradressen, der * Variablen a und b übergeben. * * * */ vertausche(&a,&b); printf("%d,%d\n",a,b); } void vertausche(int *a, int *b) { int c; /* *In c wird der Wert gespeichert, der in der Adresse abgelegt ist auf die der Zeiger * *a zeigt. Danach Werden die Adressen für den Zeiger *a und *b vertauscht. * Abschließend wird in der Adresse auf die der Zeiger *b der Wert c gespeichert. * Die Variable c dient nur als Hilfsvariable, da sonst unweigerlich ein Wert überschrieben würde. * * */ c = *a; *a = *b; *b = c; }
In den Komentaren wird ersichtlich, wie ich mir die Funktionsweise vorstelle.
Ich habe dazu jedoch im Wesentlichen zwei Fragen:
1. Ist das richtig ?
2. Was ist der Sinn von Zeigern? Also ist der Zugriff auf einen Wert über die Adresse Schneller etc. ( dazu hab ich in keinem Tutorial bisher was gefunden ).Wäre schön wenn mir das jemand beantworten könnte.
-
1. Sieht richtig aus
2. Der Zugriff via Zeiger ist nicht per se schneller. Sinnvoll sind Zeiger z.B. bei der Übergabe von Objekten an Funktionen. Dort wird der Parameter grundsätzlich kopiert. Wenn du nun zwei verschiedene Funktionen hast...
int times_two1 ( int a ){ return 2 * a; } int times_two2 ( int *a ) { return 2 * *a; }
wird im Falle von times_two1 ein int kopiert, im Falle on times_two2 wird ein Zeiger (auf int) kopiert. Auf einem normalen 32-Bit-System wird das keinen Unterschied machen, da das int sowie der Zeiger gleich groß sind (also üblicherweise 4 Bytes).
Wenn man aber z.B. Strukturen an eine Funktion übergibt, kann das einen deutlichen Unterschied machen...
struct vector_3D { double x; double y; double z; } double norm1_3D ( struct vector_3D a ){ return sqrt( a.x * a.x + a.y * a.y + a.z * a.z ); } double norm2_3D ( struct vector_3D *a ){ return sqrt( a->x * a->x + a->y * a->y + a->z * a->z ); }
Im Falle von norm1_3D wird jeweils die gesamte Struktur kopiert (höchstwahrscheinlich 3*8=24 Bytes), während bei norm2_3D wieder nur der Zeiger kopiert wird.
-
Vielen Dank für die Antwort. Ich muss mir jetzt noch angucken, was Strukturen sind ( bin noch absoluter C neuling ) jedoch verstehe ich richtig, da der Zeiger auf die gesamte Struktur zeigt, und Zeiger üblicher weise 4 Byte bzw. 32 Bit groß sind, ist es Schneller die Struktur über den Zeiger zu referenzieren bzw. zu kopieren anstatt die ganze 24 byte Struktur zu kopieren? Also werden quasi 4 Byte anstatt 24 Kopiert ?
-
also ist der Einsatz von zeigernerst bei größeren Anwendungen Sinnvoll, da es bei kleinen ja nicht auf Geschwindigkeit ankommt?
-
clemenshartmann schrieb:
also ist der Einsatz von zeigernerst bei größeren Anwendungen Sinnvoll, da es bei kleinen ja nicht auf Geschwindigkeit ankommt?
das kann man so nicht sagen. es gibt auch kleine programme, bei denen es auf geschwindigkeit ankommt. ausserdem ist der einsatz von zeigern oft sogar langsamer, weil ein zwischenschritt nötig ist (das sogenannte 'dereferenzieren').
-
Ist es nicht so das Zeiger zuerst mal dazu da sind "Referenzen" in C zu benutzen (lassen wir mal dynamische Speicherallokation raus)? Der Geschwindikgeitsvorteil bei der Übergabe einer größeren Struktur wird hier irgendwie als "einziger Grund" dargestellt.
@Orly?: Das nennt man Parameterlist und nicht Konstruktor.
Gruß
Don06
-
Don06 schrieb:
Ist es nicht so das Zeiger zuerst mal dazu da sind "Referenzen" in C zu benutzen
ja, stimmt. eine referenz ist ein verweis auf ein objekt oder eine variable. diese aufgabe übernehmen pointer in C. die referenzen in Java z.b. sind auch nichts anderes als pointer (naja, eigentlich sind es dort pointer auf pointer, aber egal). pointer sind ein sehr flexibles sprachmittel. sie ermöglichen indirekten zugriff auf variablen (und andere speicherzellen) und man kann natürlich viel mehr damit anstellen, als nur arrays und structs 'by reference' herumzureichen.
-
Don06 schrieb:
Der Geschwindikgeitsvorteil bei der Übergabe einer größeren Struktur wird hier irgendwie als "einziger Grund" dargestellt.
Es war ein Beispiel.
-
Tim schrieb:
Don06 schrieb:
Der Geschwindikgeitsvorteil bei der Übergabe einer größeren Struktur wird hier irgendwie als "einziger Grund" dargestellt.
Es war ein Beispiel.
clemenshartmann schrieb:
also ist der Einsatz von zeigernerst bei größeren Anwendungen Sinnvoll, da es bei kleinen ja nicht auf Geschwindigkeit ankommt?
Dem hatte bisher keiner direkt widersprochen (Apeman machte nur darauf aufmerksam, dass Geschwindigkeit auch in kleinen Programmen wichtig ist). Der Einsatz von Zeigern wird nicht (nur) dadurch nötig, dass man mehr Geschwindigkeit braucht.
Gruß
Don06
-
Don06 schrieb:
Tim schrieb:
Don06 schrieb:
Der Geschwindikgeitsvorteil bei der Übergabe einer größeren Struktur wird hier irgendwie als "einziger Grund" dargestellt.
Es war ein Beispiel.
clemenshartmann schrieb:
also ist der Einsatz von zeigernerst bei größeren Anwendungen Sinnvoll, da es bei kleinen ja nicht auf Geschwindigkeit ankommt?
Dem hatte bisher keiner direkt widersprochen (Apeman machte nur darauf aufmerksam, dass Geschwindigkeit auch in kleinen Programmen wichtig ist). Der Einsatz von Zeigern wird nicht (nur) dadurch nötig, dass man mehr Geschwindigkeit braucht.
Gruß
Don06Dann schreib das doch so, anstatt hier einfach anderen Leuten das Wort im Mund umzudrehen.