Wann zerfaellt ein Arrayname nicht in einen Pointer auf das erste Element?


  • Mod

    SG1 schrieb:

    @SeppJ: Du meintest den nächsten Absatz, oder?

    Ja, ich hatte zuerst das falsche und dann zu viel zitiert. Mittlerweile sollte es passen.



  • Ok, also bei sizeof handelt es sich weiterhin um ein array, damit

    int array[42];
    sizeof(array) == 42 * sizeof(int);
    

    &array ist die Adresse eines int-Arrays mit 42 Elementen und nicht die Adresse eines Pointers auf int.

    Stimmt das bis hier?

    Gibt es einen Unterschied zwischen "pointer to type and no lvalue" und "const pointer to type"?

    Wann kann mir folgendes passieren?

    If the array object has register storage class, the behavior is undefined.

    Vielen Dank fuer eure Antworten!

    Gruss
    M



  • M^M schrieb:

    &array ist die Adresse eines int-Arrays mit 42 Elementen und nicht die Adresse eines Pointers auf int.

    Nö, &array ist die adresse des ersten Elements eines int-arrays bzw. die Adresse einer einfachen int-Variablen. Aber Vorsicht: array und &array ist dasselbe.



  • Z schrieb:

    M^M schrieb:

    &array ist die Adresse eines int-Arrays mit 42 Elementen und nicht die Adresse eines Pointers auf int.

    Nö, &array ist die adresse des ersten Elements eines int-arrays bzw. die Adresse einer einfachen int-Variablen. Aber Vorsicht: array und &array ist dasselbe.

    Falsch, so wie es M^M gesagt hat ist es vollkommen richtig.



  • M^M schrieb:

    Wann kann mir folgendes passieren?

    If the array object has register storage class, the behavior is undefined.

    Wenn Du sowas machst:

    register int foo[42]
    

    ... muss foo keine Adresse haben. Dann wird das mit "Zeiger auf das erste Element" problematisch.



  • Bashar schrieb:

    Z schrieb:

    M^M schrieb:

    &array ist die Adresse eines int-Arrays mit 42 Elementen und nicht die Adresse eines Pointers auf int.

    Nö, &array ist die adresse des ersten Elements eines int-arrays bzw. die Adresse einer einfachen int-Variablen. Aber Vorsicht: array und &array ist dasselbe.

    Falsch, so wie es M^M gesagt hat ist es vollkommen richtig.

    Und um das nochmal praktisch zu demonstrieren (das passende Standard-Zitat wurde ja schon gebracht), schaue man sich folgendes Beispiel an:
    http://ideone.com/IHR6Pt
    Wenn es keinen Unterschied zwischen foo und &foo gäbe, dann dürfte es auch keinen Unterschied zwischen foo+1 und &foo+1 geben.



  • SG1 schrieb:

    Und um das nochmal praktisch zu demonstrieren (das passende Standard-Zitat wurde ja schon gebracht), schaue man sich folgendes Beispiel an:
    http://ideone.com/IHR6Pt
    Wenn es keinen Unterschied zwischen foo und &foo gäbe, dann dürfte es auch keinen Unterschied zwischen foo+1 und &foo+1 geben.

    Danke, das hat mir gefehlt 🙂
    Dann versuche ich das jetzt mal so zusammenzufassen, wie ich es jetzt verstanden habe:

    int array[42];
    sizeof(array); //array ist ein Array mit 42 int
    int* ptr = array; //array ist ein (konstanter?) Pointer auf int
    int (*aPtr)[42] = &array; //&array ist die Adresse eines int-Arrays mit 42 Elementen
    array == array; //Die Startadresse des Arrays array stimmt mit der Adresse des 1. Elementes ueberein
    

    Habe ich jetzt alles?

    Gruß
    M



  • M^M schrieb:

    array == array; //Die Startadresse des Arrays array stimmt mit der Adresse des 1. Elementes ueberein
    

    Ich meinte natuerlich

    array == &array;
    


  • SG1 schrieb:

    register int foo[42]
    

    Mal abgesehen davon, dass mir keine Architektur einfällt, auf der ein int[42] in ein Register passen würde, ist ein Array mit register storage class praktisch unbenutzbar. Der Standard sagt dazu

    ISO/IEC 9899:1999 6.7.1 (Footnote 100) schrieb:

    The implementation may treat any register declaration simply as an auto declaration. However, whether or not addressable storage is actually used, the address of any part of an object declared with storage-class specifier register cannot be computed, either explicitly (by use of the unary & operator as discussed in 6.5.3.2) or implicitly (by converting an array name to a pointer as discussed in 6.3.2.1). Thus, the only operator that can be applied to an array declared with storage-class specifier register is sizeof.

    ...es ist nicht wirklich vorgesehen, dass man so etwas tatsächlich macht.

    @M^M: Das ist grob korrekt, obwohl ich mit dem Begriff "Startadresse" in diesem Kontext unglücklich bin. &array ist stumpf die Adresse des Arrays, nicht seine Startadresse -- letzteres klingt so, als sei die Adresse des ersten Elements gemeint. Die stimmt zwar auch mit der Adresse des ersten Elements des Arrays überein, aber dabei handelt es sich um eine Null-Bit-Information.



  • seldon schrieb:

    @M^M: Das ist grob korrekt, obwohl ich mit dem Begriff "Startadresse" in diesem Kontext unglücklich bin. &array ist stumpf die Adresse des Arrays, nicht seine Startadresse -- letzteres klingt so, als sei die Adresse des ersten Elements gemeint. Die stimmt zwar auch mit der Adresse des ersten Elements des Arrays überein, aber dabei handelt es sich um eine Null-Bit-Information.

    Stimmt, Startadresse klingt nicht ganz richtig und in einigen Faellen haette ich wohl eher "wird zu XY konvertiert" schreiben muessen, statt "ist ein".

    Wegen register:
    Ich habe das so gelernt, dass man dieses Schluesselwort getrost weglassen kann, da seine Umsetzung eh nicht garaniert ist und man die Optimierung in diesem Fall dem Compiler ueberlassen sollte.
    Das man fuer eine Variable, die immer im Register gehalten wird keine Adresse bekommt, klingt logisch 😉

    Vielen Dank fuer eure Hilfe, jetzt kann ich beruhigt Feierabend machen 😃

    Viele Gruesse
    M.


Anmelden zum Antworten