Zeiger, u. Referenzen - was zu welchem Zweck?



  • Hallo zusammen,
    ich lerne jetzt seit einiger Zeit die Sprache C und bleibe leider oft immer an dem Thema 'Zeiger' hängen.
    Mir fehlt es leider noch an Verständnis dafür.
    Das hängt sicher auch damit zusammen, das ich bisher nur Beispielcode für Lernzwecke gesehen habe.
    Ich hoffe Ihr könnt mir im Folgenden weiter helfen.

    Wann sollte man z.B. eher 'char arrays' einsetzen, wann 'pointer' und wann 'Referenzen'?
    Es sind ja oft mehrere Optionen möglich und in dem Lehrbuch (opengalileo) wird so finde ich, es leider nicht deutlich genug, wann man was zu welcher Situation nutzen sollte.
    Vielleicht sehe ich auch den Wald vor lauter Bäumen nicht, ich bin da etwas durcheinander.



  • Erstmal: Pointer sind keine Arrays und Arrays sind keine Pointer.

    Auch wenn es so Aussehen mag, da du bei beiden mit gleichen Operatoren auf den Inhalt zugreifst.
    (Der erste Grund für deine Verwirrung)

    Ein Array sthet in Größe und Speicherort nach der Definition fest.
    Ein Zeiger kann auch woanders hin zeigen. Zudem braucht der eigentliche Zeiger auch Speicher.
    Mit einem Zeiger allein hast du noch keinen Speicher auf den er zeigt.
    Den musst du erst noch besorgen/zuweisen.

    Zeiger sind normale Variablen, nur dass sie halt kein Zeichen oder Zahl speichern sondern eine Adresse.

    Bei der Übergabe (als Parameter) an eine Funktion zerfallen Arrays in ihre Anfangsadresse. (Der zweite Grund für deine Verwirrung).
    Andere Variablen werden als Kopie übergeben.

    Arrays nimmst du dann, wenn du viele Variablen vom selben Typ bearbeiten willst.
    Bei Zeichenketten (mehrere Variablen vom Typ char) bietet sich das an.

    Zeiger nimmst du u.a. dann, wenn du von verschiedenen Stellen auf dieselben Daten zugreifen willst.
    z.B aus Funktionen heraus.

    Referenzen gibt es in C nicht. Was als "call by reference" verkauft wird, ist ein "call by value" mit einer Adresse.

    Zu dem Buch: http://www.c-plusplus.net/forum/272350

    Ich hoffe das war jetzt nicht zu abschreckend formuliert.
    Wenn du mal mitteilst, wo es bei dir am Verständnis hakt, können wir auch genauer darauf eingehen.



  • Das war doch schonmal gut erklärt.
    Ich frage mich wie man ein 'char array' an zwei Funktionen übergibt, um es dann mit einer Buildin-Funktion zu bearbeiten.
    Ist vielleicht sinnfrei, aber jetzt rein theoretisch.
    Dazu hätte ich folgendes Beispiel, welches ja leider überhaupt nicht hinhaut:

    void f1 (char var[]) {
    	f2 (var);
    }
    
    void f2 (char var[]) {
    	strcpy (var, "Test");
    }
    
    int main ()
    {
    	char text[]="";
    
    	f1 (text);
    
    	return 1;
    }
    


  • Sunshen schrieb:

    Das war doch schonmal gut erklärt.
    Ich frage mich wie man ein 'char array' an zwei Funktionen übergibt, um es dann mit einer Buildin-Funktion zu bearbeiten.

    Arrays werden immer als Zeiger auf ihr erstes Element übergeben. Das ist in deinem Beispiel auch so, auch wenn es nicht so aussieht -- ein Arraytyp als Funktionsparameter steht immer für den entsprechenden Zeigertyp. (Das ist nur bei Funktionsparametern so.)

    Dazu hätte ich folgendes Beispiel, welches ja leider überhaupt nicht hinhaut:

    void f1 (char var[]) {
    	f2 (var);
    }
    
    void f2 (char var[]) {
    	strcpy (var, "Test");
    }
    
    int main ()
    {
    	char text[]="";
    
    	f1 (text);
    
    	return 1;
    }
    

    Prinzipiell kann man das so machen, allerdings kopierst du über strcpy 5 Elemente in das Array, das aber laut seiner Initialisierung nur Platz für 1 Element hat.

    Ich persönlich würde die Parameter direkt als Zeiger deklarieren. Wie gesagt, sie sind sowieso Zeiger, aber man sieht es ihnen noch nicht direkt an.



  • Achso, da liegt das Problem und ich probiere die ganze Zeit an den Argumenten herrum.


Anmelden zum Antworten