Wie versteht man Zeigerarithmetik??



  • silent_max schrieb:

    Jetzt müsste es kompilieren.

    Noe. Und Sinn ergibt es auch nicht.



  • Aber jetzt müsste es komplierbar sein.

    Über den Sinn und Unsinn kann man streiten.

    Ich wollte "nur" ein Programm schreiben, dass die Speicheradressen um 4 Byte hochzählt, nicht mehr und auch nicht weniger.



  • silent_max schrieb:

    Aber jetzt müsste es komplierbar sein.

    Noe.

    silent_max schrieb:

    Ich wollte "nur" ein Programm schreiben, dass die Speicheradressen um 4 Byte hochzählt, nicht mehr und auch nicht weniger.

    In diesem Fall ergibt das Programm auch objektiv keinen Sinn 🤡



  • Dann wenden wir halt mal "copy and paste" an:

    #include<iostream>
    using namespace std;
    
    int main()
    {
    	cout << "\t 5 Adressen um jeweils 4 Byte hochzaehlen lassen.\n";
    	cout << "\n";
    
    	int Zahl[5];
    	int *pZahl = &Zahl[5];
    	int a;
    
    	cout << "Geben Sie fuenf Zahlen ein.\n";
    
    	for(int i=0; i<5; i++)
    	{
    		cout << "Zahl[" << i <<"]: ";
    		cin  >> a;
    	}
    
    	cout << "Die Adresse der jeweiligen Zahl lautet wie folgt:\n";
    
    	for(int i=0; i<5; i++)
    	{
    		cout << "Zahl[" << i << "]: " << &Zahl[i] << "\n";
    	}
    
    	return 0;
    }
    

    Müsste eigentlich jetzt laufen. Zumindest sind bei mir weder Warnings noch Errors.

    @ noehoe: Warum ergibt das Programm für Dich objektiv keinen Sinn? Wenn Du einen besseren Vorschlag hast, wie man die Speicheradressen auslesen kann, dann gebe mir bitte einen konstruktiven Vorschalg. Ich bin für vieles offen.



  • Sag mal raffst du es nicht? Zahl[5] existiert nicht. Hab ich doch schon mal geschrieben. 🙄 Geh mal durch dein Programm und kommentiere jede Zeile mit dem was sie macht, und wozu sie im Programm steht. (Also jede Zeile in der sich Code befindet. Kein { oder }.)



  • Auch auf die Gefahr hin, Dir Dinge zu erzählen, die Dir glasklar sind:
    Die Adresse, die Größe und noch die eine oder andere Eigenschaft von Datentypen ist unabhängig von deren Wert.
    Ein int ist ein int ist ein int !
    D.h. um Dir anzusehen, wie ein int[5] aussieht musst Du nur eins anlegen und anschauen:

    #include<iostream>
    
    int main(){
      int arr[5];
      for(const int* p=arr; p!=arr+5; ++p) // sogar mit Zeigerarithmetik...
        std::cout << "int@"<<p << '\n';
    }
    


  • Naja ... aber die Adresse &Zahl[5] gibt es schon ... ich glaube, er hat es jetzt endlich verstanden ...



  • Belli schrieb:

    Naja ... aber die Adresse &Zahl[5] gibt es schon ... ich glaube, er hat es jetzt endlich verstanden ...

    Verstehe ich etwas falsch ...

    Wenn ich

    int Zahl[5];
    

    deklariere bzw. initialisere, dann habe ich doch Elemente von Zahl[0] bis Zahl[4], also somit 5 und somit Zahl[5].



  • Lies Dir das noch mal ganz genau durch, vor allen Dingen:

    silent_max schrieb:

    ..

    Wenn ich

    int Zahl[5];
    

    deklariere bzw. initialisere, dann habe ich doch Elemente von Zahl[0] bis Zahl[4], also somit 5 und somit Zahl[5].



  • Belli schrieb:

    Lies Dir das noch mal ganz genau durch, vor allen Dingen:

    silent_max schrieb:

    ..

    Wenn ich

    int Zahl[5];
    

    deklariere bzw. initialisere, dann habe ich doch Elemente von Zahl[0] bis Zahl[4], also somit 5 und somit Zahl[5].

    Muss es so heißen:

    int Zahl [4];
    

    ??



  • Du darfst aber nicht auf Zahl[5] zugreifen wenn dein verdammtes Array nur 5 Elemente hat. Himmel!

    for(int i=0; i<5; i++)
        {
            cout << "Zahl[" << i <<"]: ";
            cin  >> a;
        }
    

    So ein Schwachsinn. Glaubst Du echt, somit kannst Du das Array mit Werten füllen?

    Such Dir ein anderes Hobby, das tut ja schon beim Zuschauen weh.



  • silent_max schrieb:

    also somit 5 und somit Zahl[5].

    Ich dachte du hast nur Zahl[0] bis Zahl[4], zumindest hast du das geschrieben. 😕



  • qweasdyxc schrieb:

    das tut ja schon beim Zuschauen weh.

    Wie würdest es denn Du machen??

    Gruß



  • silent_max schrieb:

    Belli schrieb:

    Lies Dir das noch mal ganz genau durch, vor allen Dingen:

    silent_max schrieb:

    ..

    Wenn ich

    int Zahl[5];
    

    deklariere bzw. initialisere, dann habe ich doch Elemente von Zahl[0] bis Zahl[4], also somit 5 und somit Zahl[5].

    Muss es so heißen:

    int Zahl [4];
    

    ??

    Na komm, lesen kannst Du doch ... das fettgedruckte, bist Du nicht der Meinung, dass sich das widerspricht?



  • @Belli: Da liegt ein Missverständnis vor, weil sich silent_max etwas undeutlich ausgedrückt hat.

    @silent_max: Wenn du ein Array mit 5 Elementen deklarieren willst, schreibst du natürlich

    int array[5];
    

    Und nachher kannst du zugreifen auf array[0] , array[1] , array[2] , array[3] und array[4] .

    Wir kritisieren aber diese Zeile:

    int *pZahl = &Zahl[5];
    

    Hier meinst du vermutlich das:

    int *pZahl = &Zahl;
    


  • noehoe schrieb:

    int *pZahl = &Zahl;
    

    Eher nicht, das macht nämlich genauso wenig Sinn.



  • noehoe schrieb:

    Hier meinst du vermutlich das:

    int *pZahl = &Zahl;
    

    Wenn ich das so schreibe, also

    int *pZahl = &Zahl;
    

    dann wird mir bei meinem Compiler der Adressoperator rot unterringelt mit der Meldung

    Error: Ein Wert vom Typ ""int (*)[5]"" kann nicht zum Initialisieren einer Entität vom Typ ""int *"" verwendet werden.
    

    Also frei erfunden habe ich diese Meldung nicht.

    Vielleicht liegt das an meinem Compiler... Ich nutz Microsoft Visual Studio 2010 Ultimate.

    Edit:

    Wenn ich jedoch

    int *pZahl = &Zahl[5];
    

    eingebe, ist alles ok.



  • silent_max schrieb:

    Wenn ich jedoch

    int *pZahl = &Zahl[5];
    

    eingebe, ist alles ok.

    Da mit pZahl aber überhaupt nix gemacht wird, könnte man diese Deklaration/Definition ebensogut einfach weglassen!



  • cooky451 schrieb:

    Geh mal durch dein Programm und kommentiere jede Zeile mit dem was sie macht, und wozu sie im Programm steht. (Also jede Zeile in der sich Code befindet. Kein { oder }.)



  • Belli schrieb:

    Da mit pZahl aber überhaupt nix gemacht wird, könnte man diese Deklaration/Definition ebensogut einfach weglassen!

    Ich kann mich jetzt wahrscheinlich täuschen ... aber geht das nicht Richtung Referenzen?

    Edit:

    Denn wenn ich die Zeile

    int *pZahl = &Zahl[5];
    

    weglasse, funktioniert es auch.


Anmelden zum Antworten