Pointer in C
Ein Pointer ist eine Variable. Der Inhalt eines Pointers ist eine Adresse.
man sagt: der Pointer ″zeigt″ auf einen Speicherplatz
/*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++; // funktioniert nicht
for (i = 0; i < 10; i++)
*pointer3++ = 0;
// besser lesbar: { *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'; //komplizierter
//praktisches Beispiel:
//in einem Integer-Array sollen alle MSB-Bytes gelöscht werden
int ary1[] = {0xaaaa, 0xbbbb, 0xcccc};
char* pointer4 = (char*)ary1; //Pointer auf den Anfang des Arrays
for (i = 0; i < sizeof(ary1) / sizeof(int); i++)
{
*pointer4 = 0;
pointer4 += 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;
}