Wie bekomme ich den char pointer in den vector?



  • Brutus2234 schrieb:

    Warum ist r ein Zeiger?
    Ich dachte das waere dann:

    char * r[10] = {0};
    std::vector <char*> v;
    v.push_back(r);
    

    jetzt ist r ein zeiger auf einen zeiger. das dereferenzieren von arrays der form

    <type> r[x];
    

    mit

    <type> y = r[x];
    

    ist das gleiche wie

    y = *(r+x*sizeof(<type>));
    

    mit anderen worten, eine arrayvariable ist auch nur ein zeiger der auf das erste element des arrays zeigt 🙂



  • Arrays sind also immer eigentlich nur Zeiter - okay 🙂



  • jetzt ist r ein zeiger auf einen zeiger. das dereferenzieren von arrays der form

    <type> r[x];
    

    mit

    <type> y = r[x];
    

    ist das gleiche wie

    y = *(r+x*sizeof(<type>));
    

    Das ganze Klingt fuer mich logisch, da deine Formel ja einfach an die entsprechende Adresse auf andere Weise springt.
    Allerdings muesste dann ja folgende Prozedur das selbe ausgeben:

    #include <vector>
    #include <iostream>
    int _tmain(int argc, _TCHAR* argv[])
    {
    	int r[10] = {50};
    	r[9] = 5;
    	int y = r[9]; 
    	std::cout << y << std::endl;
    	y = *(r+9*sizeof(int));
    	std::cout << y << std::endl;
    	system("Pause");
    	return 0;
    }
    

    Tut sie aber nicht - es wird einmal 5 und einmal 0 ausgegeben.
    Wo liegt da mein Fehler?



  • du greifst mit r[10] auf nicht initialisierten speicher zu 🙂 ich hab aber auch mist erzählt. nehm das mit dem sizeof() raus. das müsste dann gehen:

    int main(int argc, char* argv[])
    {
        int r[10] = {50, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        int y = r[5];   
        std::cout << y << std::endl;
        y = *(r+5);
        std::cout << y << std::endl;
    
        return 0;
    }
    

    :xmas1:



  • Also jetzt funktionierts ohne sizeof(int).
    Aber ich verstehe nicht genau warum: Mir kam das gerade logisch vor...
    Wobei man beim erhoehen von Iteratoren ja auch nur ++ schreibt und keine Adressen der groesse des Vektors braucht...

    Jetzt im Nachhinein kommt mir diese Methode aber unlogisch vor - rafft der Compiler das von selbst?



  • 777 schrieb:

    rafft der Compiler das von selbst?

    yup, etwas was man schnell vergisst wenn man pointerarithmetik meistens nur auf void* oder char* pointer anwendet wo +1 auch wirklich eine byteweise inkrementierung bedeutet :xmas1:



  • 777 schrieb:

    Also jetzt funktionierts ohne sizeof(int).

    Der Zeigertyp entscheidet bereits darüber wie die Länge der Elemente ist.

    Wenn du einen Zeiger "int *" hast, und diesen um eins erhöhst, so zeigt der Zeiger auf das nächste Element. Die Größe hast du hierzu nicht zu ermitteln. Dies macht der Compiler schon unter der Haube.

    777 schrieb:

    Wobei man beim erhoehen von Iteratoren ja auch nur ++ schreibt und keine Adressen der groesse des Vektors braucht...

    ++ Bei Zeigern ist auch das weitersetzen um ein Element. Daher vollkommen identisch. Wobei bei Iteratoren "unter der Haube" ggf. nicht einfach Adressen addiert werden, sondern es abhängig vom Iterator sein kann (z.B. kann bei einer std::list ein Element an einer beliebigen Position im Speicher liegen, und liegt in der Regel nicht wie bei einem std::vector in direkter Folge).

    cu André



  • Naja... Listen unterstuetzen ja auch keinen Wahlfreien Zugriff...



  • mammamia;



  • mammamia;


Log in to reply