Einzelnen Beitrag anzeigen

Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#13

Re: [C] Pointeroperationen in C

  Alt 15. Nov 2008, 18:23
Code:
int main(void) {
   int feld[1];
   int i;
   int *p;
   int *p1;
   int *p2;

   p = feld; /* Funktioniert, da feld ein Pointer auf das erste Arrayelement ist und es sich um ein Integerarray handelt */
Dein Kommentar ist korrekt.

Code:
   /* feld = p; */ /* Funktioniert nicht, da p nicht zwangsläufig auf ein Integerarray zeigt (Aber auf einen int und das wäre ja das selbe, wie ein einelementiges Array, oder?) */
Funktioniert nicht, weil "feld" als Symbol einen konstanten Wert hat (also kein L-Wert ist).

Code:
   p = &feld[3]; /* der &-Operator liefert einen Pointer auf das vierte Arrayelement zurück */
Der &-Operator liefert die Adresse eines Ausdrucks, und feld[3] ist das vierte Array-Element. Somit ist deine Aussage korrekt.

Code:
   feld[2] = p[5]; /* p[5] liefert den um fünf mal Integergröße veschobenen Pointer zurück */
Die Indizierung eines Zeigers basiert in C immer auf der Größe des Datentyps, auf den der Zeiger zeigt. Bei einem "int*" werden jeweils "int"-Element indiziert. "p[5]" liefert keinen Zeiger zurück, sondern direkt den Wert des 6ten Elements des Arrays, auf das p zeigt.

Code:
   p1 = p2 + i; /* Der Zeiger wird um einen Integerwert verschoben */
Deine Aussage ist korrekt.
Auch hier gilt die Aussage von oben: die Addition einer Zahl zu einem Zeiger basiert auf der Größe des Datentyps, auf den der Zeiger zeigt. Somit ist "p[5]" von oben gleichwertig mit "*(p + 5)".

Code:
   p1 = i + p2; /* Auch hier wird der Zeiger verschoben */
Deine Aussage ist korrekt.

Code:
   /* Bei folgenden Zuweisungen bin ich mir recht unsicher: */
   /* i = p1 * p2; */ /* Funktioniert nicht, da der *-Operator nicht für zwei Pointer definiert ist */
Deine Aussage ist korrekt.

Code:
   i = p1 - p2; /* Wieso ist - denn für zwei Pointer definiert? */
Genauso wie die Addition eines Zeigers und eines Integer-Wertes wieder einen Zeiger liefert, liefert die Subtraktion zweier Zeiger einen Integer-Wert: nämlich den, den du zum zweiten Zeiger hinzuzählen müsstest um den ersten Zeiger zu erhalten. Beispiel:
Code:
p = &feld[3];
i = p - feld; // i hat jetzt den Wert 3

p1 = &feld[3];
p2 = &feld[5];
i = p2 - p1; // i hat jetzt den Wert 2

p1 = feld + 3;
p2 = p1 + 4;
i = p2 - p1; // i hat jetzt den Wert 4
Code:
   /* i = p1 + p2; */ /* Funktioniert nicht, da der *-Operator nicht für zwei Pointer definiert ist */
Die Addition ist für zwei Zeiger nicht definiert.
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat