Seite 1 von 1
c++: pointer und char arrays
Verfasst: 02.05.2010 12:56
von gnasen
Hi,
ich hatte noch nie Probleme mit den Pointern in PureBasic, hier ist es einfach und durchdacht. In c++ hingegen bekomme ich grade nur die Krise:
Code: Alles auswählen
#include <iostream>
using namespace std;
int main ( int argc , char *argv[]) {
char **pp = argv;
cout << *(*pp) << endl; //c
cout << *(*pp+1) << endl; //:
cout << *(*pp)+1 << endl; //68
}
Ich möchte die an das Programm übergenen Parameter Wortweise Buchstabenweise durchgehen (2 Schleifen). Dafür habe ich oben den quasi-ersten Schritt als Beispiel angegeben. Die Ausgabe der ersten beiden sind okay, aber wieso kommt beim 3. überhaupt eine Zahl und kein char? Warum nicht der erste Buchstabe des ersten Parameters (hier: "a")?
Ich denke ich habe ein grundlegendes Verständnisproblem. Wenn sich jemand bereit erklären würde, mir das vllt sogar per Skype/TS oder ähnlichem zu erklären, wäre ich besonders dankbar. Aber jede Hilfe ist willkommen

Re: c++: pointer und char arrays
Verfasst: 02.05.2010 13:32
von milan1612
Hier erstmal so wie ich das machen wuerde:
Code: Alles auswählen
#include <iostream>
using namespace std;
int main ( int argc , char *argv[]) {
for (int i = 0; i < argc; ++i) {
for (char* c = argv[i]; *c != '\0'; ++c) {
cout << *c << " ";
}
cout << endl;
}
}
Nun zu deiner Frage: chars sind ja auch nur Zahlen wie du weisst (in der Regel ein Byte, das muss aber nicht so sein).
*(*pp)+1 dereferenziert erst den ersten String in argv, dann den ersten char und addiert dann einen Integer. Dabei
wird das ganze implizit von char zu int umgewandelt. Daher siehst du dann eine Zahl.
Um das zu verhindern, musst du explizit casten: (char)(*(*pp)+1) oder, wie in C++ eher empfohlen,
static_cast<char>(*(*pp)+1).
Re: c++: pointer und char arrays
Verfasst: 02.05.2010 13:41
von milan1612
Achso ja, was Allgemeines noch. Dein Code ist bis auf den iostream reines C. Wenn du wirklich C++ haben
willst, wuerde ich dir empfehlen auf Arrays weitgehend zu verzichten. C++ hat nicht umsonst viel sichere
Alternativen, wie zum Beispiel <vector>. Zusaetzlich solltest du fuer Strings die std::string Klasse verwenden.
Hier das gleiche in C++:
Code: Alles auswählen
#include <iostream>
#include <vector>
using namespace std;
int main ( int argc , char *argv[]) {
// argv zeigt auf den Anfang, argv + argc auf das Ende
// char* wird implizit zu einer std::string Instanz umgewandelt
vector<string> args(argv, argv + argc);
for (size_t i = 0; i < args.size(); ++i) {
for (size_t j = 0; j < args[i].size(); ++j) {
cout << args[i][j] << " ";
}
cout << endl;
}
}
Re: c++: pointer und char arrays
Verfasst: 02.05.2010 14:55
von gnasen
Danke, das hat mir wirklich sehr geholfen. Ich finde c bisher sehr kontra-intuitiv. Mir war zB nicht klar, dass bei *Pointern ein Zugriff über Pointer selbst, als auch *Pointer möglich ist, bzw dass das überhaupt ein Unterschied ist.
Aus meiner PB Sicht wären *Pointer und Pointer unterschiedliche Variablen. Aber da muss ich jetzt wohl durch

Re: c++: pointer und char arrays
Verfasst: 02.05.2010 15:23
von milan1612
gnasen hat geschrieben:Danke, das hat mir wirklich sehr geholfen. Ich finde c bisher sehr kontra-intuitiv. Mir war zB nicht klar, dass bei *Pointern ein Zugriff über Pointer selbst, als auch *Pointer möglich ist, bzw dass das überhaupt ein Unterschied ist.
Aus meiner PB Sicht wären *Pointer und Pointer unterschiedliche Variablen. Aber da muss ich jetzt wohl durch

Nein, vorsicht:
Code: Alles auswählen
int i = 42;
int* ptr = &i; // ptr hat den Typ int*
*ptr = 0 // weißt dem int auf den ptr zeigt den Wert 0 zu
ptr = 0 // lässt ptr auf die Addresse 0 zeigen
*ptr ist also das, auf das ptr zeigt. ptr ist die Addresse selbst!
Re: c++: pointer und char arrays
Verfasst: 02.05.2010 18:59
von Josh
bin mir nicht sicher, aber ist es nicht so, dass ein *variable in c dem @variable in pb entspricht?
Re: c++: pointer und char arrays
Verfasst: 02.05.2010 19:04
von Marvin
Nein, ein PB-@ entspricht einem C-&.

Re: c++: pointer und char arrays
Verfasst: 02.05.2010 19:35
von milan1612
Josh hat geschrieben:eine *variable in c
Sowas gibts nicht. Datentyp* gibts, das ist dann ein Pointer zu einer Addresse an der ein Datentyp liegt.
*Variablenname ist eine Dereferenzierung, entspricht also dem Wert an dieser Addresse
