C++ Anfängerproblem |
dan
Grünschnabel
Dabei seit: 17.01.2015
Beiträge: 1
|
|
Meine Frage:
In meiner Einführungsveranstaltung für Informatik sollen wir in einer Übung die Werte angeben, die Variablen an verschiedenen Stellen annehmen. Das Programm sieht wie folgt aus:
#include <iostream >
using namespace std ;
int main (){
const int anzahlZahlen = 4;
int zahlen [ anzahlZahlen ] = { 4, 3, 42, 2};
int ? ptr1 = zahlen ;
const int pivot = zahlen [0];
for ( int ? ptr2 = zahlen ; ptr2 != zahlen+anzahlZahlen ; ++ptr2 ){
(...)
Mein Problem ist, zu bestimmen, für welchen Wert "zahlen" steht. Es wird in diesem Programm offenbar als eine Variable benutzt, allerdings ist "zahlen" doch ein Array-> int zahlen [ anzahlZahlen ] = { 4, 3, 42, 2};.
Meine Ideen:
Ich verstehe nicht, wie ein array in diesem Zusammenhang genutzt werden kann, da ich für *prtr2 in diesem: -> for ( int ? ptr2 = zahlen,...) Zusammenhang ja mehrere Zahlen angeben würde, was sinnfrei wäre.
|
|
17.01.2015 08:50 |
|
|
|
Das ? sollte wohl ein * werden.
Wenn du mit einem Zeiger auf ein Array zeigen lässt, ist das das selbe, wie wenn du auf den ersten Wert des Arrays zeigst.
int* ptr2 = zahlen entspricht also int* ptr2 = zahlen[0]
__________________ Syntax Highlighting fürs Board (Link)
|
|
17.01.2015 09:11 |
|
|
as_string
Haudegen
Dabei seit: 06.11.2013
Beiträge: 638
Herkunft: Heidelberg
|
|
Zitat: |
Original von eulerscheZahl
Wenn du mit einem Zeiger auf ein Array zeigen lässt, ist das das selbe, wie wenn du auf den ersten Wert des Arrays zeigst.
int* ptr2 = zahlen entspricht also int* ptr2 = zahlen[0] |
Da muss ich leider widersprechen! Der Zeiger nimmt bei ersterem die Adresse des ersten Elements von zahlen auf (zeigt also auf dieses Element). Mit *ptr2 kann dann auf den Wert zugegriffen werden, auf den ptr2 zeigt, und das ist dann der selbe Wert wie zahlen[0]. Man könnte sogar ptr2[0] verwenden, oder auch *zahlen, das ist dann prinzipiell äquivalent, wenn auch nicht besonders gut lesbar dann.
Das zweite Beispiel würde wohl beim Kompilieren normalerweise eine Warnung nach sich ziehen: Du weißt dabei den ersten Wert des Arrays einem Zeiger zu. In C geht das prinzipiell zwar schon, da ein Zeiger i. A. gleich groß oder größer ist, als ein Integer. Aber das ist normalerweise nicht besonders sinnvoll und nicht gewollt.
Letztlich ist ein Array in C nicht so unterschiedlich zu einem Zeiger und beides kann als jeweils das andere normalerweise auch verwendet werden. Man kann auch sagen: Die Array-Variable ist eigentlich ein Zeiger auf das erste Element des Arrays, nur die Initialisierung führt im vorliegenden Fall dazu, dass auch noch Speicher auf dem Stack reserviert wird und die Werte dort einer nach dem anderen abgelegt werden.
Gruß
Marco
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von as_string: 17.01.2015 16:53.
|
|
17.01.2015 16:51 |
|
|
|
Gut aufgepasst, es gibt sogar einen Fehler: error: invalid conversion from ‘int’ to ‘int*’ [-fpermissive] int* ptr2 = zahlen[0];
So funktioniert es wieder: int* ptr2 = &zahlen[0];
__________________ Syntax Highlighting fürs Board (Link)
|
|
17.01.2015 17:20 |
|
|
Karlito
Kaiser
Dabei seit: 11.04.2011
Beiträge: 1.461
|
|
Nur eine Anmerkung:
ich empfehle bei C und C++ immer den Stern an die Variable zu schreiben. C und C++ sind leider ein wenig unintuitiv was die deklaration von Pointern angeht. Deklariert man
so ist leider entgegen der Intuition nur x ein int-Pointer. Das wird mit der Schreibweise
besser klar.
Gruß,
Karlito
|
|
17.01.2015 17:34 |
|
|
as_string
Haudegen
Dabei seit: 06.11.2013
Beiträge: 638
Herkunft: Heidelberg
|
|
Zitat: |
Original von eulerscheZahl
So funktioniert es wieder: int* ptr2 = &zahlen[0]; |
Genau! Das ist auch die Schreibweise, die ich generell empfehlen würde, auch wenn sie vielleicht etwas umständlich erscheint, weil man ja das "&" und das "[0]" einfach weg lassen könnte. Trotzdem wird so ganz explizit gemacht, was ein Array und was ein Zeiger ist, wenn auch C das nicht selbst wirklich unterscheidet.
Wichtig in diesem Beispiel ist auch noch, dass der Zeiger in der for-Schleife inkrementiert wird. Das ist nämlich gar nicht so ganz trivial, weil es schon Zeiger-Arithmetik ist: Der Compiler Zählt die in ptr2 gespeicherte Adresse nicht einfach um den Wert eins hoch, sondern um genau so viele, wie der Typ, auf den der Zeiger zeigt, definiert ist. Wenn es also ein int-Zeiger ist (also mit int* deklariert wurde), dann wird die Adresse um sizeof(int) erhöht. Das ist wichtig, damit der Zeiger im nächsten Schleifendurchlauf dann auch wirklich auf den nächsten Integer-Wert zeigt.
Gruß
Marco
|
|
17.01.2015 17:38 |
|
|
|