Ptr Frage... was mache ich falsch?!



  • hallöchen

    bin gerade dabei etwas c++ zu lernen und eigentlich klappts ganz gut. nur komm ich gerade irgendwie nicht weiter...

    einfach mal zum testen hab ich mir hier ein char array erzeugt:

    char arr[5];
    arr[0] = 'H';
    arr[1] = 'A';
    arr[2] = 'L';
    arr[3] = 'L';
    arr[4] = 'O';

    jetzt will ich ein array machen in dem ein zeiger auf das erste element und einer auf das letzte element im char array zeigt.

    char *arrPtr[2];
    arrPtr[0]=&arr[0];
    arrPtr[1]=&arr[5];

    jetzt habe ich ne methode an die ich das array mit dne 2 ptr übergeben will:

    int methode(char *charptr[]){...}

    wenn ich jetzt die methode so aufrufe bekomme ich einen fehler:

    obj.methode(*arrPtr[]);

    aber warum??? ich übergebe doch ein array mit zeigern oder nicht???

    vielen dank im voraus


  • Mod

    Was sollen der Stern und die eckigen Klammern beim Aufruf?



  • SeppJ schrieb:

    Was sollen der Stern und die eckigen Klammern beim Aufruf?

    ja stimmt der stern gehört da nicht hin aber die klammern muss ich doch hinschreiben, ist doch ein array oder nich?



  • http://ideone.com/UkVxj

    Aber solche Frickeleien macht man in C++ eigentlich eher selten.. und wenn (ver)kapselt man alles hinter 10 Klassen weg und glaubt ganz fest daran, dass es nicht da wäre.


  • Mod

    Otz110 schrieb:

    ja stimmt der stern gehört da nicht hin aber die klammern muss ich doch hinschreiben, ist doch ein array oder nich?

    Und?

    ➡ Grundlagenbuch.



  • @Otz110

    1. Es heisst Zeiger oder Pointer, "Ptr Frage" ist mMn. schon etwas (zu) minimalistisch für nen Thread-Titel. Du schreibst ja auch nicht "Ptr Fge", oder?

    2. int methode(char *charptr[]) ist nur eine andere Schreibweise für int methode(char **charptr) . Heisst: es wird nicht das Array übergeben, sondern nur ein Zeiger auf das erste Element des Arrays. Dadurch geht u.A. die Information verloren wie gross das Arrays ist ( sizeof(charptr) ist in der Funktion immer sizeof(char**) ). Und es bedeutet, dass, wenn du in der Methode Elemente des Arrays veränderst, diese auch im "original" geändert werden - da das Array ansich ja nie kopiert wird. Ich erwähne das nicht weil ich dich auf Teufel komm raus belehren will, sondern weil es viele Anfänger nicht wissen, und dann gerne drüber stolpern.

    3. arrPtr lese ich als "array poiner", also ein Zeiger auf (bzw. in) ein Array. Es ist aber ein Array von Zeigern. Also nicht unbedingt der beste Name. pointerArray wäre vermutlich besser.

    3.1) Falls du der Meinung sein solltest lange sprechende Namen sein ein Zeichen von Unfähigkeit ("der muss so lange Namen verwenden damit er sein eigenes Programm versteht"), lass dir gesagt sein: das ist gar nicht so. Profis die ein wenig Wert auf Verständlichkeit und Wartbarkeit legen schreiben i.A. viel "bessere" (längere, verständlichere) Namen als Anfänger.

    1. die [] beim Aufruf gehören da deswegen nicht hin, weil du ja einen Zeiger auf das Array aus Zeigern übergeben willst. Genauer: einen Zeiger auf das erste Element dieses Arrays. Also einen Zeiger auf einen Zeiger. Also einen char ** , genau das eben was die Funktion erwartet.

    Das macht man entweder indem man es explizit ausschreibt, das wäre dann

    obj.methode(&arrPtr[0]); // & = Adresse von, arrPtr[0] = des ersten Elements von arrPtr
    

    Oder man nutzt aus dass Arrays wenn nötig automatisch in einen Zeiger auf ihr erstes Element "zerfallen", und schreibt einfach

    obj.methode(arrPtr); // in diesem Fall gleichbedeutend mit obj.methode(&arrPtr[0]);
    


  • hustbaer schrieb:

    @Otz110

    1. Es heisst Zeiger oder Pointer, "Ptr Frage" ist mMn. schon etwas (zu) minimalistisch für nen Thread-Titel. Du schreibst ja auch nicht "Ptr Fge", oder?

    jaa sorry du hast recht. werde mir das nächste Mal mehr mühe geben.

    2)... Ich erwähne das nicht weil ich dich auf Teufel komm raus belehren will, sondern weil es viele Anfänger nicht wissen, und dann gerne drüber stolpern.

    genau wie ich 🙂 vielen dank

    3.1) Falls du der Meinung sein solltest lange sprechende Namen sein ein Zeichen von Unfähigkeit ("der muss so lange Namen verwenden damit er sein eigenes Programm versteht"), lass dir gesagt sein: das ist gar nicht so. Profis die ein Wenig Wert auf Verständlichkeit und Wartbarkeit legen schreiben i.A. viel "bessere" (längere, verständlichere) Namen als Anfänger.

    naja wenn ich ein "großes" programm schreibe verwende ich schon andere namen. das war nu mal eben ein test den ich ausprobiern wollte nachdem ich im c++ buch etwas gelesen habe!

    jetzt funktionierts mal fürs erste. vielen dank an alle tipps!!!



  • Hallo,

    Bei dieser Zeile

    arrPtr[1]=&arr[5];
    

    zeigt dein Objekt nicht auf das letzte Element sondern auf eine Position eins nach dem letzten Element.
    Falls du das so wolltest ist das schon in Ordnung. Du solltest diesen Zeiger nur nicht dereferenzieren.


Anmelden zum Antworten