Wie versteht man Zeigerarithmetik??



  • Also der gröbste Unterschied ist der:

    Ein Array ist ein Verbund von Variablen des gleichen Datentypes.

    Ein Pointer ist eine Variable, die auf eine Adresse zeigt.



  • silent_max schrieb:

    DirkB schrieb:

    Und das wurde dir eigentlich auch schon ganz oft erklärt.

    Und erst jetzt habe ich es kapiert.

    Deswegen denke ich ja, das programmieren nichts für dich ist.
    Wie einige andere schon angemerkt haben.



  • silent_max schrieb:

    Also der gröbste Unterschied ist der:

    Ein Array ist ein Verbund von Variablen des gleichen Datentypes.

    Falsch, ein Array ist eine geschlossene Reihe von Elementen des gleichen Datentyps die im Speicher hintereinanderliegen.

    Ein Pointer ist eine Variable, die auf eine Adresse zeigt.

    Falsch.
    Ein Pointer ist eine Variable, die eine Adresse als Datenwert enthält.
    Der Compiler erkennt allerdings, das man mit dem Pointer dank diesem Adressenwert auf die jeweilige Adresse zeigen kann.
    Desweiteren weiß der Compiler, von welchem Typ der Datenwert ist, der an der Adresse steht, an welche der Pointer zeigt.



  • silent_max schrieb:

    Also der gröbste Unterschied ist der:

    Ein Array ist ein Verbund von Variablen des gleichen Datentypes.

    Ein Pointer ist eine Variable, die auf eine Adresse zeigt.

    Ein Array ist eine Ansammlung von Daten desselben Typs, die hintereinander im Speicher stehen. Ein Pointer ist eine Variable, welche eine Adresse speichert.



  • Programmierfachprofi schrieb:

    silent_max schrieb:

    Also der gröbste Unterschied ist der:

    Ein Array ist ein Verbund von Variablen des gleichen Datentypes.

    Falsch, ein Array ist eine geschlossene Reihe von Elementen des gleichen Datentyps die im Speicher hintereinanderliegen.

    Ein Pointer ist eine Variable, die auf eine Adresse zeigt.

    Falsch.

    [...]

    der an der Adresse steht, an welche der Pointer zeigt.

    Also doch?



  • Anscheinend habe ich doch noch nicht ganz verstanden.

    out schrieb:

    Ein Array ist eine Ansammlung von Daten desselben Typs, die hintereinander im Speicher stehen.

    Also ist z. B.

    int Zahl[5];
    

    eine Ansammlung von Daten des Typs Integer, die hintereinander im Speicher stehen.

    out schrieb:

    Ein Pointer ist eine Variable, welche eine Adresse speichert.

    Also ist z.B.

    int a;
    int *pa = &a;
    

    pa eine Variable, die auf die Adresse von der Variable zeigt.

    Da ich es anscheinend noch nicht richtig verstanden habe...

    Wie müsste ich dann einen Pointer deklarieren/initialisieren, der mir auf den Array von oben auf

    int Zahl[5];
    

    zeigt?

    Oder macht es wenig Sinn, einen Pointer auf einen Array "zeigen zu lassen"??



  • edit: ok, ich habs wohl auch nicht verstanden. Arbeite einfach zu selten auf dieser low-level-Ebene...

    und sorry, ich habe mir nicht den gesamten 18-Seiten-Thread vorher durchgelesen.



  • Oder macht es wenig Sinn, einen Pointer auf einen Array "zeigen zu lassen"??

    In C brauchte man diese Technik beispielsweise für dynamische mehrdimensionale Arrays.
    Da hatte man also ein Array von Zeigern auf Arrays.

    In C++ fällt mir für sowas kein Beispiel ein, denn in C++ werden schon sowieso echte (bzw. C-) Arrays eigentlich vermieden.

    Ein Pointer auf ein Array ist nichts anderes, als ein Pointer auf das erste Element des Arrays

    Genau das hat Wutz doch gerade widerlegt.
    Bzw., man sollte in diesem Fall die Adresse des ersten Elementes nehmen.



  • daddy_felix schrieb:

    Ein Pointer auf ein Array ist nichts anderes, als ein Pointer auf das erste Element des Arrays. Wenn du diesen Pointer dann inkrementiert, zeigt er auf das zweite Element usw.

    Nein, eben nicht! 🙄

    int arr[5];
    int (*p1)[5] = &arr; // Pointer auf Array
    int* p2 = &arr[0]; // Pointer auf das erste Element des Arrays
    int* p3 = arr; // Pointer auf das erste Element des Arrays
    

    Die zeigen jetzt zwar alle auf die gleiche Adresse, aber p1 unterscheidet sich doch deutlich von p2 und p3. Während p2 und p3 auf das erste Element zeigen, zeigt p1 auf das Array. Deutlich wird das hier:

    ++p1; // p1 Zeigt jetzt sizeof(int) * 5 byte weiter nach vorne
    ++p2; // p2 Zeigt jetzt sizeof(int) byte weiter nach vorne
    ++p3; // p3 Zeigt jetzt sizeof(int) byte weiter nach vorne
    


  • int a[5] = {11,22,33,44,55};
    int *pa=a; // Jetzt zeigt pa auf das erste Element von a
    

    Oder wenn du pa bei der Definition nicht initialisierst:

    int a[5] = {11,22,33,44,55};
    int *pa;
    ....
    pa = a; // Jetzt zeigt pa auf das erste Element von a, hier auch ohne *
    


  • daddy_felix schrieb:

    Ein Pointer auf ein Array ist nichts anderes, als ein Pointer auf das erste Element des Arrays. Wenn du diesen Pointer dann inkrementiert, zeigt er auf das zweite Element usw.

    Ok.

    Man kann ja wie folgt auf die einzelnen Elemente eines Arrays einen Pointer "setzen":

    int Zahl[5] = {11,22,33,44,55};
    int *pZahl=Zahl; // Beim Array ohne &
    int i=0;
    
    pZahl + 0 ergibt die Adresse von Zahl[0]; //Adresse des ersten Elements des Arrays
    pZahl + 1 ergibt die Adresse von Zahl[1]; //Adresse des zweiten Elements des Arrays
    pZahl + 2 ergibt die Adresse von Zahl[2]; //Adresse des dritten Elements des Arrays
    pZahl + 3 ergibt die Adresse von Zahl[3]; //Adresse des vierten Elements des Arrays
    pZahl + 4 ergibt die Adresse von Zahl[4]; //Adresse des fünften Elements des Arrays
    

    Habe ich es jetzt kapiert??

    Welche Unterschiede zwischen Array und Pointer gibt es denn noch, die zu beachten sind???



  • Du scheinst ein Talent dafür zu haben dir die falschen Aussagen rauszupicken. 🙄 Aber das was du geschrieben hast, sieht richtig aus.

    int arr[5];
    int* p = arr;
    if ((p + 4) == &arr[4])
      std::cout << "yay!\n";
    


  • DirkB schrieb:

    int a[5] = {11,22,33,44,55};
    int *pa=a; // Jetzt zeigt pa auf das erste Element von a
    

    Oder wenn du pa bei der Definition nicht initialisierst:

    int a[5] = {11,22,33,44,55};
    int *pa;
    ....
    pa = a; // Jetzt zeigt pa auf das erste Element von a, hier auch ohne *
    

    Und wie zeigt "man" auf die restlichen Elemente des Arrays?



  • silent_max schrieb:

    pZahl + 0 ergibt die Adresse von Zahl[0]; //Adresse des ersten Elements des Arrays
    pZahl + 1 ergibt die Adresse von Zahl[1]; //Adresse des zweiten Elements des Arrays
    pZahl + 2 ergibt die Adresse von Zahl[2]; //Adresse des dritten Elements des Arrays
    pZahl + 3 ergibt die Adresse von Zahl[3]; //Adresse des vierten Elements des Arrays
    pZahl + 4 ergibt die Adresse von Zahl[4]; //Adresse des fünften Elements des Arrays
    

    Habe ich es jetzt kapiert??

    Ja, korrekt.

    silent_max schrieb:

    Welche Unterschiede zwischen Array und Pointer gibt es denn noch, die zu beachten sind???

    Ich verstehe nicht, wieso man Arrays mit Pointern vergleicht 😕. Dass sie nichts miteinander zu tun haben, erkennt man doch schon, wenn man beide Begriffe ins Deutsche übersetzt. Kein Mensch würde auf Idee kommen, wenn er Feld und Zeiger hört, dass die irgendwie miteinander verwandt wären.



  • Dass sie nichts miteinander zu tun haben

    Ist falsch, denn die haben was miteinander zu tun.



  • silent_max schrieb:

    Oder macht es wenig Sinn, einen Pointer auf einen Array "zeigen zu lassen"??

    Wenn du ein Array an eine Funktion übergibst (z.B. bei strlen), passiert genau das.
    Die Funktion bekommt nur den Zeiger zu sehen.
    Damit sind auch die Informationen über die Größe des Arrays verloren.

    silent_max schrieb:

    Und wie zeigt "man" auf die restlichen Elemente des Arrays?

    Entweder mit einem Offset (pZahl + 1) oder indem du den Pointer veränderst (pZahl = pZahl + 1; oder nur pZahl++ oder ++pZahl).
    Du darfst da auch - (Minius) nehmen



  • Sone schrieb:

    Dass sie nichts miteinander zu tun haben

    Ist falsch, denn die haben was miteinander zu tun.

    Achja und was? Standest du schonmal vor einem Problem und hast dich gefragt "Hmm nehme ich da jetzt ein Zeiger oder lieber ein Array?" ... Also ich nicht.



  • out schrieb:

    Achja und was?

    Hast du schon mal ein Array an eine Funktion übergeben?

    out schrieb:

    Standest du schonmal vor einem Problem und hast dich gefragt "Hmm nehme ich da jetzt ein Zeiger oder lieber ein Array?" ... Also ich nicht.

    Fast. Ich musste ein Programm ändern, weil auf dem Rechner der Stack nicht ausreichte (µC).
    Da habe ich statt eines Arrays einen Zeiger genommen und den Speicher mit malloc besorgt. War der einzige Unterschied.



  • out schrieb:

    Sone schrieb:

    Dass sie nichts miteinander zu tun haben

    Ist falsch, denn die haben was miteinander zu tun.

    Achja und was? Standest du schonmal vor einem Problem und hast dich gefragt "Hmm nehme ich da jetzt ein Zeiger oder lieber ein Array?" ... Also ich nicht.

    Nein. Aber ich und die anderen haben doch gerade ausführlich gezeigt, wieso array[5] etwas mit Zeigern zu tun hat. :xmas1:



  • Also für micht hat etwas nur mit etwas anderem etwas zu tun, wenn ich mir die Frage stellen kann, "Nehm ich für das Probleme dieses oder jenes?"


Anmelden zum Antworten