Frage zu Pointern



  • Hallo,

    ich habe eine Frage. Und zwar habe ich ein Array und ein Array von Pointern und will nun jeden Pointer im Array von Pointern auf das entsprechende Element vom Array zeigen lassen. Habe das so gelöst.

    int* pointers[10];
        int array[10];
    
        for (int i = 0; i < 10; i++) {
            array[i] = i;
        }
    
        for (int i = 0; i < 10; i++) {
            pointers[i] = &array[i];
        }
    

    Habe nun 2 Frage dazu:

    1. Warum brauch ich hier:
    pointers[i] = &array[i];
    

    den Adressoperator &, ich dachte bei Arrays brauch man den nicht? Wenn ich nur einen Pointer habe, geht das doch auch so:

    for (int i = 0; i < 10; i++) {
            ptr = (array + i);
        }
    
    1. Warum kann ich
    pointers[i] = &array[i];
    

    nicht als

    (pointers + i) = &(array + i);
    

    schreiben?

    Danke für die Antworten.

    MfG



  • Hallo,

    zu 1)

    Du brauchst hier den Adressoperator "&", da du ja die Speicheradresse und nicht den Wert an der Stelle in dein Pointer-Array speichern möchtest.

    zu 2)

    Das kannst du schreiben als *(pointers + i) = ...



  • int* pointers[10];
        int array[10];
        int i;
    
        for (i = 0; i < 10; i++)
            array[i] = i;
    
        for (i = 0; i < 10; i++)
            pointers[i] = &array[i];
    

    Ist ordentlicher.

    tobias321 schrieb:

    1. Warum brauch ich hier:
    pointers[i] = &array[i];
    

    den Adressoperator &, ich dachte bei Arrays brauch man den nicht?

    Du hantierst hier ja auch nicht mit dem Array rum, sondern mit dem Element eines Arrays. Wenn du dein Array an eine Funktion übergeben willst, die einen Zeiger erwartet, kannst du das ohne Adressoperator tun. Wenn du die Adresse eines Arrayelementes an eine Funktion übergeben willst, die einen Zeiger von Typ deines Arrayelementes erwartet, musst du den Adressoperator verwenden.

    tobias321 schrieb:

    1. Warum kann ich
    pointers[i] = &array[i];
    

    nicht als

    (pointers + i) = &(array + i);
    

    schreiben?

    Weil du die Dereferenzierung vergessen hast und immer noch mit dem Adressoperator arbeitest:

    #include <stdio.h>
    #define MY_SIZE (10)
    
    int main(void)
    {
            int*pointers[MY_SIZE];
            int array[MY_SIZE];
            int i;
    
            for(i=0;i<MY_SIZE;i++)
                    array[i]=i;
    
            for(i=0;i<MY_SIZE;i++)
                    /*pointers[i]=&array[i];*/
                    *(pointers+i)=(array+i);
    
            /*Ausgabe*/
            for(i=0;i<MY_SIZE;i++)
                    printf("%p|%p|%d\n",&pointers[i],pointers[i],*pointers[i]);
    
            return 0;
    }
    


  • tobias321 schrieb:

    Adressoperator &, ich dachte bei Arrays brauch man den nicht?

    Verbreiteter Irrglaube aller Anfänger+Hochschullehrer und der allermeisten Fachbuchautoren+Tutorialschreiberlingen: ein Array ist kein Zeiger, ein Zeiger ist kein Array und demzufolge nicht immer austauschbar, z.B. nicht als Operand bei & und sizeof.



  • tobias321 schrieb:

    1. Warum brauch ich hier:
    pointers[i] = &array[i];
    

    den Adressoperator &, ich dachte bei Arrays brauch man den nicht?

    array[i] ist kein Array sondern ein int . Du hast da schon das einzelne Element.
    Darum brauchst du den Adressoperator.

    tobias321 schrieb:

    Wenn ich nur einen Pointer habe, geht das doch auch so:

    for (int i = 0; i < 10; i++) {
            ptr = (array + i);
        }
    

    Das geht auch so mit dem Array.



  • Danke an alle, mir ist nun alles viel klarer.


Anmelden zum Antworten