\documentstyle[11pt,german,epsfig,uebung]{article}
\begin{document}
\briefkopf
\LARGE
\centerline{5. "Ubung}
\large
\centerline{Bearbeitung vom 22.11.06 - 27.11.06}
\vskip 0.1cm
\normalsize
{\bf Aufgabe 1: Arrays}\newline
Mit dem Pointer \tt pa \rm l"a"st sich auf beliebige Arraykomponenten zugreifen. Per Definition zeigt n"amlich
\tt (pa+1) \rm auf das n"achste Arrayelement, also \tt a[1]. \rm \tt *(pa+1) \rm ergibt den Wert, der unter
\tt a[1] \rm abgespeichert ist. Allgemein gilt, da"s \tt (pa+i) \rm auf \tt a[i] \rm verweist und \tt *(pa+i) \rm
den Wert \tt a[i] \rm besitzt. Es ist sogar erlaubt, den Zugriff \tt *(pa+i) \rm wie den "ublichen Zugriff
auf Arrays zu spezifizieren, also \tt pa[i]. \rm Zusammenfassend kann man die Werte des Arrays ansprechen mit 
\tt a[4] = pa[4] = *(pa+4) = *(a+4) = 4[a]. \rm \newline
Man bedenke also immer, da"s ein Vektor nichts anderes ist als ein konstanter Zeiger (kann daher nicht ver"andert
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 \tt a[i] \rm ist eine Kurzschreibweise 
f"ur \tt *(a+i) \rm, wobei \tt a \rm den Anfang des Vektors angibt (konstanter Zeiger). Da diese Addition 
kommutativ ist, gilt f"ur die Addressrechnung \tt *(a+i) = *(i + a). \rm Daher l"a"st sich kurioserweise 
die Vektorkomponente auch mit \tt i[a] \rm ansprechen. Der C++ Compiler sieht dieses (bis jetzt noch) nicht als
Fehler an. Unsrere L"osung ist also:   \newline
\begin{verbatim}  
  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)
\end{verbatim}                       
\vskip 0.5cm                     
{\bf Aufgabe 2: Character- Arrays} \newline
Die urspr"ungliche L"osung ist in \tt string$\_$correct.cc \rm wiedergegeben. 
\newline \vskip 0.5cm
{\bf Aufgabe 3: Funktionsaufrufe} \newline 
Die "Ubergabe als Pointer und als Referenz ist in \tt swap1 \rm und \tt swap2 \rm gezeigt. \tt swap3 \rm und
\tt swap4 \rm machen das gleiche, aber ohne die Hilfsvariable. Nur f"ur Leute mit kleinem RAM- Speicher
zu empfehlen.  
\newpage
{\bf Aufgabe 4: Arrays als Funktionsargumente} (Zusatzaufgabe) \newline
Das Programm ist in \tt string_function.cc \rm gelisted.
\end{document}
