Problem beim Interieren über Zeiger



  • Hallo,

    arbeite mich derzeit (notgedrungen) in c++ ein und habe ein problem beim iterieren über zeiger.

    #include <iostream>
    
    using namespace std;
    
    int main( int argc, char const* argv[])
    {
        cout<<argc<<endl;
        while(*argv)
        {
            cout<<*argv;
            argv++;
        }
        cout<<endl;
        char* test = "lalala";
        char* test1 = "bububu";
    
        char* zeigtests[]={test, test1, '\0'};
    //    while(*zeigtests)
    //    {
            cout << *zeigtests<<endl;
            //zeigtests++;                               <---- führt zu fehler (invalid lval in assignment)
    //    }
            cout << *(zeigtests + 1)<<endl;
            cout << *(zeigtests + 2)<<endl;
    }
    

    wollte mir testweise einen zeiger auf weitere zeiger bauen (wie beim übergabeparameter *argv[] jedoch bekomme ich einen fehler wenn ich über den zeiger iterieren will. (Zeile 22)

    Ich bekomme allerdings keinen fehler bei den zeilen 24 + 25



  • zeigtests ist bei dir nicht wirklich ein Zeiger, sondern vielmehr ein Array aus char* . Du kannst deshalb nicht einfach die Array-Startadresse ändern, sondern brauchst einen separaten Zeiger als Iterator:

    char* test = "lalala";
        char* test1 = "bububu";
    	char* zeigtests[] = {test, test1, NULL};
    	char** zeiger = zeigtests;   // Zeiger = Anfangsadresse des Arrays
    
        while(*zeiger)
        {
    		cout << *zeiger << endl;
            ++zeiger;   
        }
    


  • Aber was mich auch mal interssieren würde. Warum geht es dann bei argv? ist schließlich der selbe aufbau oder nicht?



  • Firefighter schrieb:

    Aber was mich auch mal interssieren würde. Warum geht es dann bei argv? ist schließlich der selbe aufbau oder nicht?

    Es gibt keine Arrayübergabe bei Funktionsaufrufen. D.h. argv ist in Wirklichkeit vom Typ char**.

    EDIT:
    Ist eigentlich gelogen, man kann eine Referenz auf ein Array übergeben, wenn die Größe bekannt ist. Das ist hier aber nicht der Fall.



  • Ahh logisch, stimmt daran hatte ich gar nicht gedachte, danke dir LordJaxom



  • vielen dank für die schnelle antwort.

    wieder ein bisschen schlauer 🙂

    Aber komme von python und bisher gefällt mir c++ überhaupt nicht (mal abgesehen von der geschwindigkeit)



  • cpp_noob schrieb:

    Aber komme von python und bisher gefällt mir c++ überhaupt nicht (mal abgesehen von der geschwindigkeit)

    Das ist doch immer so, wenn man gezwungen wird mit einer anderen Sprache zu arbeiten.

    Arbeite mal mit Ada und du wirst nicht aufhören zu kotzen. Fängt man aber ganz unbefangen mit der Sprache an und läßt sich komplett drauf ein, wird man begeistert sein. Das gilt wohl für alle Sprachen, außer vielleicht für Brainfuck. 😉



  • cpp_noob schrieb:

    Hallo,

    arbeite mich derzeit (notgedrungen) in c++ ein und habe ein problem beim iterieren über zeiger....

    (Falls das nicht eine Übung war)
    Für Zeichenkettenverarbeitung hat C++ std::string und für "Verwaltung mehrerer Objekte" Container (vector, map, list, ....) mit entsprechenden It- und Operatoren
    ... und das reduziert massiv den "Kotzfaktor". 😉

    Gruß,

    Simon2.



  • Fellhuhn schrieb:

    [...]Arbeite mal mit Ada und du wirst nicht aufhören zu kotzen.[...]

    Dem kann ich nur voll und kanz zustimmen. :p



  • cpp_noob schrieb:

    cout << *(zeigtests + 1)<<endl;  // Zeile 24
            cout << *(zeigtests + 2)<<endl;  // Zeile 25
    

    Ich bekomme allerdings keinen fehler bei den zeilen 24 + 25

    Das liegt daran, dass da das Array (genauer dessen Anfangsadresse) nicht verändert wird. Der Bezeichner zeigtests kann in diesem Kontext als (sozusagen konstanter) Zeiger verwendet werden, womit auch die Zeigerarithmetik funktioniert.


Anmelden zum Antworten