Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » PointerArray

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
01.07.2007, 23:16 Uhr
~newb
Gast


Hallo Leute,

ich habe das Pointer-Thema eigentlich gut verstanden, aber ich tu mich bei manchen Dingen noch etwas schwer sie nachzuvollziehen, zum Beispiel folgender kurzer Code:



C++:
#include <stdio.h>

int main(void) {
   char *sort[] = {
      "Zeppelin", "Auto", "Amerika", "Programmieren"
    };

   printf("%s\n", sort[1]);                 /* Auto       */
   printf("%s ", (sort[2]+2));              /* erika      */
   printf("%s %s\n", (sort[0]+6), sort[2]); /* in Amerika */
   printf("%.5s\n", (sort[3]+5-2));         /* gramm      */
  
  
}



Es wäre nett, wenn mir jemand erklären könnte, warum ich wenn ich zum Beispiel sort[1] mit printf ausgeben möchte als Ausgabe "Auto" erhalte, und nicht den 2ten Buchstaben davon, also "u"??? Ich weiß, dass liegt an den Adressen, jedoch verstehe ich das nicht ganz.

Und warum muss ich hier zum Beipiel keinen Speicherplatz reservieren? Reserviert den mein Compiler selbst, aufgrund meiner Initialisierungen oder?

Vielen Dank.
Grüße
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
01.07.2007, 23:36 Uhr
0xdeadbeef
Gott
(Operator)


Mal abgesehen davon, dass es

C++:
char const *const sort[] = {


heißen sollte, weil du da String-Konstanten verwaltest, und dir am Ende ein

C++:
return 0;


fehlt, das nur in C++ weggelassen werden kann (das hier sieht mir nach C-Code aus),

C++:
printf("%c\n", sort[1][1]);


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 01.07.2007 um 23:37 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
01.07.2007, 23:47 Uhr
~newb
Gast


ich verstehe dies schon, warum mit printf("%c\n", sort[1][1]); das "u" von Auto ausgegeben wird, aber meine Frage bezieht sich darauf, worin der Unterschied zwischen einen PonterArray und einem normalen Array liegt, da ja hier dann das komplette Wort ausgegeben werden kann und mit nem normalen Array(also quasi einfach den Sternoperator entfernen) dies nicht funktioniert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
01.07.2007, 23:48 Uhr
Lensflare




Zitat von ~newb:
Es wäre nett, wenn mir jemand erklären könnte, warum ich wenn ich zum Beispiel sort[1] mit printf ausgeben möchte als Ausgabe "Auto" erhalte, und nicht den 2ten Buchstaben davon, also "u"???

Weil das ein Pointer auf ein Array ist. Man kann es als ein zweidimensionales Array sehen.
printf fügt einen String an die stelle %s ein, der aus dem char array geholt wird und im fall von sort[1] wird das "zweite" char array genommen. Für den zweiten buchstaben aus "Auto" müsstest du sort[1][1] schreiben und %c anstelle von %s verwenden.


Zitat von ~newb:
Und warum muss ich hier zum Beipiel keinen Speicherplatz reservieren? Reserviert den mein Compiler selbst, aufgrund meiner Initialisierungen oder?

Ja, der Speicher wird wegen der Initialisierung automatisch reserviert, jedoch nicht vom Compiler.

EDIT:
Mist, zu spät
--
Wenn das Gehirn so einfach wäre, dass wir es verstehen könnten, wären wir so einfach, dass wir es nicht verstehen könnten.
(Emerson Pugh Trost)

Dieser Post wurde am 01.07.2007 um 23:49 Uhr von Lensflare editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
01.07.2007, 23:57 Uhr
0xdeadbeef
Gott
(Operator)


Ein Pointer-Array ist halt ein Array von Pointern. sort[1] nimmt das zweite Element von Sort, sort[1][1] das zweite Element des zweiten Elementes von sort - in diesem Fall den zweiten Buchstaben des Strings. Du könntest auch *(sort[1] + 1) schreiben, aber das ist deutlich unlesbarer.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
01.07.2007, 23:58 Uhr
Lensflare




Zitat von ~newb:
ich verstehe dies schon, warum mit printf("%c\n", sort[1][1]); das "u" von Auto ausgegeben wird, aber meine Frage bezieht sich darauf, worin der Unterschied zwischen einen PonterArray und einem normalen Array liegt, da ja hier dann das komplette Wort ausgegeben werden kann und mit nem normalen Array(also quasi einfach den Sternoperator entfernen) dies nicht funktioniert.

Du willst ja mehrere worte in einem array haben. Dazu brauchst ein zweidimensionales array. Erste dimension für die einzelnen worte und zweite dimension für die einzelnen buchstaben.
Und ein Zeiger auf ein array ist quasi ein zweidimensionales Array.
--
Wenn das Gehirn so einfach wäre, dass wir es verstehen könnten, wären wir so einfach, dass wir es nicht verstehen könnten.
(Emerson Pugh Trost)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
02.07.2007, 04:29 Uhr
~Erika
Gast



Zitat von ~newb:
ich verstehe dies schon, warum mit printf("%c\n", sort[1][1]); das "u" von Auto ausgegeben wird, aber meine Frage bezieht sich darauf, worin der Unterschied zwischen einen PonterArray und einem normalen Array liegt, da ja hier dann das komplette Wort ausgegeben werden kann und mit nem normalen Array(also quasi einfach den Sternoperator entfernen) dies nicht funktioniert.


Habe Sternoperator entfernt - funktioniert .


C++:
int main()
{
   char sort[4][15] = {
      "Zeppelin\0\0\0\0\0",
      "Auto\0\0\0\0\0\0\0\0\0",
      "Amerika\0\0\0\0\0\0",
      "Programmieren"
    };
  
   sort[2][2] = 'E';
   printf("%s ", (sort[2]+2));              
   sort[2][2] += 32;                        
   printf("%s %s\n", (sort[0]+6), sort[2]); /* Erika in Amerika */

   return 0;
}



Grüsse von Erika aus Amerika!
 
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: