Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » char** pointer auf 2d char feld?

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
20.01.2008, 17:39 Uhr
tester34



Hallo,

ich möchte gerne einen char** Pointer auf ein 2 Dimensionales Char Array setzen.
Bei meinem Versuch muss irgendetwas falsch sein da die Ausgabe nicht mit stimmt.

Ausgabe bei cout<<*(inhaltsptr+0); : test1
Ausgabe bei cout<<*(inhaltsptr+1); : "komische Zeichen aus dem Speicher"

Hier sollte doch test2 ausgegeben werden???


C++:

char inhalt[SI][N]={"test1","test2","test3"};
char **inhaltsptr;  
inhaltsptr = new char* [SI];  
*inhaltsptr = inhalt[0];
cout<<*(inhaltsptr+0);




Danke für die Hilfe!

mfg tobi
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
20.01.2008, 17:56 Uhr
Kest
saint


Hi!

Bei "cout<<*(inhaltsptr+1)" zeigt der Zeiger noch auf gar nichts.

C++:
char inhalt[SI][N]={"test1","test2","test3"};
    char** inhaltsptr = new char*[SI];
    inhaltsptr[0] = inhalt[0];
    inhaltsptr[1]=inhalt[1];
    cout << *(inhaltsptr+1);


Oder wollteste so was

C++:
char inhalt[SI][N]={"test1","test2","test3"};
    char (*inhaltsptr)[N] = inhalt;
    cout << *(inhaltsptr+1);

--
Wenn man einen Hufschlag hört, sollte man >Pferd< denken und nicht >Zebra<.

Dieser Post wurde am 20.01.2008 um 18:05 Uhr von Kest editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
20.01.2008, 18:06 Uhr
xXx
Devil


naja wenn dann müsstest de schon:

C++:
std::cout << *(inhalt + 1) << std::endl;
schreiben ... doch warum nicht einfach operator[] nutzen?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
20.01.2008, 18:41 Uhr
tester34



@kest
hätte gern sowas wie bei dir im 1. beispiel!

kann man da einen char** Zeiger nicht so auf das Array setzen, das ich die Elemente per Pointer ansprechen kann? Praktisch so als würde man per z.B. *((*inhalt+2)+2) zugreifen.
Ich hoffe ihr könnt meinen schlechten Erklärungsversuchen folgen (-;
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
20.01.2008, 19:37 Uhr
xXx
Devil


hmm naja kannst ja sowas machen:

C++:
char content[10][7] = { "Test01", "Test02", "Test03", "Test04", ... "Test10" };
char** ptr_content = content;
std::cout << *(ptr_content + 1) << std::endl;
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
20.01.2008, 19:42 Uhr
Kest
saint


Würde nicht gehen, weil der jeweils nächste Zeiger über >N< Bytes springen muss; in dem Fall also über 6.
Geht nur mit >char (*zg)[N]<.
Oder du machst

C++:
char* inhalt[SI]={"test1","test2","test3"};
char** inhaltsptr =inhalt;
cout << *(inhaltsptr+2);

--
Wenn man einen Hufschlag hört, sollte man >Pferd< denken und nicht >Zebra<.

Dieser Post wurde am 20.01.2008 um 19:48 Uhr von Kest editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
20.01.2008, 19:45 Uhr
xXx
Devil


Das würde definitiv nicht gehen (@Kest). char* und dann aber beim Initialisieren char** angeben?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
20.01.2008, 19:47 Uhr
Kest
saint


Bitte?
--
Wenn man einen Hufschlag hört, sollte man >Pferd< denken und nicht >Zebra<.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
20.01.2008, 20:09 Uhr
0xdeadbeef
Gott
(Operator)


Ich denke, der grundlegende Verständnisfehler hier ist der Unterschied zwischen Arrays und Zeigern. Im Gegensatz zu z.B. Java ist ein zweidimensionales Array in C und C++ ein flaches Array. Das bedeutet, zweidimensionale Arrays in C und C++ sehen nicht etwa so aus:

Code:
-------------
| * | * | * |
--|---|---|--
  |   |   |
  |   |   |  -------------
  |   |   \->|   |   |   |
  |   |      -------------
  |   |  -------------
  |   \->|   |   |   |
  |      -------------
  |  -------------
  \->|   |   |   |
     -------------


sondern etwa so:

Code:
-------------------------------------------------
| ------------- | ------------- | ------------- |
| |   |   |   | | |   |   |   | | |   |   |   | |
| ------------- | ------------- | ------------- |
-------------------------------------------------


Das ist im Code zum Beispiel so nachvollziehbar:

C++:
#include <iostream>

int main() {
  int *p;
  int x[10];
  int y[10][20];

  // Plattformabhängig, wahrscheinlich 4, evtl 8
  std::cout << "sizeof(int) == " << sizeof(int) << std::endl;

  // Plattformabhängig, wahrscheinlich 4, evtl 8
  std::cout << "sizeof(p) == " << sizeof(p) << std::endl;

  // sizeof(int) * 10
  std::cout << "sizeof(x) == " << sizeof(x) << std::endl;

  // sizeof(int) * 10 * 20
  std::cout << "sizeof(y) == " << sizeof(y) << std::endl;

  // sizeof(int) * 20
  std::cout << "sizeof(y[0]) == " << sizeof(y[0]) << std::endl;
}


Ein zweidimensionales Array ist in C schlicht kein Zeigerarray, d.h., wenn du eins haben willst, musst du das von Hand zusammenbauen, in etwa so:

Code:
-------------
| * | * | * |
--|---|---|--
  |   |   \-----------------------\
  |   \-----------\               |
  |               |               |
--v---------------v---------------v--------------
| ------------- | ------------- | ------------- |
| |   |   |   | | |   |   |   | | |   |   |   | |
| ------------- | ------------- | ------------- |
-------------------------------------------------


Das kann dann etwa so aussehen:

C++:
template<typename t, std::size_t N> t **build_pointer_array(t a[][N]) {
  t **p = new t*[N];

  for(std::size_t i = 0; i < N; ++i) {
    p[i] = a[i];
  }

  return p;
}


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
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: