Pointer auf Array 2 of int



  • [] bindet stärker als *. Deshalb musst du hier Klammern:

    printf("%d", (*t)[0]);
    printf("%d", (*t)[1]);
    

    Außerdem muss es bei dir in Zeile 10 eigentlich

    p = &arr;
    

    heißen.



  • Nachtrag:

    pointer_frage schrieb:

    p ist ein Pointer auf ein Array von 2 Int,

    Würde ich nicht sagen. Ich weiß aus dem Stegreif nicht, ob die Klammer um *p einen unmittelbaren Effekt hat, aber für mich sieht das so aus, als ob du ein Array von Zeigern auf int s deklarierst (zwei Zeiger, weil zwei Elemente). Einem Zeiger sagst du nicht, wie groß der Speicherbereich ist, auf den er zeigen soll. Ein Zeiger beinhaltet eine Adresse, eine Information, wo sich ein anderes Objekt (bspw. ein Array) befindet.

    Bei der Zuweisung kommt zumindest bei mir ja auch eine Warnung:

    Warnung: Zuweisung von inkompatiblem Zeigertyp [standardmäßig aktiviert]
    

    @MatzeHHC: nicht sicher ob Troll.
    Bei einem Array musst du keinen Adressoperator angeben. Das musst du nur, wenn du mit den Elementen des Arrays rummachst.



  • Unsinn.

    int *p1[2];   // ist ein array mit zwei Pointern auf int
    int (*p2)[2]; // ist ein Pointer auf ein array mit 2 int
    
    int arr[2];
    p1[0] = arr; // ist die Adresse des ersten Elementes von arr
    p2 = &arr; // ist die Adresse des arrays. Vom Wert her gleich, aber andere bedeutung
    

    arr + 1 != (&arr) +1

    http://cdecl.ridiculousfish.com/?q=int+(*p)[2]

    Nix mit Troll...



  • Troll bezog sich auf "den OP vermeintlich ernst nehmen, obwohl man weiß, dass er etwas nicht korrekt verstanden hat".

    p ist ein Pointer auf ein Array von 2 Int, scheitert es an der zuweisung?

    Das sagt schon alles. Der OP will einen Zeiger an eine Funktion übergeben, der auf ein Array zeigt, welches 2 Elemente beinhaltet. Entweder hast du das überlesen, oder wolltest pointer_frage nicht zeigen, dass wie er versucht, sein Problem zu lösen, nicht korrekt ist. Er will ja kein Array von zwei Pointern. Er will einen Pointer, der auf ein Array zeigt.
    Deswegen war ich mir nicht sicher, ob Troll. 😉



  • dachschaden schrieb:

    Troll bezog sich auf "den OP vermeintlich ernst nehmen, obwohl man weiß, dass er etwas nicht korrekt verstanden hat".

    Ach so. Dann habe ich das falsch verstanden.

    dachschaden schrieb:

    Der OP will einen Zeiger an eine Funktion übergeben, der auf ein Array zeigt, welches 2 Elemente beinhaltet. Entweder hast du das überlesen, oder wolltest pointer_frage nicht zeigen, dass wie er versucht, sein Problem zu lösen, nicht korrekt ist. Er will ja kein Array von zwei Pointern. Er will einen Pointer, der auf ein Array zeigt.
    Deswegen war ich mir nicht sicher, ob Troll. 😉

    Verstehe ich nicht. Er hat doch einen Pointer, der auf ein array zeigt.
    Deklaration und Aufruf von test() sind auch korrekt. Lediglich beim Elementzugriff und bei der Zuweisung sind Fehler. Die habe ich korrigiert.

    Ich kann ja nicht wissen, was der OP vorhat. Also kann ich auch nicht sagen "Du willst keinen pointer auf array von 2 int sondern nur einen pointer auf int."



  • Mein Lieber Herr Dachschaden. Ich bin mir auch nicht sicher ob dein Name nicht Programm ist, jedoch geht der "Troll" gleich mal an dich zurück.

    Ich habe online mit IDEONE schnell durchlaufen lassen, es kamen hald keine Compiler Hinweise.

    Vielen Dank an MAtzeHCC, er hat es verstanden und mir auch geholfen. Besten Dank.

    Für Msiter Klugscheißer Dachschaden : Wenn du dich mal wieder nicht auskennst mit deklarationen würde ich Dir diese Seite ans Herz legen : http://cdecl.ridiculousfish.com/



  • dachschaden schrieb:

    Ich weiß aus dem Stegreif nicht, ob die Klammer um *p einen unmittelbaren Effekt hat,

    Dann halte die Klappe.



  • MatzeHHC schrieb:

    int arr[2];
    int (*p2)[2]; // ist ein Pointer auf ein array mit 2 int
    p2 = &arr; // ist die Adresse des arrays. Vom Wert her gleich, aber andere bedeutung
    

    Ja und vor allen Dingen UB bei Dereferenzierung von p2. "...andere Bedeutung..." verharmlost solche sinnfreien Zuweisungen.



  • Also würde schon

    p2 = arr

    Stimmen, gell?



  • Wenn der Compiler bei Zeigerzuweisungen im entsprechenden Warn-Modus nicht "incompatible pointer type" meldet, hast du gute Chancen, das richtig gemacht zu haben.
    Meldet der Compiler sowas, ist es eine (leider weit verbreitete) Deppen-Unsitte, diese Meldung durch einen Zeiger-Cast zu umgehen.



  • Hab alles nur online probiert mit ideone, hab momentan leider nicht mehr zur Hand. Leider kamen weder bei der einen noch bei der anderen Variante Meldungen bei mir. Glaub aber eher das es an meiner Bedienung scheiterte.

    Auf jeden Fall danke an alle. Nö an fast alle 😀😀



  • Tja, zu früh gefreut. Compiler motzt.
    Wie würde die Zuweisung richtig aussehen?



  • Jetzt kapier ich es gar nicht mehr.

    P=&arr

    Funktioniert ohne Compiler Fehler und es stürzt auch nicht ab.... UB evtl doch nicht?


  • Mod

    Von welchem Typ ist denn das Ergebnis eines Adressoperators angewendet auf ein int[2]?



  • Ursprünglich hätte ich jetzt gesagt das es die Adresse eines int[2] arrays ist und somit auch passt.
    Aber Wutz (und der kennt sich aus) hatte ja geschrieben das es falsch ist wegen UB. Vielleicht stehe ich jetzt auch auf dem Schlauch, das macht mich jetzt echt fertig.


  • Mod

    pointer_frage schrieb:

    Aber Wutz (und der kennt sich aus) hatte ja geschrieben das es falsch ist wegen UB. Vielleicht stehe ich jetzt auch auf dem Schlauch, das macht mich jetzt echt fertig.

    Ich weiß auch nicht, was er an der Stelle damit meinte. Vielleicht hat er irgendwo in dem langen Thread etwas anders verstanden, als es gemeint war. (Wobei ich hoffe, dass ich selber nichts übersehen habe)



  • Vielleicht äußert er sich ja nochmal dazu. Ich lass mich leicht verunsichern, ich mach das noch nicht so lange, das wissen oder Unwissen ist noch nicht so gefestigt



  • int arr[2];
    int (*p)[2];
    p = &arr;
    

    ist natürlich richtig.

    Wutz meinte lediglich, dass ich deutlicher hätte schreiben sollen, dass es total falsch ist das & weg zu lassen. Auch wenn es den selben Wert liefert, führt p = arr zu undefiniertem Verhalten. Also blos nicht machen ⚠



  • pointer_frage schrieb:

    Aber Wutz (und der kennt sich aus)

    Oder auch nicht.



  • MatzeHHC schrieb:

    int arr[2];
    int (*p)[2];
    p = &arr;
    

    ist natürlich richtig.

    Die Zuweisung (p = &arr) ist durchaus richtig.

    Allerdings macht die Deklaration mit Sicherheit nicht das, was der TE erwartet. p ist ein Zeiger auf ein int[2] array, und somit liefert p[0] die Adresse des ersten Array's, p[1] die Adresse des zweiten Array's usw. :

    printf("%p\n", p[0]);                  // Adresse von arr
        printf("%p\n", p[1]);                  // Adresse von arr + sizeof(int[2])
        printf("%d\n%d\n", p[0][0], p[0][1]);  // Werte arr[0] und arr[1]
    

Anmelden zum Antworten