/*

* AVR und Pointer (c) Kner 2007

*

*/


char global1; // Speichersegment .bss wird am Programmanfang gelöscht;

// wird verwendet für nicht initialisierte globale und static Variable

char global2 = 3; //.data wird am Programmanfang ins RAM kopiert


char err_str[] = "Your program has died a horrible death!"; //im .data und im Flash


char uebergabe_Wert(char x); //Prototypen

void uebergabe_Adresse(char* x);


int main(){

char i;

char local1 = 'A'; //am Stack

char local2; //am Stack


char *pointer1 = &local1; //auf welche Adressen zeigen die Pointer?

char *pointer2 = &global1;

char *pointer3 = &global2;


pointer1 = global2; // "Pointer umbiegen"

*pointer1 = 0x11; // dem Pointer nachgehen


*pointer2 = 0x22;

*pointer3 = 0x33;

pointer3++;

*pointer3 = 0x34; //schwerer Programmierfehler: der Speicherbereich, auf den Pointer3

//jetzt zeigt gehört eigentlich err_str


pointer3 = err_str; // err_str ist ein konstanter Pointer (kann man nicht verändern

// err_str++ funzt also nicht

//err_str++;

for (i=0; i<10; i++) *pointer3++ = 0; // C-isch; besser: { *pointer3 = 0; pointer3++;}

//ist das Gleiche wie

for (i=0; i<10; i++) err_str[i] = 0; //besser lesbar



err_str[3] = 'B';

*(err_str+3) = 'C'; //warum einfach, wenn's auch kompliziert geht



//praktisches Beispiel:

//in einem Integer-Array sollen alle MSB-Bytes gelöscht werden


int ary1[]={0xaaaa,0xbbbb,0xcccc};

pointer1 = ary1; //Pointer auf den Anfang des Arrays

for (i=0; i<sizeof(ary1)/sizeof(int); i++) {

*pointer1 = 0;

pointer1 +=2; //auf die nächste Zahl stellen

}


//eigentlicher Hauptzweck von Pointern: Austausch von Daten


global1 = 3;

pointer1 = &global1;

*pointer1 = 2; //verändert global1


// Austausch von Daten mit einem Unterprogramm

char local3 = 7;

local3 = uebergabe_Wert(local3);

uebergabe_Adresse(&local3); //jetzt weiß das Unterprg., wo local3 wohnt und kann

// dort ein Paket ablegen

while (1);

}


char uebergabe_Wert(char x){

return x*2;

}

void uebergabe_Adresse(char* x){

char h = *x;

*x = h+13;

}