Robocop1 hat geschrieben: ↑Di Mär 16, 2021 2:29 am
Hi,
Vorweg, bitte Quelltext als Text und nicht als Bild. Ich kann aus Bildern keine Zeilen quoten.
Robocop1 hat geschrieben: ↑Di Mär 16, 2021 2:29 am
ich verstehe nicht wie C erkennt, dass bei Eingabe von 3x3 Matrix-Elementen, er nach 3 Eingaben in die nächste Zeile hüpfen muss.
Und woher erkennt C die "Koordinaten", dass bei
sum += a [i,k] * b[k][j]
=> [i,k] für die Zeilen- und Spaltennummer von Matrix A steht,
bzw.
=> [k][j] für die Spalten- und Zeilennummer von Matrix B ?
Die Schreibweise a[i,k] steht NICHT für den Matrizenzugriff.
Es gibt in C nur Vektoren, also nur eindimensionale Arrays. Es gibt keine Matrizen.
Darum gibt es auch keinen Zugriff in der Form [i,k].
Was es gibt ist der Komma-Operator und der führt das linke Argument aus, dann das rechte und gibt das Ergebnis des rechten Operanden zurück. Statt i,k kannst Du also auch einfach k schreiben. Wenn Du a[i,k] schreibst passiert a[k], also der Zugriff auf ein eindimensionales Objekt an der Position k.
Der Zugriff b[k][j] ist korrekt. Wenn b ein zweidimensionales Array ist, sagen wir int b[2][4], dann ist b ein eindimensionales Array mit 4 Arrays der Größe 2 ints. Die ints liegen alle hintereinander im Speicher.
Schauen wir uns das im Speicher an. Das ist b: {{11,12},{21,22},{31,32},{41,42}}. Die Zahlen liegen hintereinander im Speicher.
Wenn Du also auf das Element b[k][j] zugriefst, ist ist b[k] das k. Zweierarray. b[1] guckt also wo liegt b, zum Beispiel an Adresse 1000. Jetzt überspringst Du 1 mal den Typen, des Arrays. Der Typ ist int[2], also zwei ints. Zwei ints sind 8 Byte groß, das addieren wir auf die 1000: An Adresse 1008 liegt also etwas, was ein int[2] darstellen so. Jetzt kommt die zweite Klammer {21,22}[0]. {21,22} ist ein Array aus ints. Ein int ist 4 Byte groß, davon möchte ich 0 überspringen. 1008 + 0*4 Bytes sind 1008. An Adresse 1008 finde ich also die Zahl, die b[1][0] adressieren soll: 21.
Das funktioniert auch mit b[0][2]. b ist 1000, wir überspringen 0 2-int-Arrays, also bekommen wir wieder tausend 1000 raus. Jetzt haben wir ein Array von ints. Hier überspringen wir zwei ints. 1000+2*4 sind 1008. Das Element b[0][2], also das dritte Element in ersten zweier Array ist 21, die sich offiziell gar nicht in den Typen reinpasst, und sich auch nicht darin befindet. b[0][2] wäre hier ein Programmierfehler.