Wie versteht man Zeigerarithmetik??
-
silent_max schrieb:
Ich wollte einfach ein Programm schreiben, das mir von 5 Elementen die ich per Tastatur einlese
Lass Dir Deine Zahlen mal zum Spaß ausgeben. Du füllst das Array nicht mit Werten, es ist totaler Blödsinn den Du da gemacht hast. Die Eingaben werden in a gemacht, und landen nie im Array.
Blurry333 postet auch wieder. Ihr würdet euch bestimmt gut verstehen.
-
Verstehe nicht, wie man bei diesem Thema 10 Seiten brauchen kann, ohne zu einem Abschluss zu kommen...
-
[quote="silent_max"]Dann halt hier mit Begründungen:
#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, damit ich 5 Elemente habe // Um was damit zu tun? int *pZahl = &Zahl[5]; //Pointer auf das Array initialisieren, damit ich auf die Adressen des Arrays zugreifen kann // Das kannst du auch so? Du benutzt den Pointer nicht mal. int a; // Variable deklarieren, damit ich fuer cin nachher Werte eingeben kann und diesmal nicht i habe // Der Satz macht keinen Sinn. 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, damit ich z. B. 1,2,3,4,5 eigeben kann // Um was damit zu tun? } 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; }silent_max schrieb:
Und da Du den Code schon länger als sinnlos erachtest, bitte ich Dich darum, einen äquivalenten Code zu schreiben, der die Speicheradressen von insgesamt 5 Elementen ausliest....
#include <iostream> int main() { int arr[5]; for (unsigned i = 0; i != 5; ++i) std::cout << &arr[i] << '\n'; }Fällt dir was auf?
-
SeppJ schrieb:
Meinst du nicht vielleicht, dass ich dich mit meiner Frage auf irgendetwas aufmerksam machen wollte oder bist du der Ansicht, dass dein Programm so absolut in Ordnung ist?
Sorry, aber ich hocke schon viel zu lange vor meinem Netbook. Ich muss echt mal eine Pause machen... Ich glaube, dass Du mich mit Deiner Frage auf etwas hinweisen wolltest, so viel raff ich im Moment noch.
Alles andere werde ich später bearbeiten, wenn ich eine Pause gemacht habe.
Ich hätte jetzt mal an Dich SeppJ eine Frage... Handelt es sich dabei bei der ganzen Thematik um Referenzen?? Weil im Endeffekt handelt es sich ja nicht mehr um Pointer, denn wenn ich Zeile 10
int *pZahl = &Zahl[5];weg lassen kann...
-
Belli schrieb:
Also ich zum Beispiel, ich bin zu blöd zum Tapezieren und Anstreichen, ich kann nicht mal vernünftig einen Nagel in die Wand kloppen ...
Ich hab das irgendwann eingesehen, und dann hab ich es einfach sein lassen ...Ja das haben die dem Arnold auch eingeredet, als er die ersten 20 mal versucht hat Schauspieler zu werden.
-
camper schrieb:
Verstehe nicht, wie man bei diesem Thema 10 Seiten brauchen kann, ohne zu einem Abschluss zu kommen...
Ich amüsier´ mich königlich. Kann ruhig noch ein paar Seiten weitergehen

-
Der hat ja dann wohl aus irgend einem Grund einen Arbeitgeber gefunden. Möchtest Du silent_max einen Job als C++ - Programmierer geben?
-
Namal schrieb:
Ja das haben die dem Arnold auch eingeredet, als er die ersten 20 mal versucht hat Schauspieler zu werden.
Aber seien wir doch mal ehrlich.. sie hatten recht.

-
silent_max schrieb:
Handelt es sich dabei bei der ganzen Thematik um Referenzen?? Weil im Endeffekt handelt es sich ja nicht mehr um Pointer, denn wenn ich Zeile 10
e um Referenzen geht es hier nicht. Es geht hier auch eigentlich nicht um Pointer. Es geht hier einfach nur um ein Array und dessen Elemente.
-
cooky451 schrieb:
Namal schrieb:
Ja das haben die dem Arnold auch eingeredet, als er die ersten 20 mal versucht hat Schauspieler zu werden.
Aber seien wir doch mal ehrlich.. sie hatten recht.

