Pointer auf Array 2 of int



  • 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]
    


  • Hatte eigentlich vor, nicht mehr in diesem Thread zu antworten, weil mir das zu kindisch wurde - aber weil Wutz seinen Autismus nicht behandeln lässt, mache ich das eben doch.

    An den OP:

    1. Online-Compiler? Ja klar. m( DAS ist die Zukunft, ganz bestimmt.
    Zur Information: jeder ORDENTLICHE Compiler wirft hier eine Warnung. Weil die Typen unterschiedlich sind Der gcc wirft hier eine. Deiner nicht. Also ist deiner nicht ordentlich.[/virtuellerSchwanzvergleich]

    Jetzt kann man darüber streiten, wie man die Warnung wegbekommt.
    Eine Möglichkeit, die Warnung zu eliminieren, ist die &array -Methode. Die kann effektiv sein. Muss sie aber nicht. Schon gar nicht in deinem Post, in dem Informationen fehlen. Wo wir so überhaupt nicht wissen, was du eigentlich willst, außer deine finale Aussage, die überhaupt keinen Sinn ergibt.

    Eine weitere Möglichkeit ist ein Cast.
    Wie MatzeHHC schon geschrieben hat, gibt es keinen eigentlichen Unterschied zwischen array und &array . Die Adresse des Arrays ist gleichzeitig die Adresse des ersten Elementes des Arrays. Ein Cast sagt dem Compiler nur, dass er die Fresse halten soll.

    Oder eine weitere Möglichkeit ist die Analyse des Programms und die Feststellung, dass es hier keinen Grund gibt, ein Array von Zeigern auf Arrays zu verwenden. Das wäre besser rübergekommen, wenn du eine Referenzierung wie unten beschrieben verwendet hättest.
    Da Zeiger ein komplexes Thema sind und dein Code nach Anfänger schreit, bin ich davon ausgegangen, dass du etwas versucht hast, was du nicht verstanden hast. Eigentlich gehe ich sogar davon aus, dass du es immer noch nicht weißt.

    2. Ist es MEIN Problem, wenn du eine kaputte Kommunikation an den Tag legst? Ich zitiere dich:

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

    Das war der zentrale Punkt. Deine Aussage, was in deiner Vorstellung p ist, wie du es anwenden willst. Und das ist falsch. Ich bin mir sicher, du hast mein Beispiel nicht mal kompiliert? Eine Ein-Zeichen-Änderungen, die immer noch mit deiner zentralen Aussage kollidiert, war dir lieber? Ich weiß bisher immer noch nicht, ob du Zeiger nur nicht korrekt verstanden hast (wovon ich immer noch ausgehe, weil ich bei der Dereferenzierung des Zeigers t[x][x] machen würde anstatt (*t)[x] - weil du ein Array von Zeigern auf Arrays hättest statt einen Zeiger auf ein Array).

    3. DU willst mir Deklarationen erklären? Du, der es selbst nicht schafft, seine Deklarationen zu erklären? Ich glaub, es hackt.

    Klugscheißer

    Und warum werden wir gleich beleidigend?
    Du hast Glück, keinen angemeldeten Account zu verwenden, sonst käme der in mein Killfile. Jedenfalls hast du gerade die Chance eliminiert, dass ich dir in diesem Thread nochmal helfe.

    An Wutz:

    Ich meine das Ernst, irgendwas stimmt mit dir nicht.
    Wenn du mit einer Aussage von mir nicht übereinstimmst, SAG ES, und schreib nur nicht, dass ich falsch liegen würde. Ich erinnere dich an deine Aussage in einem anderen Thread, dass es keinen Unterschied machen würde, ob man unsigned int* oder unsigned char* verwendet. Ich habe damals ganz genau widersprochen und gesagt, WIESO es einen Unterschied macht. Mit Beispiel und dem Fehler, den es verursacht.

    Mit allem, was ich von dir jemals bekommen habe, kann ich meinen Garten düngen. Also sag an, was Sache ist. Mit "ist falsch" kann ich nichts anfangen, mit "halt die Klappe" schon gar nicht. Nein, weißt du was, sag nichts *into the killfile it goes*.

    An osdt: +1.


Anmelden zum Antworten