Warmbier: C - Zeigerfrage Array

Beitrag lesen

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.

Hach, wehowei. Dennis Ritchie und seine Mitstreiter hatten Ahnung von dem, was sie taten. PHP hingegen ist ein ohne Sinn und Konzept zusammengeschusterter Haufen Scheiße. Das sieht irgendwie ein wenig aus wie C, aber das war's auch schon. Es ist schon beinahe tragisch, Jahrzehnte der Forschung an Programmiersprachen – und dann kommt so eine Missgeburt daher, die jeder Beschreibung spottet.
Also bitte: Tieferes Verständnis für PHP wirst du aus C nicht erlernen.

Aber davon mal abgesehen: Die beiden Sprachen unterscheiden sich zudem in den technischen Grundlagen. Das eine wird in Maschinencode übersetzt, das andere ist eine Interpretersprache.

int field[4][4]={ 0 };

dieses möchte ich als Zeiger an eine Funktion übergeben (sagt man das so?):
printField(&field[0][0]);

Du möchtest einen Zeiger auf das Feld übergeben.

for(i=0; i<4; i++){
for(y=0; y<4; y++){
printf("%d ", *(field+i*4+y));
}

Folgendes ist mir nicht klar:
printf("%d ", *(field+i*4+y));

was genau soll das?

C arbeitet vergleichsweise maschinennah.

Deine Variable liegt irgendwo im Speicher des Computers, der Computerspeicher ist Byte für Byte über eine Adresse ansprechbar. Ein Zeiger auf eine Variable ist nichts anderes als die Adresse im Speicher, an der die Variable abgelegt ist (Speichermanagment lassen wir jetzt mal beiseite).

Mit einer Zeichenkette ist das einfach zu verstehen:

Buchstabe: abcdefg
Byte:      0123456

Die Zeichenkette belegt sieben aufeinanderfolgende Bytes im Speicher. Das c erreichst du, indem du die Startadresse der Zeichenkette nimmst und 2 hinzuaddierst.

Dein Feld besteht aus vier Zeilen à vier Spalten bzw. Zellen. Die einzelnen Zellen liegen allesamt nacheinander im Speicher. Du kannst daher auf jede einzelne Zelle zugreifen, indem du die Adresse der Variable nimmst (&field) und dann die gewünschte Anzahl hinzuaddierst. Die erste Zelle liegt an der Startadresse, die zweite an Startadresse + 1, die dritte an Startadresse + 2 etc. Die Zellen der zweiten Zeile erreichst du, indem du 2 * Spaltenzahl hinzuaddierst, die Zellen der dritten Zeile über 3 * Spaltenzahl.

Genau dies passiert in den beiden Schleifen:

for(i=0; i<4; i++){ // Zeilenzähler
for(y=0; y<4; y++){ // Spaltenzähler
printf("%d ", *(field+i*4+y)); // Zelle = Startadresse von field + Zeilenzahl i * Zeilenlänge 4 + Spalte y

Mit dem Sternchen wird der Zeiger sozusagen rückabgewickelt, denn du möchtest den Inhalt ausgeben, der an der betreffenden Adresse steht, nicht die Adresse selbst. Aber probier's mal aus: Nimm das Sternchen und die dazugehörige Klammer weg, dann solltest du in der Ausgabe nacheinander die Speicheradressen sehen.