Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
c:func:callbyreference [2008/11/09 13:08]
dani93
c:func:callbyreference [2022/11/21 22:34] (aktuell)
nufan
Zeile 1: Zeile 1:
-====== ​call by reference ​======+====== ​Call by Reference ​======
 Bisher haben wir nur die Werte von Variablen an Funktionen übergeben. Diese Art der Parameterübergabe wird "call by value" genannt. Sie hat den Nachteil, dass nur ein Wert mit return zurückgegeben werden kann.  Bisher haben wir nur die Werte von Variablen an Funktionen übergeben. Diese Art der Parameterübergabe wird "call by value" genannt. Sie hat den Nachteil, dass nur ein Wert mit return zurückgegeben werden kann. 
 Soll aber eine oder mehrere Variablen in der Funktion verändert werden, so muss als Parameter die Adresse der Variable übergeben werden. Oder anders gesagt ein Zeiger auf diese Variable ("call by reference"​). Die Adresse übergibt man bei einfachen Variablen mit dem Adressoperator &​. ​ Soll aber eine oder mehrere Variablen in der Funktion verändert werden, so muss als Parameter die Adresse der Variable übergeben werden. Oder anders gesagt ein Zeiger auf diese Variable ("call by reference"​). Die Adresse übergibt man bei einfachen Variablen mit dem Adressoperator &​. ​
Zeile 10: Zeile 10:
 int main () int main ()
 { {
- 
   int x=5;   int x=5;
   int y=7;   int y=7;
Zeile 19: Zeile 18:
  
   return 0;   return 0;
- 
 } }
  
 void swap (int *p1, int *p2) void swap (int *p1, int *p2)
 { {
- 
   int help;   int help;
  
Zeile 30: Zeile 27:
   *p1=*p2;   *p1=*p2;
   *p2=help;   *p2=help;
- 
 }</​code>​ }</​code>​
  
Zeile 49: Zeile 45:
 ===== Arrays als Parameter ===== ===== Arrays als Parameter =====
 In C besteht ein sehr enger Zusammenhang zwischen Arrays und Zeigern. In C besteht ein sehr enger Zusammenhang zwischen Arrays und Zeigern.
-Wie im Kapitel [[c:​array|Arrays]] erklärt, ist der Name des Feldes (ohne Indexklammern) nichts anders als ein Zeiger auf das erste Feldelement. Aus diesem Grund ist der Adressoperator bei der Übergabe an die Funktion nicht nötig.+Wie im Kapitel [[c:type:​array|Arrays]] erklärt, ist der Name des Feldes (ohne Indexklammern) nichts anders als ein Zeiger auf das erste Feldelement. Aus diesem Grund ist der Adressoperator bei der Übergabe an die Funktion nicht nötig.
  
 Beispiel: Beispiel:
Zeile 58: Zeile 54:
 int main () int main ()
 { {
- +  ​int a[]={5, 4, 3, 2, 1}, i;
-  ​int a[5]={5, 4, 3, 2, 1}, i;+
  
   sort (a);                           // kein & !!!   sort (a);                           // kein & !!!
Zeile 67: Zeile 62:
  
   return 0;   return 0;
- 
 } }
  
 void sort (int *p)                    // oder int p[] void sort (int *p)                    // oder int p[]
 { {
- 
 ... ...
- 
 }</​code>​ }</​code>​
  
Zeile 85: Zeile 77:
 Beispiel: Beispiel:
 <code cpp> <code cpp>
-void print_array (int *p, int size_of_array) ​           // *p ist ein Zeiger auf das 1. Element eines Arrays und size_of_array gibt die Länge des Arrays an+void print_array (int *p, int size_of_array) ​           // *p ist ein Zeiger auf das 1. Element eines Arrays und  
 +                                                        // size_of_array gibt die Länge des Arrays an
 { {
- 
   int i;   int i;
  
   for (i=0; i<​size_of_array;​ i++, p++)   for (i=0; i<​size_of_array;​ i++, p++)
     printf ("​%d\n",​ *p);     printf ("​%d\n",​ *p);
- 
 }</​code>​ }</​code>​
  
Zeile 110: Zeile 101:
 int main () int main ()
 { {
- 
   char string[]={"​Hallo\0"​},​ ch = '​a';​   char string[]={"​Hallo\0"​},​ ch = '​a';​
   char *first;   char *first;
Zeile 120: Zeile 110:
   if (first != NULL)   if (first != NULL)
     printf ("​%c\n\n",​ *first);     printf ("​%c\n\n",​ *first);
- +  else 
-    ​else +    printf ("​Zeichen nicht vorhanden\n\n"​);​
-      ​printf ("​Zeichen nicht vorhanden\n\n"​);​+
  
   return 0;   return 0;
- 
 } }
  
Zeile 131: Zeile 119:
 char* first_occurance (char *string, char ch)      // Rückgabetyp ist ein Pointer vom Typ char, deshalb char*  char* first_occurance (char *string, char ch)      // Rückgabetyp ist ein Pointer vom Typ char, deshalb char* 
 { {
- 
   char *p;   char *p;
  
   while (*string != '​\0'​) ​                         // sucht bis zum Ende des Strings   while (*string != '​\0'​) ​                         // sucht bis zum Ende des Strings
   {   {
-  ​ 
     if (*string == ch)                             // Zeichen gefunden     if (*string == ch)                             // Zeichen gefunden
     {     {
- 
       p = string; ​                                 // p zeigt auf das Zeichen und wird zurückgegeben       p = string; ​                                 // p zeigt auf das Zeichen und wird zurückgegeben
       return p;       return p;
- 
     }     }
     ​     ​
     string++; ​                                     // nächstes Zeichen wird überprüft     string++; ​                                     // nächstes Zeichen wird überprüft
- 
   }   }
  
   return 0;                                        // Zeichen nicht gefunden   return 0;                                        // Zeichen nicht gefunden
- 
 }</​code>​ }</​code>​