AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

[C] Pointeroperationen in C

Ein Thema von Hador · begonnen am 15. Nov 2008 · letzter Beitrag vom 26. Nov 2008
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von Der Jan
Der Jan

Registriert seit: 22. Dez 2005
289 Beiträge
 
Delphi XE7 Ultimate
 
#11

Re: [C] Pointeroperationen in C

  Alt 15. Nov 2008, 17:49
Zitat von Hador:
Code:
   
   /* i = p1 + p2; */ /* Funktioniert nicht, da der *-Operator nicht für zwei Pointer definiert ist */

   [...]
}
Das würde auch gehen, wenn du p2 vorher nach int castest, allerdings ein Sinn dafür fällt mir aktuell nicht ein.
Gruß, Jan
  Mit Zitat antworten Zitat
Benutzerbild von Hador
Hador

Registriert seit: 11. Dez 2004
Ort: Recke
682 Beiträge
 
Turbo Delphi für Win32
 
#12

Re: [C] Pointeroperationen in C

  Alt 15. Nov 2008, 19:20
Zitat von Der Jan:
Ähm nicht ganz p[5] liefert das Feldelement mit dem Index 5, also das 6te Element zurück, allerdings ist der Ausdruck falsch, wenn auch syntaktisch richtig. feld[2] -> hier kann es dier ganz schnell mal ne AV raushauen, schau dir mal die Definition von feld an.
Der Pointer zeigt doch schon auf das erste Element und wenn ich ihn dann um fünf Elemente verschiebe zeigt er auf das Sechste
Aber ich werde es noch mal etwas deutlischer aufschreiben.

Zitat von Der Jan:
Edit: Vielleicht solltest du die Frage auch mal im CPP-Forum stellen, dort tummeln sich die C/C++ Experten
Jo, mal sehen. Sollte ich öfters Fragen in diese Richtung haben, so werde ich das auch wohl machen, aber für einmal wollte ich micht nicht noch extra irgendwo anmelden.

Zitat von Der Jan:
Zitat von Hador:
Code:
   
   /* i = p1 + p2; */ /* Funktioniert nicht, da der *-Operator nicht für zwei Pointer definiert ist */
Das würde auch gehen, wenn du p2 vorher nach int castest, allerdings ein Sinn dafür fällt mir aktuell nicht ein.
Casten ist nicht. Die Zuweisungen sind gegeben. Sonst würde man ja auch alles irgendwie durch den Compiler bekommen
Lars Kiesow
http://www.larskiesow.de

Computer gehorchen deinen Befehlen, nicht deinen Absichten.
  Mit Zitat antworten Zitat
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, 19: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
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#14

Re: [C] Pointeroperationen in C

  Alt 15. Nov 2008, 23:20
Wir haben hier klassich aneinander vorbei geredet. Ich dachte, die Aussage
Zitat:
p[5] liefert das Feldelement mit dem Index 5, also das 6te Element zurück
bezöge sich auf einen falschen Index. Anscheinend bezog sie sich aber darauf, dass der Array-Indizierungs-Operator gleichzeitig auch dereferenziert.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Macci

Registriert seit: 31. Mai 2007
129 Beiträge
 
#15

Re: [C] Pointeroperationen in C

  Alt 16. Nov 2008, 00:44
Zitat von Apollonius:
Doch, Hador hat recht. p[5] = *((int*)((int)p + 5*4))
So ist das aber Quatsch (p kann nicht als int-Wert gecastet werden).

Es geht doch ganz einfach:

Code:
p[5] == *(p+5)
Viele Grüsse,
Macci
  Mit Zitat antworten Zitat
Benutzerbild von Der Jan
Der Jan

Registriert seit: 22. Dez 2005
289 Beiträge
 
Delphi XE7 Ultimate
 
#16

Re: [C] Pointeroperationen in C

  Alt 16. Nov 2008, 06:03
Zitat von Hador:
Zitat von Der Jan:
Ähm nicht ganz p[5] liefert das Feldelement mit dem Index 5, also das 6te Element zurück, allerdings ist der Ausdruck falsch, wenn auch syntaktisch richtig. feld[2] -> hier kann es dier ganz schnell mal ne AV raushauen, schau dir mal die Definition von feld an.
Der Pointer zeigt doch schon auf das erste Element und wenn ich ihn dann um fünf Elemente verschiebe zeigt er auf das Sechste
Aber ich werde es noch mal etwas deutlischer aufschreiben.
Es wird hier aber kein Pointer irgendwohin verschoben, nicht ein Stückchen ! Mit "p[n]" bekommst du das n-te Element des Feldes zurück, in deinem Fall ein int, und keinen Pointer, wie nun schon mehrfach erwähnt.....
Gruß, Jan
  Mit Zitat antworten Zitat
Benutzerbild von Der Jan
Der Jan

Registriert seit: 22. Dez 2005
289 Beiträge
 
Delphi XE7 Ultimate
 
#17

Re: [C] Pointeroperationen in C

  Alt 16. Nov 2008, 06:21
Zitat von Macci:
Zitat von Apollonius:
Doch, Hador hat recht. p[5] = *((int*)((int)p + 5*4))
So ist das aber Quatsch (p kann nicht als int-Wert gecastet werden).

Es geht doch ganz einfach:

Code:
p[5] == *(p+5)
Viele Grüsse,
Macci
Es wird langsam echt abenteuerlich hier

@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
Gruß, Jan
  Mit Zitat antworten Zitat
Macci

Registriert seit: 31. Mai 2007
129 Beiträge
 
#18

Re: [C] Pointeroperationen in C

  Alt 16. Nov 2008, 13:07
Zitat von Der Jan:
@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.
Nein, im Allgemeinen wird das nicht funktionieren. Nur auf manchen Maschinen und nur unter manchen Übersetzern kann ein Zeiger als int-Wert gecastet werden. (siehe im Standardwerk "Programmieren in C", Kap. 5.6 "Zeiger sind keine ganzzahligen Werte", S. 111).

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
  Mit Zitat antworten Zitat
Benutzerbild von Der Jan
Der Jan

Registriert seit: 22. Dez 2005
289 Beiträge
 
Delphi XE7 Ultimate
 
#19

Re: [C] Pointeroperationen in C

  Alt 26. Nov 2008, 02:23
@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)
Gruß, Jan
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:38 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz