Inhalt einer Array Variablen = ihre eigene Adresse ?!



  • Hallo liebe C++ - Gemeinde .
    Ich habe gerade eine kleines Verständnisproblem ..
    Warum ist der Inhalt der Array-Variablen ihre eigene Adresse .
    Ich dachte bis heute ein Array
    sei einfach nur ein Pointer auf sein erstes Element ?

    Code :

    #include <iostream>
    
    int main (int argc, char * const argv[]) {
    	std::cout << "Hello, World!\n";
    
    	int element[8] = { 1, 2, 4, 8, 16, 32, 64, 128 };
    	int *ptr;
    
    	ptr = element;
    
    	printf("element     = %p\n", element);
    	printf("*element     = %i\n", *element);
    	printf("&element     = %p\n\n", &element);
    
    	printf("ptr     = %p\n", ptr);
    	printf("*ptr     = %i\n", *ptr);
    	printf("&ptr     = %p\n\n", &ptr);
    
        return 0;
    }
    

    Ausgabe :

    Hello, World!
    element     = 0xbffff6cc
    *element     = 1
    &element     = 0xbffff6cc
    
    ptr     = 0xbffff6cc
    *ptr     = 1
    &ptr     = 0xbffff6ec
    


  • Ein Array ist ein Array und kein Pointer. Aber Arrays können implizit (also automatisch) in einen Pointer konvertiert werden.



  • Eine Variable von Array-Typ verhält sich wie ein Zeiger auf das erste Element, AUSSER es ist einer von 3 Fällen:

    * Es wird der sizeof-Operator auf die Variable angewendet.
    * Es wird der unäre &-Operator auf die Variable angewendet.
    * Irgendwas mit der Initialisierung von String-Literalen.

    Du hast gerade Ausnahme Nummer 2 erwischt.




  • Mod

    SG1 schrieb:

    Eine Variable von Array-Typ verhält sich wie ein Zeiger auf das erste Element, AUSSER es ist einer von 3 Fällen:

    * Es wird der sizeof-Operator auf die Variable angewendet.
    * Es wird der unäre &-Operator auf die Variable angewendet.
    * Irgendwas mit der Initialisierung von String-Literalen.

    Du hast gerade Ausnahme Nummer 2 erwischt.

    Für praktische Zwecke sicher ausreichend, im Kontext von C++ aber genau genommen falsch.
    C++ ist nicht C.

    Ein Array zerfällt, wenn der Kontext das verlangt:

    int foo[42];
    foo; // (1)
    typeid(foo); // (2)
    void bar(int (&)[42]);
    bar(foo); // (3)
    

    (1)hier findet in C++ kein Zerfall statt. Mangels Beobachtbarkeit spielt das natürlich keine wirkliche Rolle. Wichtiger ist schon, das obige Liste eben nicht vollständig ist:
    (2)typeid wertet den Ausdruck, auf den es angewendet wird nicht aus, wenn der Type des Ausdrucks keine polymorphe Klasse ist. Mithin keine Array-Zerfall.
    (3)Ein Array kann an einen geeigneten Referenzparameter beim Funktionsaufruf gebunden werden - wiederum kein Zerfall.
    Kein Anspruch auf Vollständigkeit.



  • camper schrieb:

    Für praktische Zwecke sicher ausreichend, im Kontext von C++ aber genau genommen falsch.

    Gut zu wissen, dass das in C++ nochmal minimal anders ist. Danke für die Ergänzung/Richtigstellung.



  • Bacid90210 schrieb:

    Warum ist der Inhalt der Array-Variablen ihre eigene Adresse .

    In deinem Fall hast Du das Array auf dem Stack initialisiert. Somit ist die Addy der Variable identisch mit der ersten Addresse des Array's,...

    Du wirst es nicht glauben aber element[8] wäre quasi der inhalt von deines ptr Pointers 😉


Anmelden zum Antworten