Wie versteht man Zeigerarithmetik??



  • 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?"



  • out schrieb:

    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?"

    Da fallen mir jetzt aber auf Anhieb so viele alberne Gegenbeispiele ein, dass ich nicht denke, dass ich eins hinschreiben muss. 😉



  • DirkB schrieb:

    out schrieb:

    Achja und was?

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

    Ja, und jetzt? Da geschieht nur eine Konvertierung. Das geschieht auch wenn du einem double ein bool zuweist und umgekehrt. Ich würde auch nicht behaupten, dass ein bool und ein double etwas miteinander zu tun haben.

    DirkB schrieb:

    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.

    Najut, das hast du dich aber nur gefragt, weil es nicht anders ging. Das war ja dann eher gezwungenermaßen.



  • Dobi schrieb:

    Da fallen mir jetzt aber auf Anhieb so viele alberne Gegenbeispiele ein, dass ich nicht denke, dass ich eins hinschreiben muss. 😉

    Och, nenn doch zumindest eines. :p



  • out schrieb:

    Najut, das hast du dich aber nur gefragt, weil es nicht anders ging. Das war ja dann eher gezwungenermaßen.

    Ich hätte mich auch durch die Compileroptionen wühlen können und dann den Stack vergrößern. Dann hätte ich aber auch wissen müssen wie groß das Array wirklich ist.



  • out schrieb:

    Dobi schrieb:

    Da fallen mir jetzt aber auf Anhieb so viele alberne Gegenbeispiele ein, dass ich nicht denke, dass ich eins hinschreiben muss. 😉

    Och, nenn doch zumindest eines. :p

    Für mich haben Mehl und Butter was miteinander zu tun, weil ich beide zum Plätzchenbacken brauche. Austauschen kann ich sie aber normalerweise nicht.
    Na gut, du wirst dann ankommen mit etwas in der Art von: "Wenn ich einen Sack voll irgendwas als Gewicht brauche, kann ich das Problem mit Butter oder Mehl im Sack lösen. Also haben die beiden laut meiner Definition was miteinander zu tun."
    So sehr weit gefasst, findet man aber sicher auch was, das man mit Zeigern oder mit Arrays lösen kan. Also doch q.e.d. 😛



  • Ich habe folgenden Code programmiert:

    #include<iostream>
    using namespace std;
    
    int main()
    {
    	cout << "\t 5 Adressen um jeweils 4 Byte hochzaehlen lassen.\n";
    	cout << "\n";
    
    	int Zahl[5]; //Array mit 5 Zahlen 
    	int *pZahl=0;
    
    	for(int i=0; i<5; i++)
    	{
    		cout << "Zahl[" << i << "]: " << &Zahl[i] << "\n";
    	}
    
    	cout << pZahl + 0 << "\n";
    	cout << pZahl + 1 << "\n";
    	cout << pZahl + 2 << "\n";
    	cout << pZahl + 3 << "\n";
    	cout << pZahl + 4 << "\n";
    
    	return 0;
    }
    

    Ist es normal, dass die Zeiger auf andere Adressen zeigen als die Arrays?

    Das wird ausgegeben:

    5 Adressen um jeweils 4 Byte hochzaehlen lassen.
    Zahl[0]:001DFEEC
    Zahl[1]:001DFEF0
    Zahl[2]:001DFEF4
    Zahl[3]:001DFEF8
    Zahl[4]:001DFEFC
    00000000
    00000004
    00000008
    0000000C
    00000010
    


  • Welchen Wert hat pZahl?



  • Sorry, mein Fehler, habe den Pointer nicht auf den Array initialisiert...

    int *pZahl=&Zahl[5];
    


  • silent_max schrieb:

    int *pZahl=&Zahl[5];
    

    Sag mal, was soll denn der Scheiß jetzt schon wieder. 😮
    Kannst du dir nicht mal merken, was hier seit gestern mehrmals geschrieben wird.
    🙄 😡 😞 👎

    Diese Initialisierung ist Humbug. Du bekommst damit die Adresse vom Element mit dem Index 5. Das existiert nicht.
    Die Indizes gehen nur von 0 bis 4.



  • Dann zeig mir mal bitte ganz konkret, wie ich über Pointer an die Adresse eines Arrays hinkomme.

    Bitte an folgendem Beispiel:

    #include<iostream>
    using namespace std;
    
    int main()
    {
    	cout << "\t 5 Adressen um jeweils 4 Byte hochzaehlen lassen.\n";
    	cout << "\n";
    
    	int Zahl[5]; //Array mit 5 Zahlen 
    	int *pZahl=0;
    
    	for(int i=0; i<5; i++)
    	{
    		cout << "Zahl[" << i << "]: " << &Zahl[i] << "\n";
    	}
    
    	cout << pZahl + 0 << "\n";
    	cout << pZahl + 1 << "\n";
    	cout << pZahl + 2 << "\n";
    	cout << pZahl + 3 << "\n";
    	cout << pZahl + 4 << "\n";
    
    	return 0;
    }
    



Anmelden zum Antworten