Hallo,
Mache gerade meine ersten Schritte in C, weil ich das immer schon mal lernen wollte. Ich erhoffe mir dadurch ein tieferes Verständnis von anderen Sprachen, vor allem PHP.
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.
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]);
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];
Diese Organisation der Daten im Arbeitsspeicher sollte man einmal verstanden haben, dann wird der Rest auch wieder einfacher.
void printField(int *field){
int i,y;
for(i=0; i<4; i++){
for(y=0; y<4; y++){
printf("%d ", (field+i4+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.
> 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}
> 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.
So long,
Martin
--
Zivilisation bedeutet, dass die Eskimos warme Wohnungen bekommen und dann arbeiten müssen, damit sie sich einen Kühlschrank leisten können.
Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(