Sein dickes Bankkonto sagt: sie hatten unrecht.
-
@silent_max
Wo im Rest des Programmes benutzt du noch pZahl ?
Nirgends. Also kannst du es weglassen.
Es wurde schon mehrmals sehr deutlich klar gemacht, dass das Element 5 nicht existiert. Also darfst du auch nicht dessen Adresse benutzen.Die Adresse von dem Array bekommst du einfach nur durch den Namen. Auch das wurde schon geschrieben.
-
out schrieb:
Belli schrieb:
Ein Pointer AUF das Array wäre übrigens:
int *pZahl = Zahl;oder von mir aus auch:
int *pZahl = &Zahl[0];Nein, jetzt hast du einen Pointer auf ein char. Wenn du ein Pointer auf das Array willst, musst du schon
int (*pZahl)[5] = &Zahl;schreiben.
Und wie greift man dann über den Zeiger *pZahl auf die Werte zu?
/* C99 */ #include <stdio.h> #define MAX 5 int main(){ int zahl[MAX] = {42, 2, 3, 4, 5}; int (*pZahl)[5] = &zahl; int *p2 = zahl; // geht auch int *p3 = &zahl[0]; // geht auch for (int i = 0; i < MAX; i++){ printf("i = %i\n", (void*)pZahl[i]); // WTF? printf("i2 = %i\n", *(p2+i)); // geht printf("i3 = %i\n", *(p3+i)); // geht } return 0; }Beim klassischen *p2 geht's, aber bei *pZahl scheint's nicht zu klappen.
Und ich habe jetzt schon vieles im printf Ausdruch probiert, ich erhalte nur Adressen.Getestet habe ich in Zeile 13 via "trial end error" auch:
(void*)pZahl[i]
*(pZahl+i)
*pZahl[i]
(pZahl+i)
(void)pZahl+i
(void)pZahl[i]Und das geht alles nicht.
-
Okay, hab's herausgefunden:
printf("i = %i\n", (*pZahl)[i]);
int *p2 = zahl;
und
int *p3 = &zahl[0];gehen allerdings trotzdem und sind gültiges C.
-
Geht übrigens auch in C++
#include<iostream> #define MAX 5 int main(){ int zahl[MAX] = {42, 2, 3, 4, 5}; int (*pZahl)[MAX] = &zahl; int *p2 = zahl; int *p3 = &zahl[0]; for (int i = 0; i < MAX; i++){ std::cout << "i = " << (*pZahl)[i] << std::endl; std::cout << "i2 = " << *(p2+i) << std::endl; std::cout << "i3 = " << *(p3+i) << std::endl; } }Warum sollte also
int *p2 = zahl;
oder
int *p3 = &zahl[0];falsch sein?
-
out schrieb:
Nein, jetzt hast du einen Pointer auf ein char. Wenn du ein Pointer auf das Array willst, musst du schon
Und wieso eigentlich char?
Das Array besteht doch aus int Werten.
-
out schrieb:
out schrieb:
Nein, jetzt hast du einen Pointer auf ein char.
char, wie komm ich auf char
ich meinte natürlich int.Dann rate ich dir mal alles durchzulesen und nicht nur einen Teil..
-
cooky451 schrieb:
Namal schrieb:
Ja das haben die dem Arnold auch eingeredet, als er die ersten 20 mal versucht hat Schauspieler zu werden.
Aber seien wir doch mal ehrlich.. sie hatten recht.

Nö, kein Terminator ohne Arni.
-
xStrykex schrieb:
out schrieb:
out schrieb:
Nein, jetzt hast du einen Pointer auf ein char.
char, wie komm ich auf char
ich meinte natürlich int.Dann rate ich dir mal alles durchzulesen und nicht nur einen Teil..
Ah so, war noch in der Mitte des Threads.
Bleiben noch die Fragen offen, warum man kein
int *p2 = zahl;
oder
int *p3 = &zahl[0];benutzen sollte.
-
Das ist nicht prinzipiell falsch, es ist im gezeigten Programm bloß völlig sinnlos, da der Zeiger nicht benutzt wird. Es gibt ja auch gar keinen Grund, diesen Zeiger jemals zu benutzen, da er schließlich bloß auf den Anfang des Arrays zeigt und man somit ebenso gut auch gleich den Arraybezeichner direkt benutzen könnte.
-
SeppJ schrieb:
Das ist nicht prinzipiell falsch, es ist im gezeigten Programm bloß völlig sinnlos, da der Zeiger nicht benutzt wird. Es gibt ja auch gar keinen Grund, diesen Zeiger jemals zu benutzen, da er schließlich bloß auf den Anfang des Arrays zeigt und man somit ebenso gut auch gleich den Arraybezeichner direkt benutzen könnte.
Das ist mir schon klar, aber out schrieb ja:
http://www.c-plusplus.net/forum/p2281536#2281536
Selbst wenn der Pointer auf das erste Element des Arrays zeigt, also auf ein int, dann habe ich mit diesem Pointer mithilfe der Zeigerarithmetik dennoch zugriff auf das vollständige Array.
Warum sollte ich den Pointer also auf ein Array zeigen lassen, wozu?
Was ist der Sinn dahinter, wenn das zeigen auf das erste Element genügt.