![]() |
Re: [C] Pointeroperationen in C
Zitat:
|
Re: [C] Pointeroperationen in C
Zitat:
Aber ich werde es noch mal etwas deutlischer aufschreiben. Zitat:
Zitat:
|
Re: [C] Pointeroperationen in C
Code:
Dein Kommentar ist korrekt.
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 */
Code:
Funktioniert nicht, weil "feld" als Symbol einen konstanten Wert hat (also kein L-Wert ist).
/* 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?) */
Code:
Der &-Operator liefert die Adresse eines Ausdrucks, und feld[3] ist das vierte Array-Element. Somit ist deine Aussage korrekt.
p = &feld[3]; /* der &-Operator liefert einen Pointer auf das vierte Arrayelement zurück */
Code:
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.
feld[2] = p[5]; /* p[5] liefert den um fünf mal Integergröße veschobenen Pointer zurück */
Code:
Deine Aussage ist korrekt.
p1 = p2 + i; /* Der Zeiger wird um einen Integerwert verschoben */
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:
Deine Aussage ist korrekt.
p1 = i + p2; /* Auch hier wird der Zeiger verschoben */
Code:
Deine Aussage ist korrekt.
/* Bei folgenden Zuweisungen bin ich mir recht unsicher: */
/* i = p1 * p2; */ /* Funktioniert nicht, da der *-Operator nicht für zwei Pointer definiert ist */
Code:
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:
i = p1 - p2; /* Wieso ist - denn für zwei Pointer definiert? */
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:
Die Addition ist für zwei Zeiger nicht definiert.
/* i = p1 + p2; */ /* Funktioniert nicht, da der *-Operator nicht für zwei Pointer definiert ist */
|
Re: [C] Pointeroperationen in C
Wir haben hier klassich aneinander vorbei geredet. Ich dachte, die Aussage
Zitat:
|
Re: [C] Pointeroperationen in C
Zitat:
Es geht doch ganz einfach:
Code:
Viele Grüsse,
p[5] == *(p+5)
Macci |
Re: [C] Pointeroperationen in C
Zitat:
|
Re: [C] Pointeroperationen in C
Zitat:
@Appolonius: Nix für ungut, aber akzeptier doch einfach, was p[n] bedeutet, anstatt immer wildere Casts zu entwerfen. :) @Macci: Mann kann p als int casten, auch wenn der Sinn des Ganzen gegen Null geht und nein, es ist kein Wortspiel, ich meine nicht NULL. "*4" --> Augen auf! Nicht auf jedem System ist sizeof(int) == 4 |
Re: [C] Pointeroperationen in C
Zitat:
Edit: Auf "manchen" ist untertrieben, es funktioniert schon auf den meisten (nicht jedoch auf allen). Aber es ist ganz schlechter Programmierstil. Viele Grüsse, Macci |
Re: [C] Pointeroperationen in C
@Macci: Ok, ich muß halt noch einen nachlegen (nicht persönlich nehmen).... Theorie und Praxis, das kennt man ja. Egal, was in dem Standardwerk auf Seite 4711 geschrieben steht, ich habe noch kein System erlebt, auf dem es nicht ging, denn, auch wenn die Theorie was anderes sagt, ist in der Praxis ein Pointer eine Adresse, welche nichts anderes ist, als ein xx-bit-Integer.
Aber, wie schon erwähnt, der Sinn des ganzen Rumgecastes geht in diesem Fall gegen Null (nicht NULL) :) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:08 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz