Wie versteht man Zeigerarithmetik??
-
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.
Einintist einintist einint!
D.h. um Dir anzusehen, wie einint[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]undarray[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.
-
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 }.)
Versuch das doch mal, max.
-
qweasdyxc schrieb:
Du darfst aber nicht auf Zahl[5] zugreifen wenn dein verdammtes Array nur 5 Elemente hat. Himmel!
So offtopmäßig: Warum müssen die Zählindizes mit 0 anfangen? Ich meine hat es einen bestimmten Grund oder eine Notwendigkeit?
-
Nein, sie könnten auch mit 17 anfangen. Tun sie aber einfach nicht.
-
#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 Elementen initialisieren int *pZahl = &Zahl[5]; //Pointer auf das Array initialisieren int a; // Variable deklarieren cout << "Geben Sie fuenf Zahlen ein.\n"; for(int i=0; i<5; i++) { cout << "Zahl[" << i <<"]: "; //Für Elemente von 0 bis 4 Werte bzw. Zahlen eingeben cin >> a; //Variable a fuer die Werteeingabe } cout << "Die Adresse der jeweiligen Zahl lautet wie folgt:\n"; for(int i=0; i<5; i++) { cout << "Zahl[" << i << "]: " << &Zahl[i] << "\n"; // Adresse fuer die Elemente 0 bis 4 ausgeben } return 0; }Ich hoffe, dass es jetzt bisschen verständlicher wird??
-
silent_max schrieb:
Ich hoffe, dass es jetzt bisschen verständlicher wird??
Häh? Der einzige, der hier irgendwas nicht versteht, bist Du!