Array, Pointer, Übergabe Klappt nicht...



  • Mooooooment ..
    PointerARITHMETIK heißt nur, dass statt mit array[i] mit *(array+i) gearbeitet wird. Diese beiden Ausdrücke sind identisch.

    Aber es heißt nicht, dass ausschließlich die Kurzschreibweisen ++ und -- verwendet werden müssen!
    array++ ist gleichbedeutend zu array=array+1. Damit überschreibst du jedesmal deine Arraystartadresse. Wenn möglich sollte man sich die Ursprungsadresse merken!



  • SeppJ schrieb:

    Zum Beispiel mit Klammern.

    (*anzre)++;
    

    😃
    Danke



  • ...



  • Swordfish schrieb:

    @Lymogry: Ich weiß jetzt zwar nicht genau, was du nicht verstehst, aber sicherheitshalber: Ein Array ist kein Pointer. Ein Pointer ist kein Array.

    Wo läufst du im Speicher lang wenn du Pointer+i oder Pointer++ rechnest? Wie würdest du das nennen, wenn du es nicht Array nennen willst?



  • ...


  • Mod

    Lymogry schrieb:

    Wo läufst du im Speicher lang wenn du Pointer+i oder Pointer++ rechnest? Wie würdest du das nennen, wenn du es nicht Array nennen willst?

    Du läufst (hier) mit deinem Pointer über das Array. Aber deine Beine sind nicht die Straße über die sie laufen.

    Hehe, die Analogie funktioniert gut 🙂 . Ein paar weitere:
    Deine Beine können auch über andere Straßen gehen.
    Eine Straße bleibt immer wo sie ist.
    Deine Beine bleiben immer an dir, aber sie können woanders hinlaufen.
    Deine Beine können auch über etwas anders als eine Straße laufen.
    Eine Straße ist auch mal zu Ende. Manchmal kann man trotzdem weiterlaufen. Manchmal fällt man dabei aber auch auf die Schnauze.



  • Ein Array ist immernoch eine im Speicher direkt aufeinander folgende Menge von Variablen vom gleichen Typ und gleicher Größe.
    Wenn ich diesen Speicher langlaufe nenn ich das Pointerarithmetik.
    Will ich den Speicherblock nennen, nenn ich ihn Array.

    Du machst hier Folgendes: 😉

    char * foo = malloc( 10 );
    char * bar = foo;
    
    bar += 3;
    bar = bar - 1;
    bar = &bar[ 1 ];
    *bar = 47;
    

    Du nimmst dir ein Band foo von 0 bis 9. Und setzt deinen Zeiger bar auf das 0-te Element. (Das tut ein Array auch)
    Dann gehst du mit deinem Zeiger auf das 3. Element. Dann gehst du zurück auf das 2. Element. Dann springst du per Arrayaufruf(!) auf die nächste Stelle von bar und speicherst den Wert 47 ab.
    Eigentlich hast du also gar nichts gemacht, außer foo[3]=47 zu setzen. 😉
    Aber Achtung: bar[3] hat eine ganz andere Speicheradresse. Das meine ich damit, dass man sich den Anfang lieber merken sollte. Hast du also intuitiv foo in Ruhe gelassen oder war das Absicht?

    Ein Array ist ein reservierter Speicherblock mit einem Pointer auf das 0-Element.
    Ein Arrayelement mit *(array+i) aufzurufen ist Pointerarithmetik.

    Eine Turingmaschine, und darauf bauen alle modernen Sprachen auf, kann NUR auf einem Band laufen. Das Fundamentalste, was man also machen kann, ist per Pointerarithmetik im Speicher zu laufen und die Werte per + oder - zu verändern.
    Das ist wohl der didaktische Gehalt hinter dieser Aufgabe. 😉

    (die ganzen Edits resultieren aus der späten Stunde. Aber jetzt sollte es wohl stimmen. Wenn nichts, merk ichs morgen auch noch ... 😉 )



  • ...



  • Swordfish, ich rate einfach mal:

    Du hast Informatik studiert und warst in Theoretischer Informatik der Beste? 😃

    PS: Kritische Fragen mit "Wurst" und "Wayne" abzuschmettern ist auch sehr professionell...



  • ...



  • Swordfish du bist der Größte, Klügste und Beste 🤡



  • ...



  • Lymogry schrieb:

    ... auf einem Band laufen.

    sind wir hier im fitnessstudio beim joggen
    oda watt



  • hor schrieb:

    Lymogry schrieb:

    ... auf einem Band laufen.

    sind wir hier im fitnessstudio beim joggen
    oda watt

    Wir bewegen uns in einer Turingmaschine. Du kannst aber lieber Sport machen gehen.


  • Mod

    Lymogry schrieb:

    Wir bewegen uns in einer Turingmaschine. Du kannst aber lieber Sport machen gehen.

    Wir wissen wohl alle, was eine Turingmaschine ist. Aber das abstrakte Maschinenmodell von C entspricht keiner Turingmaschine. Ebenso bei allen anderen modernen Sprachen.



  • Wenn ein modernen Computer oder eine Programmiersprache nicht auf einer Turingmaschine basieren würde, könnten wir alle Probleme der Mathematik und Informatik lösen. Hätten dann aber ganz andere Probleme, weil dann Kryptografie nicht mehr funktionieren würde.
    Da ich Mathematiker und nicht Informatiker bin, seh ich die Dinge auf einem anderen Abstraktionslevel. 😉



  • ...


  • Mod

    Lymogry schrieb:

    Wenn ein modernen Computer oder eine Programmiersprache nicht auf einer Turingmaschine basieren würde, könnten wir alle Probleme der Mathematik und Informatik lösen.

    Dies ist ein Fehlschluss. Mir ist nicht einmal klar, wie du darauf kommst, daher kann ich dich nicht korrigieren.

    Computersprachen können mit ihrem Maschinenmodell eine Turingmaschine emulieren, sind daher (bis auf den endlichen Speicher) Turing-vollständig. Dadurch wird aber ihr Maschinenmodell nicht zu einer Turingmaschine.

    Nun, da dieser kleine Ausflug wohl beendet ist: Was hat das nochmal mit Arrays und Pointern zu tun?



  • Hey Sepp, bin auch dafür das zu beenden. Das weckt schon schlafende Hunde. 😉


Anmelden zum Antworten