Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Verständnis über Pointer (Aufgabe)

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
26.02.2009, 21:27 Uhr
öni



Hab mal das Forum über Pointer durchsucht hab viel gefunden, aber nur ein Thread der dem ähnelt was ich suche:

www.fun-soft.de/showtopic.php?threadid=18226

Allerdings stellt sich immer noch meine Frage zu einer Aufgabe die unser Dozent gestellt hat. Hab zwar die Lösung aber komm nicht dahinter


C++:
      char *cp[]={"GERICHT", "SEIN", "MODE"};
      char **cpp = cp;

      printf("%s ", *++cpp     );  //SEIN  ->zeiger bleibt auf 2. wort, bindet eigentlich  ++ stärker als der * oder wird das eben einfach nur früher ausgeführt?
      printf("%s ", *(cpp+1)+1 );  //ODE   ->nun um 1 erhöht also 3.wort und davon 1.position
      printf("%c ", *(cp[0]+2) );  //R     ->1. wort + 2. Position ist R
      printf("%c ", *(*cpp+3)  );  //N     ->zeiger sollte nun weiterhin auf 3.wort zeigen somit E ist aber N
      printf("%s ", *--cpp+3   );  //ICHT  ->vom 2. wort aufs erste plus 3 zeichen verrückt
      printf("%s ", cp[1]      );  //SEIN  ->2. wort





Ich verstehe nicht wie man auf N kommt ich dachte das der Pointer immer beim letzten Wort bzw. beim letzten Wert stehen bleibt.

Wäre nette wenn mir jemand auf die Sprünge hilft.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
26.02.2009, 23:31 Uhr
Kest
saint


Hi!

Präfix vor *. Postfix nach *. (* = Zeigerzugriff)

cpp wird einmal beim ersten printf imkrementiert. Beim zweiten printf wird nur die Kopie verändert, cpp selbst nicht.
--
Wenn man einen Hufschlag hört, sollte man >Pferd< denken und nicht >Zebra<.

Dieser Post wurde am 26.02.2009 um 23:38 Uhr von Kest editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
27.02.2009, 00:35 Uhr
öni



Wieso beim 2. mal nur die Kopie? Wo ist hier der Unterschied zwischen ++ und +1 ?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
27.02.2009, 00:59 Uhr
0xdeadbeef
Gott
(Operator)


++ und -- binden in jedem Fall stärker als *. Postfix bindet dabei stärker als Präfix, wobei das eher selten von praktischer Bedeutung ist. Wikipedia hat eine sehr nützliche Tabelle, in der das aufgelistet ist.

Der Unterschied zwischen ++ und +1 ist, dass ++ die Variable verändert (komische Operatorüberladungen in C++ mal ausgenommen), während cpp + 1 das unterlässt.

Kleiner technischer Exkurs: Man kann hier zwar vereinfachend von einer Kopie reden, insofern, als dass eine Kopie des Zeigers im Register verändert wird, allerdings ist das beim Präinkrement ebenfalls der Fall. Der eigentliche Unterschied ist, dass der veränderte Wert beim Präinkrement nachher wieder an die selbe Stelle im Speicher zurückgeschrieben wird. Um es in grob fahrlässiger Weise mal in C-Pseudocode zu fassen (der mit einiger Wahrscheinlichkeit völlig anderen asm-Code erzeugen würde, aber es geht ja nur ums Prinzip):

C++:
int x;
register int r;

// Addition
x = 0;
r = x + 1;

// Inkrement
x = 0
r = x + 1;
x = r;



Oh, und zur Aufgabenstellung ist noch anzumerken, dass

C++:
char *cp[]={"GERICHT", "SEIN", "MODE"};


falsch ist, weil es cv-Qualifier entfernt (in diesem Fall const). Die Strings sind konstant, und der Speicher, in dem sie liegen, gehört dir nicht. In C ist es lediglich unschön (solange du nicht versuchst, da reinzuschreiben), die Sprache ist in diesem Zusammenhang ziemlich nachsichtig, aber ein strenger C++-Compiler haut dir sowas um die Ohren - besser ist in jedem Fall

C++:
char const *cp[]={"GERICHT", "SEIN", "MODE"};


und dann entsprechend

C++:
char const **cpp = cp;


...damit die Zuweisung an cpp den const-Qualifier von cp nicht wegschmeißt. Der const-Qualifier bezieht sich auf den Ausdruck direkt zu seiner linken, d.h., die Zeichen werden als Konstanten gehandhabt (was sie ja sind), während die Zeiger variabel bleiben; der restliche Code funktioniert also nach wie vor.

Für den Fall, dass dein Professor dir die recht gebräuchliche, aber in meinen Augen etwas inkonsistente

C++:
const char *p = "foo";


-Notation beigebracht hat, das ist das selbe wie

C++:
char const *p = "foo";


. Es handelt sich um einen syntaktischen Sonderfall - wenn const ganz links steht, bezieht es sich auf den Ausdruck direkt zu seiner rechten, weil ja zur linken keiner vorhanden ist. Das führt dann bei Zeigerkonstanten zu etwas unintuitiven Ausdrücken wie

C++:
const char *const p = "foo";


Ich schreibe sowas lieber als

C++:
char const *const p = "foo";


...der Übersicht halber. Beide Ausdrücke sind äquivalent, aber du siehst vielleicht, warum ich mir angewöhnt habe, const nicht ganz links hinzuschreiben. Man kommt auf die Art nicht in Versuchung, Dinge wie

C++:
const char const *p = "foo"; // ARGH!


zu versuchen, die überhaupt keinen Sinn ergeben (hier wäre char quasi doppelt const, was auch immer das bedeuten soll).
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 27.02.2009 um 01:09 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: