c++: pointer und char arrays

Fragen zu allen anderen Programmiersprachen.
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

c++: pointer und char arrays

Beitrag 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 ;)
pb 4.51
Benutzeravatar
milan1612
Beiträge: 810
Registriert: 15.04.2007 17:58

Re: c++: pointer und char arrays

Beitrag 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).
Bin nur noch sehr selten hier, bitte nur noch per PN kontaktieren
Benutzeravatar
milan1612
Beiträge: 810
Registriert: 15.04.2007 17:58

Re: c++: pointer und char arrays

Beitrag 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;
    }
}
Bin nur noch sehr selten hier, bitte nur noch per PN kontaktieren
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Re: c++: pointer und char arrays

Beitrag 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 :D
pb 4.51
Benutzeravatar
milan1612
Beiträge: 810
Registriert: 15.04.2007 17:58

Re: c++: pointer und char arrays

Beitrag 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 :D
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!
Bin nur noch sehr selten hier, bitte nur noch per PN kontaktieren
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: c++: pointer und char arrays

Beitrag von Josh »

bin mir nicht sicher, aber ist es nicht so, dass ein *variable in c dem @variable in pb entspricht?
Marvin
Beiträge: 497
Registriert: 17.07.2005 14:42
Wohnort: Krikkit

Re: c++: pointer und char arrays

Beitrag von Marvin »

Nein, ein PB-@ entspricht einem C-&. :wink:
Benutzeravatar
milan1612
Beiträge: 810
Registriert: 15.04.2007 17:58

Re: c++: pointer und char arrays

Beitrag 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 :allright:
Bin nur noch sehr selten hier, bitte nur noch per PN kontaktieren
Antworten