Wie versteht man Zeigerarithmetik??



  • 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;
    }
    




  • DirkB schrieb:

    mehr suche ich jetzt nicht

    Brauchst Du auch nicht. Ich glaube, dass der Thread besser geschlossen wird.



  • silent_max schrieb:

    Bitte an folgendem Beispiel:

    ...
    

    Ersetze
    int *pZahl=0;
    durch
    int *pZahl=Zahl;
    dann hast Du einen Zeiger auf das erste Element des Arrays. Die anderen Elemente bekommst Du mit Zeigerarithmetik (pZahl + 1, pZahl + 2...).

    int *pZahl=&Zahl[5]; tut nicht das, was Du denkst. Du bekommst nicht einen Zeiger auf ein Array[5], sondern einen Zeiger auf das sechste Element des Arrays. Da es das nicht gibt, kann alles Mögliche passieren, wenn Du darauf zugreifen willst.

    viele grüße
    ralph



  • rkhb schrieb:

    silent_max schrieb:

    Bitte an folgendem Beispiel:

    ...
    

    Ersetze
    int *pZahl=0;
    durch
    int *pZahl=Zahl;
    dann hast Du einen Zeiger auf das erste Element des Arrays. Die anderen Elemente bekommst Du mit Zeigerarithmetik (pZahl + 1, pZahl + 2...).

    int *pZahl=&Zahl[5]; tut nicht das, was Du denkst. Du bekommst nicht einen Zeiger auf ein Array[5], sondern einen Zeiger auf das sechste Element des Arrays. Da es das nicht gibt, kann alles Mögliche passieren, wenn Du darauf zugreifen willst.

    viele grüße
    ralph

    Habe ich schon geändert.

    #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=Zahl;
    
    	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;
    }
    


  • silent_max schrieb:

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

    TROLL



  • Bitte schließen! Das riecht hier zu sehr nach blurry33 und Co.



  • 👍

    KasF schrieb:

    Bitte schließen! Das riecht hier zu sehr nach blurry33 und Co.



  • silent_max schrieb:

    Habe ich schon geändert.

    So, nachdem Du nun gesehen hast, dass die Speicheradressen identisch sind, willst Du auch an die Inhalte des Arrays kommen:

    #include<iostream>
    using namespace std;
    
    int main()
    {
        int Zahl[5] = {2, 1, 0, 21,12}; //Array mit 5 Zahlen
        int *pZahl=Zahl;
    
        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;
    }
    

    Und sag Deinem Lehrer, dass es nicht "Integerwert" heißt, sondern "ganze Zahl".

    viele grüße
    ralph



  • Es gibt Personen, die fürs Programmieren einfach nicht talentiert sind.

    Auf den Threadersteller trifft das nach diesen Zig Fehlern trotz Hinweisen & Beispielen vieler, sicherlich zu.

    Ich hoffe, dass du niemals in einem Beruf arbeitest, dess Aufgabentätigkeit daraus besteht, Software zu entwickeln.


Anmelden zum Antworten