patrickk83 hat geschrieben:Hallo Leute!
Meine letzten C-Programme liegen schon einige Jahre zurück. Ich bin auf einen programmcode gestoßen, der
mir nicht ganz logisch bzw. richtig erscheint. Aber wie gesagt, ich versuche gerade wieder meine Kentnisse neu
aufzufrischen. Mit den Zeigern hatte ich zu Schulzeiten schon so meine Schwierigkeiten bzw. dieses Thema war für
uns für das Programmieren von uControllern scheinbar nicht wirklich relevant. Aber egal. Ich füge mal ein paar kurze
Code-Zeilen an und würde gerne eure Meinung darüber erfahren (die Zeilen sind nicht geordnet und sollen nur zum Verständnis erklärt werden).
Code: Alles auswählen
1: unsigned int x=0;
2: unsigned char a[512];
3: unsigned char *zeiger = a + (sizeof(a)/2);
4: zeiger--;
5: if (zeiger > a + sizeof(a)) zeiger++[0] = x;
Zeile 3: Hier wird doch keine Adresse übergeben sondern ein Wert oder irre ich mich? Müsste
hier nicht & (a + (sizeof(a)/2)) stehen damit der Zeiger auf eine Adresse zeigt?
a wird wie ein Zeiger behandelt. a entspricht &a[0]. sizeof(a) ist 512, das ganze durch 2 ist 256. a+256 entspricht a[256] oder - wie ich es an Zeile 5 sehe, magst Du es lieber kryptisch: 256[a] wäre auch okay.
Zeile 4: Wird hier die Adresse, auf die der Zeiger verweist, dekrementiert?
Adressen sind immer Konstant. Der Wert, auf den Zeiger zeigt, bleibt unverändert, denn da steht nur Zeiger, also wird auch Zeiger dekrementiert. Zeiger zeigt anschließend auf a[255].
Möchtest du den Wert verändern, muss der Zeiger dereferenziert werden: (*zeiger)--
Zeile 5: Diese Zeile verwirrt mich komplett. Müsste hier nicht der * Operator davor?
Wenn Dich eine Zeile verwirrt, ändere sie.
Mich verwirrt sie auch und ich programmiere seit 20 Jahren C und C++.
Sowas sollte man entsprechend refactoren.
Die gewünschte Aussage ist vermutlich, dass Zeiger nicht über das Array hinauslaufen soll. Du fragst auf größer ab: Die Zuweisung findet also nur dann statt, wenn hinter das Array geschrieben werden soll. Gewünscht ist also vermutlich Zeiger < a + sizeof(a).
zeiger++ bedeutet, dass der Zeiger erhöht wird, aber der ursprüngliche Wert zurückgegeben wird und nicht der erhöhte.
Zeiger zeigt auf das 255. Nach der Operation zeigt Zeiger auf das 256. Element, aber das Resultat von Zeiger++ ist ein Zeiger auf das 255. Element. Darauf wird zugegriffen: a[255] = x.
Eselsbrücke: C++ gibt den gleichen Wert zurück wie C. Eigentlich müsste die Sprache ++C heißen, damit sie einen höheren Rückgabewert hat, nämlich den, den C nach der Inkrementierung besitzt.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.