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.