Wie versteht man Zeigerarithmetik??
-
@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!
-
Belli schrieb:
Nein, sie könnten auch mit 17 anfangen. Tun sie aber einfach nicht.
Ja entschuldige wenn ich es missverständlich ausgedrücklt habe: Wieso werden in einem Vektor/Array bei C/C++ die Element von 0 bis n-1 nummeriert und nicht von 1 bis n?
-
silent_max schrieb:
#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 DEFINIEREN, NICHT INITIALISIEREN int *pZahl = &Zahl[5]; //Pointer auf das Array initialisieren DER POINTER ZEIGT HINTER DAS ARRAY UND WIRD NIE GEBRAUCHT int a; // Variable deklarieren UND DEFINIEREN, WIRD ABER NIE WIRKLICH GEBRAUCHT 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 A WIRD NICHT WEITER VERARBEITET, WOZU ALSO? } 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??
-
Namal schrieb:
Belli schrieb:
Nein, sie könnten auch mit 17 anfangen. Tun sie aber einfach nicht.
Ja entschuldige wenn ich es missverständlich ausgedrücklt habe: Wieso werden in einem Vektor/Array bei C/C++ die Element von 0 bis n-1 nummeriert und nicht von 1 bis n?
Keine Ahnung, aber warum nicht von 17 bis 17 + n - 1?
Vielleicht gewachsen aus der Maschinensprache ... weil man dort soviel ich weiß, mit Offsets rechnet/gerechnet hat.
Letztendlich ist es aber doch egal.
-
Belli schrieb:
silent_max schrieb:
[cpp]
[...]
int *pZahl = &Zahl[5]; //Pointer auf das Array initialisieren DER POINTER ZEIGT HINTER DAS ARRAY UND WIRD NIE GEBRAUCHT
[...]
Ich hoffe, dass es jetzt bisschen verständlicher wird??
Ein Pointer AUF das Array wäre übrigens:
int *pZahl = Zahl;oder von mir aus auch:
int *pZahl = &Zahl[0];
-
Namal schrieb:
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?
Informatiker mögen halt die 0. :p Wenn etwas nicht bei 0 beginnt, bin ich verwirrt. Außerdem bezeichnet der Index ja den Offset. Wenn es kein Offset gibt (0), landest du am Anfang. Darum finde ich es auch logisch, dass es bei 0 beginnt. Im Übrigen kannst du auch den Variablennamen als Offset hernehmen, also kannst statt Zahl[0] auch 0[Zahl] schreiben.
-
Namal schrieb:
Wieso werden in einem Vektor/Array bei C/C++ die Element von 0 bis n-1 nummeriert und nicht von 1 bis n?
Es ist einfach konsequenter von 0 zu starten. Ausserdem macht es einige Rechnungen kürzer.
vec[i % vec.size()] vs. vec[i % vec.size() + 1] vec[i/2] vs vec[(i-1)%2+1]Why numbering should start at zero
Wikipedia: Zero-based numbering
-
Belli schrieb:
Keine Ahnung, aber warum nicht von 17 bis 17 + n - 1?
Ja warum eigentlich nicht? Würde genausoviel Sinn machen wie jetzt.
-
out schrieb:
Im Übrigen kannst du auch den Variablennamen als Offset hernehmen, also kannst statt Zahl[0] auch 0[Zahl] schreiben.
Bei einem std::vector oder einem std::array geht das schon nicht mehr.
-
Namal schrieb:
Belli schrieb:
Keine Ahnung, aber warum nicht von 17 bis 17 + n - 1?
Ja warum eigentlich nicht? Würde genausoviel Sinn machen wie jetzt.
Weil die 0 eben vor der 1 kommt?
Außerdem macht das wie gesagt wegen Offets Sinn.arr[0] ist äquivalent zu arr + 0
arr[1] ist äquivalent zu arr + 1*sizeof(*arr)
arr[2] ist äquivalent zu arr + 2*sizeof(*arr)etc