Verständnisproblem: Pointer/Array



  • Hallo, ich verstehe eine Zeile im folgenden C-Code nicht:

    Das Programm sortiert ein int-Array. Dabei wird das kleinste Element an die erste Stelle getauscht, dann das kleinste von den verbleibenden an zweiter Stelle getauscht usw.

    Die Funktion swap() vertauscht 2 Zahlen.
    Die Funktion array_sort() ist für das sortieren zuständig.

    #include <stdio.h>
    
    void swap(int *address1 , int *address2)	{
    	int temp;
    	temp=*address1;
    	*address1=*address2;
    	*address2=temp;
    }
    
    void array_sort( int *array, int length)	{
    	int i,j,k;
    	for(i=0;i<length;i++)
    /* Suche nach dem kleinsten Element im verbleibenden
               Array. Der index des kleinsten Elements soll hinterher
               in k gespeichert sein. Wir fangen mit k = i an. */
    		for(k=(j=i)+1;k<length;k++)	{
     /* sofern ein Eintrag kleiner ist, update k */
    			if( array[j] > array[k])	j=k;
    			swap( &array[i] , &array[j] );
    		}
    
    }
    
    int main()	{
    	int i, A[7]={98,13,7,6,66,44,1};
    	array_sort(A, 7);
    	for(i=0; i<7;i++)
    		printf("%i\n", A[i]);
    
    	return 0;
    }
    

    Ich verstehe nun nicht, warum in Zeile 11 *array steht und nicht nur array.

    Wenn ich Pointer soweit verstanden habe, dann impliziert das "int *array", dass das eine Dezimalzahl ist, sont würde schließlich nicht int stehen. Das müsste weiter heißen, dass array eine Adresse speichert und dereferenziert (*), eine Zahl dann stehen müsste.

    Dann stellt sich aber die Frage, welche Zahl das ist und woher er die Adresse hat.

    Bei der swap()-Fkt. scheint mir dies einleuchtend zu sein. Schließlich wird die Adresse des Arrays an der Stelle i bzw. j angegeben, dies dann dereferenziert und dann erhalten wir eine Zahl.

    Ich hoffe man versteht mein Problem und mir kann geholfen werden
    Gruß Anfaeenger.



  • Ein Pointer enthält eine Adresse und "zeigt" auf einen Wert im Speicher. In diesem Fall zeigt er auf das erste Element des Arrays, das du an die Funktion übergeben hast (das nennt sich implizite Umwandlung - wenn du ein Array verwendest, zerfällt es fast immer zu einem Zeiger auf den Array-Anfang).



  • Danke für deine Antwort.
    Ich glaube, ich habe jedoch noch ein grundlegenderes Problem mit der Verständnis von Pointern.
    Ich dachte egtl. Pointer zeigen immer auf eine Adresse?
    Also ein Beispiel:
    int x=5, *y;
    Dann hat x eine Adresse: 002 (erfunden) und den Wert 5.
    y hat auch eine Adresse: 005 (erfunden) und zeigt, wenn wir es initialisieren auf eine Adresse.
    y=&x;
    Jetzt müsste ja y so aussehen:
    Adresse: 005 zeigt auf Adresse:002
    und wenn wir
    *y=10
    setzen, haben wir den Wert von x verändert.

    Nach deiner Aussage "zeigt" der Pointer ja auf einen Wert im Speicher. Das würde mit obiger Aussage nach meinem Verständnis nicht funktionieren. Könntest du mir dies vielleicht näher erläutern?

    *Einfall: Ok, ich sehe *y zeigt auf einen Wert (da ja *y=10), dies funktionierte doch aber nur, weil ich vorher y=&x initialisiert hab. Sonst würde *y ja auf keinen Wert zeigen, oder?



  • Dein Einfall stimmt soweit, aber nicht *y zeigt auf einen Wert sondern y zeigt auf einen Wert. *y gibt den Wert an der Adresse y wieder.

    Bei int *y; ist *y ein int und y ist die Adresse.



  • Tut mir leid, ich verstehe leider diesen Satz: "*y gibt den Wert an der Adresse y wieder" nicht. Ich verstehe immernoch nicht, was *y (, wenn y die Adresse ist,)jetzt ist. Kann man das in dem Beispiel konkret angeben oder evtl. veranschaulichen?



  • Anfaeenger schrieb:

    Tut mir leid, ich verstehe leider diesen Satz: "*y gibt den Wert an der Adresse y wieder" nicht. Ich verstehe immernoch nicht, was *y (, wenn y die Adresse ist,)jetzt ist. Kann man das in dem Beispiel konkret angeben oder evtl. veranschaulichen?

    *y ist ja auch nicht eigentlich der Wert des Pointers, sondern *y ist das Objekt, wo der Pointer hinzeigt.
    In Ermangelnung des Wortes Pointee definiert man gerne das Wort Wert als "das, wo der Zeiger hinzeigt". Erst ab dann ist *y der "Wert" von y. Verständlich muß das nicht sein.

    Hier die gewünschte Veranschaulichung:
    Pointer Fun with Binky



  • Anfaeenger schrieb:

    Tut mir leid, ich verstehe leider diesen Satz: "*y gibt den Wert an der Adresse y wieder" nicht. Ich verstehe immernoch nicht, was *y (, wenn y auf einen Wert zeigt)jetzt ist. Kann man das in dem Beispiel konkret angeben oder evtl. veranschaulichen?

    Meinte ich natürlich



  • Ich glaube es wird langsam verständlicher. Ich versuch es langsam zu verdauen, wenn ich noch fragen dazu habe, werde ich mich melden.

    Danke 🙂



  • Anfaeenger schrieb:

    Ich verstehe immernoch nicht, was *y (, wenn y die Adresse ist,)jetzt ist.

    Durch int *y; hast du selber festgelegt, dass *y ein int sein soll (y mit dem * vornedran).



  • Ahhh, ich habe glaub ich meinen größten Denkfehler gefunden.
    und zwar folgender:
    int A[5]={1,5,354,2}
    Wenn ich dies Ausgebe, also:
    printf("%i\n", A)
    gibt er mir die Adresse des ersten Elements aus
    und wenn ich
    printf("%i\n", *A)
    gibt er mir erst die 1 aus.

    Mir war gar nicht klar, dass das A dann eine Adresse darstellt. Ist das immer bei Arrays so?



  • Nein, ein Array "ist" keine Adresse, aber

    CStoll schrieb:

    (das nennt sich implizite Umwandlung - wenn du ein Array verwendest, zerfällt es fast immer zu einem Zeiger auf den Array-Anfang).

    Das heißt, wenn du den Array-Namen "pur" verwendest, wandelt der Compiler ihn um in einen Zeiger auf das erste Element um, so daß du seine Adresse erhältst (wobei es Situationen gibt, wo der Unterschied trotzdem wichtig ist, z.B. sizeof() oder mehrdimensionale Arrays).



  • Ich verstehe gut die Anfängerprobleme mit Pointern bei Arrays. Das muss man - am besten mit einem Buch - erst üben und verstehehen! Beginne zunächst mit indizierten Arrays a[i] in einer for-Schleife und ersetze dann die Indizies durch Pointer. Wenn es klappt -> was gelernt und dabei bleiben! 🙂


Anmelden zum Antworten