10.14    Kontrollfragen und Aufgaben

  1. Versuchen Sie, die grundlegende Funktion von Zeigern zu erläutern. Woran erkennt man einen Zeiger?

  2. Welche Gefahr entsteht beim Initialisieren von Zeigern?

  3. Was versteht man unter einer Dereferenzierung?

  4. Was ist der NULL-Zeiger, und wozu ist er gut?

  5. Was ist ein void-Zeiger, und wozu wird er verwendet?

  6. Da die Position der Typ-Qualifizierer recht flexibel ist, ergeben sich unterschiedliche Möglichkeiten, bei denen besonders gerne der Qualifizierer const verwendet wird. Wenn const bei Zeigern verwendet wird – ab wann ist dann die Rede von konstanten Daten und ab wann von konstanten Zeigern?

  7. Welcher Fehler wurde hier gemacht?

    01  int *ptr;
    02 int ival;
    03 ptr = ival;
    04 *ptr = 255;
  8. Welcher Wert wird mit den beiden printf()-Anweisungen in den Zeilen (06) und (07) ausgegeben?

    01  int *ptr = NULL;
    02 int ival;
    03 ptr = &ival;
    04 ival = 98765432;
    05 *ptr = 12345679;
    06 printf("%d\n", ival);
    07 printf("%d\n", *ptr);
  9. Was geben die printf()-Anweisungen in den Zeilen (07) bis (11) auf dem Bildschirm aus?

    01  int iarray[] = { 12, 34, 56, 78, 90, 23, 45 };
    02 int *ptr1=NULL, *ptr2=NULL;

    03 ptr1 = iarray;
    04 ptr2 = &iarray[4];
    05 ptr1+=2;
    06 ptr2++;

    07 printf("%d\n", *ptr1);
    08 printf("%d\n", *ptr2);
    09 printf("%td\n", ptr2 - ptr1);
    10 printf("%d\n", (ptr1 < ptr2));
    11 printf("%d\n", ((*ptr1) < (*ptr2)));
  10. Das folgende Listing soll in einem String einen bestimmten Buchstaben suchen und ab dieser Fundstelle eine Adresse auf dem String zurückgeben. Im Beispiel wird mit dem Aufruf der Funktion mysearch() in Zeile (18) »Hallo Welt« nach dem Buchstaben W gesucht. Die Funktion gibt nur noch einen String bzw. die Anfangsadresse ab W zurück. Im Beispiel müsste die printf()-Ausgabe der Zeile (19) somit »Welt« lauten. Im Beispiel werden allerdings nur scheinbar beliebige Zeichen ausgegeben. Wo liegt der Fehler?

    00  // Kapitel10/aufgabe001.c
    01 #include <stdio.h>
    02 #include <stdlib.h>
    03 #include <string.h>
    04 #define MAX 255

    05 char *mysearch( char *str, char ch ) {
    06 char buf[MAX] = "";
    07 int i = 0;
    08 while( str[i] != '\0' ) {
    09 if( str[i] == ch ) {
    10 strncpy(buf, &str[i], MAX);
    11 return buf;
    12 }
    13 i++;
    14 }
    15 return buf;
    16 }

    17 int main(void) {
    18 char *str = mysearch("Hallo Welt", 'W');
    19 printf("%s\n", str);
    20 return EXIT_SUCCESS;
    21 }
  11. Wo ist der Unterschied zwischen den folgenden beiden Deklarationen?

    char *str1  = "Hallo Welt";
    char str2[] = "Hallo Welt";
  12. Schreiben Sie eine Funktion, mit der Sie einen Ganzzahlenwert (int) in einen String konvertieren können.

  13. Verbessern Sie im folgenden Listing die Funktion Vquader(), mit der das Volumen eines Quaders berechnet und zurückgegeben wird. Verwenden Sie für das Programm Zeiger als Parameter anstatt die Parameter als Kopie zu übergeben.

    01  double Vquader(double a, double b, double c) {
    02 static double volumen;
    03 volumen = a * b * c;
    04 return volumen;
    05 }
  14. Schreiben Sie ein Programm, das einen String von der Tastatur einliest und diesen anhand der Trennzeichen " ,.:!?\t\n" in einzelne Wörter zerlegt. Speichern Sie die einzelnen Wörter in Zeiger-Arrays.

    Tipp: Sie können zum Zerlegen auch die Funktion strtok() aus der Header-Datei string.h verwenden.

Im nächsten Kapitel geht es noch einmal um Zeiger, diesmal zusammen mit der dynamischen Speicherverwaltung. Hier erfahren Sie, wie Sie Speicher zur Laufzeit anfordern und bei Bedarf wieder an das System zurückgeben können.