Zeiger

Zeiger sind die "Kobolde" in C (und in C++). Man muss bei Zeigern sehr aufpassen, was man da programmiert!

Auch als Funktionsparameter kann man Zeiger verwenden: In diesen Videos wird der so genannte "Call by Reference" angewandt:


Zeiger sind sehr nützlich, wenn man Variablen manipulieren muss.

Zeiger sind auch sehr nützlich, wenn es um Zeichenketten gehen muss. Ein Wort oder eine Zeichenkette ist ja mehr als ein einzelner Buchstabe. Ein Buchstabe passt in die Variable char; eine Zeichenkette passt in die Variable char ... [] oder char*.

/* strchr4.c  */
#include <stdio.h>
#include <string.h>/* strchr */

int chrsuche(char*, char);

int main()
{
    printf("Ein Programm mit strchr ...\n");
    char a[] = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','\0'};
    char b[] = {'m','n','o','p','q','r','s','t','u','v','w','y','x','z','\0'};
    char c[] = {'b','c','d','e','f','g','h','i','t','u','v','w','x','y','z','\0'};
    char f='a';
    char g='x';
    char h='m';
    int i = chrsuche(a, f);
    int j = chrsuche(b, g);
    int k = chrsuche(c, h);
    printf("%d  %d  %d\n", i, j, k);
    return 0;
}

int chrsuche(char* d, char e)
 {
     char * x = strchr(d, e);
     if (x) return x-d+1;/* gefundene Stelle */
     else return 0;
 }


/* geheim.c */
#include <stdio.h> /* printf */
#include <stdlib.h> //rand,srand
#include <time.h>//srand(time...
#include <conio.h> //getch(),getche()

int jedesistgut[21];

struct bezeichnung
 {
     char * wort; //Ein Wort wird hier gespeichert.
     char posneg; //+ oder - wird gespeichert.
 };//struct
struct bezeichnung b[21]; //Vektor mit Strukturen

const int MAX = 21;
int gut;
int merker = 0;

int main()
 {
     //Zufall initialisieren:
    srand(time(NULL));
    printf("Gesetzmaessigkeiten\n");
     printf("-------------------\n");
     printf("Bitte + (plus) ODER - (minus) eintippen!\n");
     b[0].wort = "Gartenstuhl";
     b[0].posneg = '-';
     b[1].wort = "Birke";
     b[1].posneg = '+';
    b[2].wort = "Gartentisch";
    b[2].posneg = '-';
    b[3].wort = "Blaetter";
    b[3].posneg = '+';
    b[4].wort = "Einfassung";
    b[4].posneg = '-';
    b[5].wort = "Buche";
    b[5].posneg = '+';
    b[6].wort = "Wohnzimmer";
    b[6].posneg = '-';
    b[7].wort = "Rinde";
    b[7].posneg = '+';
    b[8].wort ="Telefon";
    b[8].posneg = '-';
    b[9].wort = "Laub";
    b[9].posneg = '+';
    b[10].wort = "Gartenzaun";
    b[10].posneg = '-';
    b[11].wort = "Moos";
    b[11].posneg = '+';
    b[12].wort="Lampe";
    b[12].posneg= '-';
    b[13].wort= "Bach";
    b[13].posneg= '+';
    b[14].wort= "CD-Player";
    b[14].posneg = '-';
    b[15].wort= "Eiche";
    b[15].posneg= '+';
    b[16].wort = "Gartenzwerg";
    b[16].posneg = '-';
    b[17].wort="Ast";
    b[17].posneg = '+';
    b[18].wort= "Zimmer";
    b[18].posneg= '-';
    b[19].wort = "Busch";
    b[19].posneg = '+';
    b[20].wort = "Toilette";
    b[20].posneg = '-';
    char ein;//+ -
    char janein = 'a';// j oder n
    do
    {
   
        //Mischen:
        int j;
        for (j=0; j<MAX; j++)
        {
            int zuf = rand() % MAX;
            struct bezeichnung temp = b[j];
            b[j] = b[zuf]; //Tausch
            b[zuf] = temp; //Tausch
        }//for j mischt
   
    //Einlesen von + oder -  :::
    int i;
    for (i=0; i<MAX; i++)
    {
       do {
        printf("\n+- Wie entscheiden Sie ?-> %s  ", b[i].wort); //vor dem Einlesen
        ein = getche(); //Das Einlesen von + oder -
       }while (ein != '+' && ein != '-');
       if (ein == b[i].posneg)
       {
            printf(" Richtig.");
            jedesistgut[i] = 1;
       }
       else
       {
           printf(" Falsch.");
           jedesistgut[i] = 0;
       }//else
    }//for i   
   
    //Erste Auswertung:
    //int zus=0;
    //for (int r=0; r<MAX; r++)
    //    zus += jedesistgut[r];//for r
    //if (zus > 20) cout <<endl<< "Exzellent.";
    //else if (zus > 19) cout <<endl<< "Beinahe exzellent geloest!";
    //else if (zus>10) cout <<endl<< zus << " Richtige immerhin.";
    //else cout <<endl<< "Nicht so gut.";
    printf("\n-----------------------------------------------------------");
    //Zweite Auswertung:
    int a;
    if (merker == 1)
        a=0;
    else a = 10;
    int k;
    for (k=a; k<MAX; k++)
    {
        if (jedesistgut[k] == 1) gut = 1;
        else { gut = 0; break; }
    }//for k
    if (gut == 1) printf("\nJa, Sie haben es erraten!!!!");
    else
    {
     do
     {
        printf("\nNicht so gut. Ueben Sie nochmal (j/n und Enter) ");
        scanf("%c", janein);
     } while (janein != 'n' && janein != 'j');
}
    if (janein == 'j') merker = 1;
    //else goto Label; //else
  } while (gut == 0 || janein=='n');
   printf("\nEs war alles, was etwas mit Wald zu tun hat.");
   getch();
   return 0;
}//main (Hauptprogramm) Ende
 



Auch mit Zeigern