\begin{slide}{Zeiger- und Verweistypen}

Zeiger $=$ \emph{Adresse} eines Wertes. --- Wofür?

\begin{itemize}
\item
  dynamische Speicherzellen (im Heap)
\item
  verkettete Strukturen (Listen,  Bäume)
\item
  gemeinsame Teilstrukturen (sharing)
\item
  Adresse ist einfacher zu transportieren als Wert
\end{itemize}

Designfragen:
\begin{itemize}
\item
  Typsicherheit
\item
  Zeiger oder Verweis?
\item
  Verfolgung (De-Referenzierung) implizit oder explizit?
\end{itemize}

\end{slide}

\begin{slide}{Zeiger (pointer) in C}

Typ \verb|T|, Zeigertyp \verb|T * p| 

Adresse feststellen:
\begin{verbatim}
T x;
T * p = &x;
\end{verbatim}

Zeiger (einmal) verfolgen (de-referenzieren):
\begin{verbatim}
T y = *p;
\end{verbatim}

\bigskip

Vorsicht: \verb|int* a, b;|

\bigskip

Zeiger-Arithmetik:
\begin{verbatim}
char * c = malloc(sizeof(int) * 20);
*((int*)c + 4) = 42;
printf ("%d\n", *((int*)(c + 4)));
\end{verbatim}

\end{slide}

\begin{slide}{Verweise (references) in C++}

Typ \verb|T|, Verweistyp \verb|T & p| 

Adresse feststellen (implizit):
\begin{verbatim}
int x = 9;
int & p = x;
\end{verbatim}
Verweis verfolgen (implizit):
\begin{verbatim}
int y = p;
\end{verbatim}

\emph{keine} Änderungen von Verweisen
\begin{verbatim}
int z = 10; p = z;   p = 8; cout << z;  
    vgl.    p = &z; *p = 8; 
\end{verbatim}

\end{slide}

\begin{slide}{Zeiger/Verweise in Java?}

\begin{itemize}\itemsep 1pt\parskip 3pt
\item
  scheint es nicht zu geben\dots
\item 
  doch: es gibt Wert-Typen (int, boolean, \dots) \\
  und Verweis-Typen (alle Klassen)
\item
  (aber keine Zeiger)
\end{itemize}
\begin{verbatim}
static class T { int foo = 8; }
public static void main (String [] args) {
    T x = new T ();
    System.out.println ( x.foo );
    T y = x;
    y.foo = 9;
    System.out.println ( x.foo );
}
\end{verbatim}
\end{slide}

\begin{slide}{Probleme mit Zeigern}

\begin{itemize}
\item
  verschiedene Namen für gleiche Objekte (aliasing)
  erschweren Programmanalyse
\item
  tote Zeiger (wg. verfrühter Freigabe)
\begin{verbatim}
T *p = malloc (...); T *q = p; free (p); .. *q ..
\end{verbatim}
\item
  Speichermüll (wg. vergessener Freigabe)
\begin{verbatim}
while (.. ) 
  { T *p = malloc (...); .. *p .. }
\end{verbatim}

\end{itemize}

\end{slide}




%%% Local Variables: 
%%% mode: latex
%%% TeX-master: t
%%% End: 
