[C++] Pointer mit Arrays(Feldern)

fre4k

Lt. Junior Grade
Registriert
Sep. 2004
Beiträge
485
Hallo
Ich wollte heute ein einfaches Programm zum üben schreiben wo in einer unterfunktion 2 werte in ein Array gespeichert werden und dann im Hauptprogramm ausgegeben werden.
Aber das ganze mit Pointern, naja erfolglos :D
mein versuch:

PHP:
#include <iostream.h>
#include <conio.h>
#include <stdio.h>



int eingabe(int* zahl1[1][1])
{


cin>>*zahl1[0][0];
cin>>*zahl1[1][1];

}





void main()
{
int zahl1[1][1];



eingabe(&zahl1[1][1]);
cout<<zahl1[0][0]<<endl;
cout<<zahl1[1][1]<<endl;

getch();

}
 
Versucht du da ein Arry im Array zu erstellen?

:confused_alt: zahl1[1][1] :confused_alt: z.B. was soll das werden kann doch nicht gehen!Hast du vor im Array weiter zu zählen also ein Feld weiter?

zahl1[0] +1?
so das
zahl1[1] raus kommt? Versteh die syntax mit [1][1] nicht den [x] ist das Arrayfeld wo ein Wert drin ist (varchar). Beschreib doch mal die Intention erm Funktion des Programms.
:confused_alt: :confused_alt: :confused_alt: :confused_alt:
 
Okay das hatte mir damals mein Lehrer net bei gebracht.. :lol: okay..ich lerne immer dazu:-)
 
also ich versteh nicht ganz warum du die Werte diagonal in dein Array einträgst, aber egal

das problem ist meiner meinung nach, dass du den falschen pointer übergibst.
statt eingabe(&zahl1[1][1]); versuchs mal mit:

eingabe(&zahl1[0][0]); oder eingabe(zahl1);

sollte beides gehen
 
Mmh.. irgendwie bringt dein Array nicht viel. Du hast ein Array der Größe 1 (Platz für 1 Element), dass ein Array der Größe 1 vom Typ int enthält. Es würde als in dem Zustand keinen Unterschied machen, ob Du einfach nur einen int verwenden würdest.

Außerdem, int* zahl1[1][1] ist nicht das, was Du willst, sondern int (*zahl1)[1][1]. Das erste, wäre ein Array von einem Array von einem Zeiger auf int. Die Regel um solche Ausdrücke zu lesen ist eigentlich nicht schwer. Vereinfach so: Du fängst in der innersten Klammer beim Variablennamen an und liest nach rechts. Wenn die Klammer sich schließt, liest Du nach links. Bist Du mir der Klammer fertig machst du das ganze wieder nach rechts weiter und dann wieder nach links, usw.....

Aber: Das brauchst Du garnicht. Denn ein Array verhält sich letztendlich genauso wie ein Pointer. Du kannst also zahl1[1][1] übergeben. Der Inhalt ändert sich dann automatisch.
 
7H3 N4C3R schrieb:
Mmh.. irgendwie bringt dein Array nicht viel. Du hast ein Array der Größe 1 (Platz für 1 Element), dass ein Array der Größe 1 vom Typ int enthält. Es würde als in dem Zustand keinen Unterschied machen, ob Du einfach nur einen int verwenden würdest.

das stimmt nicht... sein feld (int zahl1[1][1]; ) entspricht der größe von 2x2 = 4 int's
 
stimmt hast Recht...das ich da noch drauf reingefallen bin :rolleyes:

@fre4k
dadurch ergibt sich denn noch ein Fehler in dem Programm, und zwar greift [1][1] auf das vierte Element (2.Spalte, 2.Zeile) in der Tabelle zu, du hast aber nur ein 1x1 großes Array reserviert, so daß du hier über die Arraygrenzen hinaus in fremde Speicherbereiche schreibst.
 
versuchs mal so:

#include <iostream.h>
#include <conio.h>

int eingabe(int zahl1[2][2])
{
cin>>zahl1[0][0];
cin>>zahl1[1][1];

return 0;
}

void main()
{
int zahl1[2][2];

eingabe(zahl1);
cout<<zahl1[0][0]<<endl;
cout<<zahl1[1][1]<<endl;

getch();
}

wie schon erwähnt, reicht "eingabe(zahl1); " aus. du musst nich nochmal die adresse davon nehmen. zahl1 ist schon die adresse des ersten elements.

und dann einfach wieder als das interpretieren, was es ist "int eingabe(int zahl1[2][2])"

mfg
 
Scotty4BMAN schrieb:
stimmt hast Recht...das ich da noch drauf reingefallen bin :rolleyes:

@fre4k
dadurch ergibt sich denn noch ein Fehler in dem Programm, und zwar greift [1][1] auf das vierte Element (2.Spalte, 2.Zeile) in der Tabelle zu, du hast aber nur ein 1x1 großes Array reserviert, so daß du hier über die Arraygrenzen hinaus in fremde Speicherbereiche schreibst.
... wen n er Glück hat.

Dann bekommt er nämlich nur nen Seg-Fault...

Wenn er aber nun eigene Variablen erwischt passiert nichts weiter... ausser dass er ein paar schwer zu findende Bugs im Programm hat weil sich zwei Variablen immer unerwartet ändern, ohne dass er sie zwischendrin benutzt :)
 
@ homer, mit pointer...

ich glaube ich kenne den fehler:
EIn array besitz einen bereits einen pointer der auf das erste feld im array zeigt. DIeser pointer ist der name des arrays
Dass heißt du brauchst keinen pointer - ich habe aber keine ahnung wie es mit pointer gehn soll, hab ich auch shconmal versucht - ging net :D
 
Richtig, der Name des Arrays ist ein Pointer, der auf das erste Element im Array zeigt. Wie du evtl. weißt, kann man auf den Inhalt auf den ein Pointer zeigt wie folgt holen: *pointername. Also kann man es theoretisch auch so machen: *arrayname, so würdest du also den Inhalt des ersten Array-Elements kriegen. Folgendes geht auch *(arrayname + 4) wäre das vierte Element im Array, also eine äquivalente Schreibweise zu arrayname[4]. Um auf arrayname[4][4] zuzugreifen müsste sowas wie *(*(arrayname + 4) + 4) oder so möglich sein. Da ich das nicht tagtäglich mache (irgendwelche unnötig langen Varianten zu verwenden), geb ich keine Garantie drauf..
Auf jedenfall sind Pointer auf Arrays nicht nötig, da man mit dem Arraynamen schon immer eine Pointer parat hat. Wenn man ihm dennoch &zahl1 als Parameter übergeben will, müsste eingabe wie folgt aussehen:

void eingabe(int (*zahl1)[2][2])
{
cin >> (*zahl1)[0][0];
cin >> (*zahl1)[1][1];
}

Aber das wäre nun völlig unnötig.
 
Burschi1620 schrieb:
@ homer, mit pointer...

ich glaube ich kenne den fehler:
EIn array besitz einen bereits einen pointer der auf das erste feld im array zeigt. DIeser pointer ist der name des arrays
Dass heißt du brauchst keinen pointer - ich habe aber keine ahnung wie es mit pointer gehn soll, hab ich auch shconmal versucht - ging net :D

sag ich ja ;)


Homer schrieb:
wie schon erwähnt, reicht "eingabe(zahl1); " aus. du musst nich nochmal die adresse davon nehmen. zahl1 ist schon die adresse des ersten elements.

so wie es geisterfahrer geschrieben hat müsste es stimmen.
 
Zuletzt bearbeitet:
Zurück
Oben