5. Übung
Bearbeitung vom 22.11.06 - 27.11.06
Aufgabe 1: Arrays
Mit dem Pointer pa läßt sich auf beliebige Arraykomponenten zugreifen. Per Definition zeigt nämlich (pa+1) auf das nächste Arrayelement, also a[1]. *(pa+1) ergibt den Wert, der unter a[1] abgespeichert ist. Allgemein gilt, daß (pa+i) auf a[i] verweist und *(pa+i) den Wert a[i] besitzt. Es ist sogar erlaubt, den Zugriff *(pa+i) wie den üblichen Zugriff auf Arrays zu spezifizieren, also pa[i]. Zusammenfassend kann man die Werte des Arrays ansprechen mit a[4] = pa[4] = *(pa+4) = *(a+4) = 4[a].
Man bedenke also immer, daß ein Vektor nichts anderes ist als ein konstanter Zeiger (kann daher nicht verändert werden) auf den Anfang des Vektors ist. Dieses ist insbesondere dann von Bedeutung, wenn Vektoren als Parameter von Funktionen oder als Ergebnis einer Funktion definiert werden. Die Angabe a[i] ist eine Kurzschreibweise für *(a+i) , wobei a den Anfang des Vektors angibt (konstanter Zeiger). Da diese Addition kommutativ ist, gilt für die Addressrechnung *(a+i) = *(i + a). Daher läßt sich kurioserweise die Vektorkomponente auch mit i[a] ansprechen. Der C++ Compiler sieht dieses (bis jetzt noch) nicht als Fehler an. Unsrere Lösung ist also:
  
  cout << pa      << endl;   0xbfffa600    Adresse von a[0]
  cout << a[4]    << endl;   4             Wert des 4.ten Elementes
  cout << &(*pa)  << endl;   0xbfffa600    Zeiger des 0.ten Elementes ( = pa)    
  cout << *(pa+8) << endl;   8             Wert des 8.ten Elementes
  cout << pa+1    << endl;   0xbfffa604    Adresse des 1.ten Elementes 
                                           (+4 dezimal bei Integer- Werten) 
  cout << pa[5]   << endl;   5             Wert des 5.ten Elementes 
                                           (aufpassen: nicht der Zeiger 
                                            auf 5. Element !!! 
  cout << &a[2]   << endl;   0xbfffa608    Adresse des 2.ten Elementes
                                           (+ 2*4 dezimal bei Integer)
  cout << *(7+a)  << endl;   7             Wert des 7.ten Elementes
  cout << 3[a]    << endl;   3             Wert des 3.ten Elementes
  cout << &3[a]   << endl;   0xbfffa612    Adresse des 3.ten Elementes
                                           (+3*4 dezimal bei Integer)
Aufgabe 2: Character- Arrays
Die ursprüngliche Lösung ist in string_correct.cc wiedergegeben.
Aufgabe 3: Funktionsaufrufe
Die Übergabe als Pointer und als Referenz ist in swap1 und swap2 gezeigt. swap3 und swap4 machen das gleiche, aber ohne die Hilfsvariable. Nur für Leute mit kleinem RAM- Speicher zu empfehlen ( siehe swap.cc ).
Aufgabe 4: Arrays als Funktionsargumente (Zusatzaufgabe)
Das Programm ist in string_function.cc gelisted.



Harm Fesefeldt
2006-11-21