Im Array bzw. PAWN/C A[3] = 3[A]?

  • Ich gruesse euch liebe Community,


    Habe folgende Klausuraufgabe gegeben gehabt:



    Welcher Ausdruck ist Aequivalent zu A[B]? Wenn A ein Array ist und B ein Index:
    a) *A +B
    b) B[A]
    c) *B +A


    Habe gedacht b und c kann ja schonmal garnicht sein, also habe ich auf a) getippt.
    Nun die Loesung: b sei richtig.


    Ich habe zur Ueberpruefung dann ein Programm geschrieben was das tut


    Und da habe ich mich gewundert dass A[3] = 3[A] rauskommt! Aber warum ist das so? Ich raff das nicht!
    Ist das in PAWN auch so?

    • Offizieller Beitrag

    Wie auf folgender Website dargestellt (http://www.henkessoft.de/C++/C/arrays_pointer.htm)
    funktionieren auch folgende Methoden:
    Array[i] <---> *(Array+i) <---> *(i+Array) <---> i[Array] 


    Mit der Begründung:



    Zitat

    folglich auch Array[i] und i[Array] gleichwertig sind, wenn dies beim direkten Betrachten auch nicht verständlich ist.


    Der Compiler schluckt dies kommentarlos, während beim Betrachter
    teilweise ernsthafte Verständnisprobleme entstehen.


    Ist anscheinend einfach so. Kann ich dir persönlich nicht mehr dazu sagen.

  • Du hättest es über das Ausschlussprinzip machen müssen: Ein Pointer (weißt du ja) zeigt auf eine Speicheradresse. Also betrachten wir mal a) und c). *A würde somit vorerst nur in betracht kommen, da man ja nicht den Pointer einer int Variable bzw eines Indexes benötigt. *A + B heißt ja dann, dass man z.B. bei einem Index von 3, 3 zu der Memoryaddress hinzuaddiert. Doch 3 sind als int im Speicher ja nicht gleich 3, sondern sind nochmal als Bytes/Bits "kodiert". Somit würde sich das auch nochmal ausschließen. (Hier also c) 2x ausgeschlossen, a) 1x ausgeschlossen, bleibt noch b). Ich hätte es auch nicht gewusst, da ich auch noch nie wirklich was mit C zutun hatte. Auch wenn ich es öfters wollte. Und defakto aufgrund des Kommutativgesetzes ist A[ B] das gleiche wie B[A] (macht natürlich ohne das von @Cireyses genannte Hintergrundwissen wenig Sinn).


    Müsstest du mal einfach probieren. PAWN ist C ähnlich, aber nicht direkt C. Es wird über eine Abstract Machine übersetzt, und die Natives o.ä. wird ja über eine Engine, halt als amx verarbeitet. Diese AM hat aber intern als Sprache C bzw. benutzt diese zur Ausführung. Theoretisch liegt es also nur daran, wie die AM die Arrays verarbeitet.