Zeiger auf Array



  • Hallo,

    ich soll folgende Aufgabe lösen:

    Schreiben Sie eine Funktion int min(int* a, int i, int n), die die kleinste Zahl in dem Array a[i..n-1] zurückliefert.

    Ich weiß eigentlich schon wie ich da rangehen muss, aber an der Umsetzung hackt es bei mir irgendwie:

    int min(int* a, int i, int n)
    {
        int minimum,j,zahl;
        minimum=a;
    
        for (j=i;j<=n-1;j++)
        {
          a++;     
           if (a<minimum)
                minimum=a;
        }
    
    return minimum;
    }
    

    Der Zeiger *a zeigt zu beginn auf das erste Element in dem Array. Ich wollte dann den Zeiger immer auf das nächste Element des Array zeigen lassen, aber anscheinend funktioniert das mit dem Befehl a++ nicht?


  • Mod

    Gast123 schrieb:

    Der Zeiger *a zeigt zu beginn auf das erste Element in dem Array. Ich wollte dann den Zeiger immer auf das nächste Element des Array zeigen lassen, aber anscheinend funktioniert das mit dem Befehl a++ nicht?

    Doch das geht. Was ist eigentlich dein Problem und wie kommst du da drauf, dass es nicht ginge? Dein Code ist so voller Syntaxfehler, dass leider nicht nachvollziehbar ist, was dein eigentlicher Fehler ist. Beispielsweise dereferenzierst du die Zeiger nicht.



  • Nein es funktioniert leider nicht, deshalb hatte ich mir dann in die Schleife auch eine Testausgabe eingebaut, also

    for (j=i;j<=n-1;j++)
        {
          a++;    
           printf("%i\n",a);
           if (a<minimum)
                minimum=a;
        }
    

    Die Werte die ausgegeben werden sind nicht die aus dem Array, sondern es wird immer 4 zum vorhergehenden Wert addiert.

    Also im Klartext, das Array sieht so aus array[]={3,6,3,8,2,4,1}
    Zu beginn steht der Zeiger auf der 3, die Ausgabe sagt mir dann aber dass die nächsten Werte 7,11,15,19 usw. sind.

    Und was versteht man unter Zeiger dereferenzieren? Sorry, ich beschäftige mich noch nicht lange mit dem Thema.



  • Du solltest dir als erstes den Unterschied klar machen zwischen Arrays/Zeigern und alleinstehenden Variablen. a ist ein Zeiger auf ein Zahlen-Array, minimum ist eine einelne Zahl, die kannst du weder miteinander vergleichen noch einander zuweisen.

    (und als nächstes erklären wir den Unterschied zwischen Arrays und Zeigern ;))



  • Wenn ich einen Zeiger auf ein Array deklariere, dann zeigt dieser doch auf die Speicherzelle in der das erste Element des Arrays gespeichert ist.

    Wie kann ich dann mit dem Zeiger auf den konkreten Inhalt dieser Zelle zugreifen, das heißt wie macht man die Zuweisung die ich mit "minimum=a" versucht hatte richtig?



  • Ein Zeiger zeigt auf eine Speicherstelle.
    Wenn du den Inhalt dieser Speicherstelle haben willst, musst du das angeben.
    Dafür ist der Dereferenzierungsoperator * da.

    Mit a bekommst du den Zeiger.
    Mit *a bekommst du den Inhalt an der Speicherstelle. *a ist dann der int-Wert.



  • Aber wenn ich minimum=*a; setze schmiert mir der Compiler ab



  • Gast123 schrieb:

    ... setze schmiert mir der Compiler ab

    Das denke ich nicht.
    Entweder gibt der Compiler eine Fehlermeldung oder dein Programm stürzt ab. Evtl. auch mit einer Fehlermeldung. Und es wäre schön wenn du diese mitteilst.

    Ansonsten ist es auch praktisch den Zeiger zu erhöhen nachdem man den Wert geholt hat, sonst überschreitest du die Arraygrenzen.
    Das ganze geht aber auch ohne Zeiger:

    int min(int* a, int i, int n)
    {
        int minimum,j,zahl;
        minimum=a[i];
    
        for (j=i;j<=n-1;j++)
        {
           if (a[j]<minimum)
                minimum=a[j];
        }
    
        return minimum;
    }
    

    Jetzt ersetzen wir a[j] durch *(a+j):

    minimum=*(a+i);
    
        for (j=i;j<n;j++)
        {
           if (*(a+j)<minimum)
                minimum=*(a+j);
        }
    

    Und dann noch mit increment:

    a += i; // Auf das i. Element verweisen
        minimum=*a;
    
        for (j=i;j<n;j++)
        {
           if (*a)<minimum)
                minimum=*a;
           a++;
        }
    

    Alles Klar? 🙂



  • Args, hab endlich meinen Fehler gefunden.

    Er lag im Funktionsaufruf, ich wollte sie über min(*p,i,n) aufrufen, aber offensichtlich gehört der * da nicht mit rein.

    Deshalb ist mir auch immer das Programm abgeschmiert wenn ich minimum=*a machen wollte.

    Vielen Dank für Eure Hilfe. 🙂



  • int min(int* a, int i, int n)
    {
        int minimum,j;
        minimum=a[i];
    
        for (j=i+1;j<=n-1;j++)
        {
           if (a[j]<minimum)
                minimum=a[j];
        }
    
    return minimum;
    }
    

Anmelden zum Antworten