Hi Martin!
Jetzt scheitere ich schon an einfachen Dingen :(
sehe ich nicht so - das Verständnis von Arrays und Zeigern, und in welchen Situationen sie äquivalent sind, ist alles andere als einfach.
ja, das merke ich so langsam. In PHP und Java war das Handling immer irgendwie simpel. Obwohl natürlich mehr dahintersteckt..
ich habe ein Feld:
int field[4][4]={ 0 };dieses möchte ich als Zeiger an eine Funktion übergeben (sagt man das so?):
printField(&field[0][0]);
falls ich das Feld und nicht den Zeiger übergeben möchte, würde ich prinfField(field[0][0]) schreiben?
Syntaktisch passt das zusammen; logisch nicht so ganz. Logisch betrachtet deklarierst du ein Array mit 4 Elementen, die ihrerseits wieder Arrays mit 4 int-Feldern sind. Im Arbeitsspeicher werden diese 4x4 int-Felder natürlich lückenlos hintereinander abgelegt. Dadurch erzeugen die folgenden Deklarationen im Arbeitsspeicher alle dasselbe:
int a[4][4];
int b[2][8];
int c[16];
Warum passt das logisch nicht zusammen? Ich wollte ein zweidimensionales Feld deklarieren, dessen Elemente alle mit 0 initialisiert sind.
Diese Organisation der Daten im Arbeitsspeicher sollte man einmal verstanden haben, dann wird der Rest auch wieder einfacher.
DAS war der Hinweis. Jetzt verstehe ich auch folgendes. Vielen Dank!
void printField(int *field){
int i,y; for(i=0; i<4; i++){ for(y=0; y<4; y++){ printf("%d ", *(field+i*4+y)); } printf("\n"); }
}
>
> Du deklarierst also eine Funktion, die einen Zeiger auf ein int erwartet. Ob das ein Zeiger auf eine einzelne int-Variable ist, oder ein Zeiger auf ein beliebiges(!) Element eines int-Arrays, ist syntaktisch wieder egal.
> Ferner ist die Funktion so angelegt, dass sie selbst "weiß", dass es sich beim übergebenen int-Zeiger um einen Zeiger auf das erste von 16 int-Elementen handelt, die logisch als 4 Gruppen zu je 4 Elementen gesehen werden sollen.
ist das schlecht?
>
> > das funktioniert, aber nur deshalb, weil ich in der Lösung nachgeschlagen habe. Folgendes ist mir nicht klar:
> > printf("%d ", \*(field+i\*4+y));
>
> Das ist eine alternative (ich würde sagen weniger verständliche) Notation für
>
> `printf("%d ", field[i*4+y]);`{:.language-c}
verstehe... so langsam. Ich verstehe nur noch nicht 100%, warum ich hier field nutze und nicht \*field.
>
> > Ich hätte rein gefühlsmäßig folgendes notiert
> > printf("%d ", \*field[x][y]); //PHP like sozusagen
>
> Ja. Nur dass der Compiler an dieser Stelle nicht mehr weiß, dass das per Zeiger übergebene Array als 4x4-Anordnung gemeint ist, weil du der Funktion gemäß Deklaration "irgendeinen" Zeiger auf ein int übergibst. Wenn das Array also entsprechend strukturiert ist, musst du die Reduzierung von zwei oder drei Indexen auf einen selbst vornehmen, so wie der vorliegende Code das tut.
würde ich keinen Zeiger übergeben, sondern das Array:
void printField(int field){
[..]
könnte ich
for(i=0; i<4; i++){
for(y=0; y<4; y++){
printf("%d ", field[i][y]);
schreiben, richtig?
Vielen Dank nochmal, manchmal ist ein Hinweis eben doch mehr Wert