Parameterübergabe von zweidimensionalen Feldern in Funktionen.

63
Parameterüberga be von zweidimensional en Feldern in Funktionen

Transcript of Parameterübergabe von zweidimensionalen Feldern in Funktionen.

Parameterübergabe von

zweidimensionalen Feldern in Funktionen

1. Möglichkeit:

Funktionsaufruf mit Feld als Parameter:

Die Adresse des nullten Elements des Feldes wird an die Funktion übergeben.

Beispiel:

Die Funktion ffmf soll die 2. Spalte der 1. Zeile eines zweidimensionalen Feldes auf den Wert von 197 setzen.

Beachte:Nummerierung beginnt bei 0 !

int main(){ int zv[4][3]= {{11,12,13}, {14,15,16}, {17,18,19}, {20,21,22}};

}// gleichbedeutend mit:

ffmf(zv);

ffmf(&zv[0]);

int main(){ int zv[4][3]= {{11,12,13}, {14,15,16}, {17,18,19}, {20,21,22}}; ffmf(&zv[0]);

Was wird also bei diesem Funktionsaufruf übergeben ?

Die Adresse des 0. Elements (Komponente) des 2-dimensionalen Feldes zv.

Aus welchen Elementen (Komponenten) besteht aber allgemein ein 2-dimensionales Feld ?

int main(){ int zv[4][3]= {{11,12,13}, {14,15,16}, {17,18,19}, {20,21,22}} ffmf(zv);}

0100 11zv[0][0]

0104 1201080112 14

1516171819202122

13

0116012001240128

0132013601400144

zv[0][1]zv[0][2]

zv[1][0]zv[1][1]zv[1][2]zv[2][0]zv[2][1]zv[2][2]zv[3][0]zv[3][1]zv[3][2]

Die Elemente eines zweidimensionalen Feldes sind EINDIMENSIONALE Felder

int main(){ int zv[4][3]= {{11,12,13}, {14,15,16}, {17,18,19}, {20,21,22}} ffmf(zv);}

0100 11zv[0][0]

0104 1201080112 14

1516171819202122

13

0116012001240128

0132013601400144

zv[0][1]zv[0][2]

zv[1][0]zv[1][1]zv[1][2]zv[2][0]zv[2][1]zv[2][2]zv[3][0]zv[3][1]zv[3][2]

Ein zweidimensionales Feld besteht also aus lauter eindimensionalen Feldern

int main(){ int zv[4][3]= {{11,12,13}, {14,15,16}, {17,18,19}, {20,21,22}} ffmf(zv);}

0100 11zv[0][0]

0104 1201080112 14

1516171819202122

13

0116012001240128

0132013601400144

zv[0][1]zv[0][2]

zv[1][0]zv[1][1]zv[1][2]zv[2][0]zv[2][1]zv[2][2]zv[3][0]zv[3][1]zv[3][2]

welchen Speicher belegt z.B. also das 3. eindimensionale Feld (Element) von zv ?

welchen Speicher belegt also z.B. das 2. eindimensionale Feld (Element) von zv ?

int main(){ int zv[4][3]= {{11,12,13}, {14,15,16}, {17,18,19}, {20,21,22}} ffmf(zv);}

0100 11zv[0][0]

0104 1201080112 14

1516171819202122

13

0116012001240128

0132013601400144

zv[0][1]zv[0][2]

zv[1][0]zv[1][1]zv[1][2]zv[2][0]zv[2][1]zv[2][2]zv[3][0]zv[3][1]zv[3][2]

welchen Speicher belegt z.B. also das 1. eindimensionale Feld (Element) von zv ?

welchen Speicher belegt also z.B. das 0. eindimensionale Feld (Element) von zv ?

int main(){ int zv[4][3]= {{11,12,13}, {14,15,16}, {17,18,19}, {20,21,22}} ffmf(zv);}

0100 11zv[0][0]

0104 1201080112 14

1516171819202122

13

0116012001240128

0132013601400144

zv[0][1]zv[0][2]

zv[1][0]zv[1][1]zv[1][2]zv[2][0]zv[2][1]zv[2][2]zv[3][0]zv[3][1]zv[3][2]

Wie groß ist jeweils ein eindimensionales Feld (farbig umrandetes Element) (Speichergröße in Byte) ?

int main(){ int zv[4][3]= {{11,12,13}, {14,15,16}, {17,18,19}, {20,21,22}} ffmf(zv);}

0100 11zv[0][0]

0104 1201080112 14

1516171819202122

13

0116012001240128

0132013601400144

zv[0][1]zv[0][2]

zv[1][0]zv[1][1]zv[1][2]zv[2][0]zv[2][1]zv[2][2]zv[3][0]zv[3][1]zv[3][2]

zv ist ein zweidimensionales Feld. Es besteht aus den farbig umrandeten eindimensionalen Feldern mit jeweils der Größe 3*4 Byte.

... weil ein eindimensionales Feld aus 3 integer Zahlen (zu je 4 Bytes) besteht.

int main(){ int zv[4][3]= {{11,12,13}, {14,15,16}, {17,18,19}, {20,21,22}} ffmf(zv);}

0100 11zv[0][0]

0104 1201080112 14

1516171819202122

13

0116012001240128

0132013601400144

zv[0][1]zv[0][2]

zv[1][0]zv[1][1]zv[1][2]zv[2][0]zv[2][1]zv[2][2]zv[3][0]zv[3][1]zv[3][2]

Wie kann man diese eindimensionalen Felder (farbig umrandeten Speicherbereiche) jeweils programmtechnisch "ansprechen" ?

0100 11zv[0][0]

0104 1201080112 14

1516171819202122

13

0116012001240128

0132013601400144

zv[0][1]zv[0][2]

zv[1][0]zv[1][1]zv[1][2]zv[2][0]zv[2][1]zv[2][2]zv[3][0]zv[3][1]zv[3][2]

zv[3]

zv[2]

zv[1]

zv[0]

Wie kann man diese eindimensionalen Felder

(farbig umrandeten Speicherbereiche) jeweils

programmtechnisch in Pointerschreibweise

"ansprechen" ?

0100 11zv[0][0]

0104 1201080112 14

1516171819202122

13

0116012001240128

0132013601400144

zv[0][1]zv[0][2]

zv[1][0]zv[1][1]zv[1][2]zv[2][0]zv[2][1]zv[2][2]zv[3][0]zv[3][1]zv[3][2]

*(zv+3)

*(zv+2)

*(zv+1)

*(zv+0)*zv

ist gleichbedeutend mit:

0100 11zv[0][0]

0104 1201080112 14

1516171819202122

13

0116012001240128

0132013601400144

zv[0][1]zv[0][2]

zv[1][0]zv[1][1]zv[1][2]zv[2][0]zv[2][1]zv[2][2]zv[3][0]zv[3][1]zv[3][2]

*(zv+3)

*(zv+2)

*(zv+1)

*(zv+0)

Der Inhalt von zv+0, zv+1, zv+2, zv+3, kurz zv+i ist jeweils ein Feld

Ein Feld ist aber durch die Adresse seines nullten Elements gekennzeichnet.

Also ist der Inhalt von zv+i, also *(zv+i) eine Adresse

0100 11zv[0][0]

0104 1201080112 14

1516171819202122

13

0116012001240128

0132013601400144

zv[0][1]zv[0][2]

zv[1][0]zv[1][1]zv[1][2]zv[2][0]zv[2][1]zv[2][2]zv[3][0]zv[3][1]zv[3][2]

*(zv+3

*(zv+2

*(zv+1

*(zv+0*3*4)

*3*4)

*3*4)

adressgenau ist also konkret:

*3*4)

= 0100

= 0112

= 0124

= 0136

0100 11zv[0][0]

0104 1201080112 14

1516171819202122

13

0116012001240128

0132013601400144

zv[0][1]zv[0][2]

zv[1][0]zv[1][1]zv[1][2]zv[2][0]zv[2][1]zv[2][2]zv[3][0]zv[3][1]zv[3][2]

*(zv+3

*(zv+2

*(zv+1

*(zv+0*3*4)

*3*4)

*3*4)

*3*4)

= 0100

= 0112

= 0124

= 0136

wie wird zv[1][2] in Pointerschreibweise adressgenau angesprochen ?

0100 11zv[0][0]

0104 1201080112 14

1516171819202122

13

0116012001240128

0132013601400144

zv[0][1]zv[0][2]

zv[1][0]zv[1][1]zv[1][2]zv[2][0]zv[2][1]zv[2][2]zv[3][0]zv[3][1]zv[3][2]

*(0112+2*4)

*(zv+1*3*4) +2*4)

programmtechnisch in Pointerschreibweise geschrieben:

*(*(zv+1)+2)

*(zv+1*3*4)

ersetze 0112 durch *(zv+1*3*4)

= 197

= 197*(

=197

0100 11zv[0][0]

0104 1201080112 14

1516171819202122

13

0116012001240128

0132013601400144

zv[0][1]zv[0][2]

zv[1][0]zv[1][1]zv[1][2]zv[2][0]zv[2][1]zv[2][2]zv[3][0]zv[3][1]zv[3][2]

*(0112+2*4)

*(zv+1*3*4) +2*4)

programmtechnisch nicht in Pointerschreibweise geschrieben:

*(*(zv+1)+2)

*(zv+1*3*4)

ersetze 0112 durch *(zv+1*3*4)

= 197

= 197*(

=197

0100 11zv[0][0]

0104 1201080112 14

1516171819202122

13

0116012001240128

0132013601400144

zv[0][1]zv[0][2]

zv[1][0]zv[1][1]zv[1][2]zv[2][0]zv[2][1]zv[2][2]zv[3][0]zv[3][1]zv[3][2]

*(0112+2*4)

*(zv+1*3*4) +2*4)

programmtechnisch nicht in Pointerschreibweise geschrieben:

zv[1][2]=197

*(zv+1*3*4)

ersetze 0112 durch *(zv+1*3*4)

= 197

= 197*(

Zurück zum Funktionsaufruf:

ffmf(&zv[0]);

ffmf(&zv[0]);

Auf was zeigt die Adresse von zv[0] ?(was ist der Inhalt von &zv[0])

Auf ein eindimensionales Feld der Länge 3

Wie muss also der formale Parameter in der Definition der Funktion ffmf deklariert

werden ?

int main(){ int zv[4][3]= {{11,12,13}, {14,15,16}, {17,18,19}, {20,21,22}} ffmf(&zv[0]);}

0100 11zv[0][0]

0104 1201080112 14

1516171819202122

13

0116012001240128

0132013601400144

zv[0][1]zv[0][2]

zv[1][0]zv[1][1]zv[1][2]zv[2][0]zv[2][1]zv[2][2]zv[3][0]zv[3][1]zv[3][2]

void ffmf( ){ //...später... }

int (*v)[3]

Dies ist ein POINTER auf ein Feld der Länge 3

int main(){ int zv[4][3]= {{11,12,13}, {14,15,16}, {17,18,19}, {20,21,22}} ffmf(&zv[0]);}

0100 11zv[0][0]

0104 1201080112 14

1516171819202122

13

0116012001240128

0132013601400144

zv[0][1]zv[0][2]

zv[1][0]zv[1][1]zv[1][2]zv[2][0]zv[2][1]zv[2][2]zv[3][0]zv[3][1]zv[3][2]

void ffmf( ){ }

int (*v)[3] *(*(v+1)+2)=197;

Die Funktion soll zv[1][2] auf 197 setzen. Wie muss dies also programmiert werden (in Pointerschreibweise)

Was geschieht genau beim Ablauf des Programms ?

Wie wird der Parameter an die aufzurufende Funktion

übergeben ?

int main(){ int zv[4][3]= {{11,12,13}, {14,15,16}, {17,18,19}, {20,21,22}} ffmf(&zv[0]);}

0100 11zv[0][0]

0104 1201080112 14

1516171819202122

13

0116012001240128

0132013601400144

zv[0][1]zv[0][2]

zv[1][0]zv[1][1]zv[1][2]zv[2][0]zv[2][1]zv[2][2]zv[3][0]zv[3][1]zv[3][2]

void ffmf( ){ }

int (*v)[3] *(*(v+1)+2)=197;

0100

int main(){ int zv[4][3]= {{11,12,13}, {14,15,16}, {17,18,19}, {20,21,22}} ffmf(&zv[0]);}

0100 11zv[0][0]

0104 1201080112 14

1516171819202122

13

0116012001240128

0132013601400144

zv[0][1]zv[0][2]

zv[1][0]zv[1][1]zv[1][2]zv[2][0]zv[2][1]zv[2][2]zv[3][0]zv[3][1]zv[3][2]

void ffmf( ){ }

int (*v)[3] *(*(v+1)+2)=197;

0100

int main(){ int zv[4][3]= {{11,12,13}, {14,15,16}, {17,18,19}, {20,21,22}} ffmf(&zv[0]);}

0100 11zv[0][0]

0104 1201080112 14

1516171819202122

13

0116012001240128

0132013601400144

zv[0][1]zv[0][2]

zv[1][0]zv[1][1]zv[1][2]zv[2][0]zv[2][1]zv[2][2]zv[3][0]zv[3][1]zv[3][2]

void ffmf( ){ }

int (*v)[3] *(*(v+1)+2)=197;

0100

int main(){ int zv[4][3]= {{11,12,13}, {14,15,16}, {17,18,19}, {20,21,22}} ffmf(&zv[0]);}

0100 11zv[0][0]

0104 1201080112 14

1516171819202122

13

0116012001240128

0132013601400144

zv[0][1]zv[0][2]

zv[1][0]zv[1][1]zv[1][2]zv[2][0]zv[2][1]zv[2][2]zv[3][0]zv[3][1]zv[3][2]

void ffmf( ){ }

int (*v)[3] *(*(v+1)+2)=197;

0100

int main(){ int zv[4][3]= {{11,12,13}, {14,15,16}, {17,18,19}, {20,21,22}} ffmf(&zv[0]);}

0100 11zv[0][0]

0104 1201080112 14

1516171819202122

13

0116012001240128

0132013601400144

zv[0][1]zv[0][2]

zv[1][0]zv[1][1]zv[1][2]zv[2][0]zv[2][1]zv[2][2]zv[3][0]zv[3][1]zv[3][2]

void ffmf( ){ }

int (*v)[3] *(*(v+1)+2)=197;

0100

int main(){ int zv[4][3]= {{11,12,13}, {14,15,16}, {17,18,19}, {20,21,22}} ffmf(&zv[0]);}

0100 11zv[0][0]

0104 1201080112 14

1516171819202122

13

0116012001240128

0132013601400144

zv[0][1]zv[0][2]

zv[1][0]zv[1][1]zv[1][2]zv[2][0]zv[2][1]zv[2][2]zv[3][0]zv[3][1]zv[3][2]

void ffmf( ){ }

int (*v)[3] *(*(v+1)+2)=197;

0100

int main(){ int zv[4][3]= {{11,12,13}, {14,15,16}, {17,18,19}, {20,21,22}} ffmf(&zv[0]);}

0100 11zv[0][0]

0104 1201080112 14

1516171819202122

13

0116012001240128

0132013601400144

zv[0][1]zv[0][2]

zv[1][0]zv[1][1]zv[1][2]zv[2][0]zv[2][1]zv[2][2]zv[3][0]zv[3][1]zv[3][2]

void ffmf( ){ }

int (*v)[3] *(*(v+1)+2)=197;

01000100

int main(){ int zv[4][3]= {{11,12,13}, {14,15,16}, {17,18,19}, {20,21,22}} ffmf(&zv[0]);}

0100 11zv[0][0]

0104 1201080112 14

1516171819202122

13

0116012001240128

0132013601400144

zv[0][1]zv[0][2]

zv[1][0]zv[1][1]zv[1][2]zv[2][0]zv[2][1]zv[2][2]zv[3][0]zv[3][1]zv[3][2]

void ffmf( ){ }

int (*v)[3] *(*(v+1)+2)=197;

*(*(0100+1*3*4)+2*4)=197

Zeigt auf ein Feld, also ist der Inhalt eine Adresse.

0112+2*4)*( =197

*0120=197

01000100

int main(){ int zv[4][3]= {{11,12,13}, {14,15,16}, {17,18,19}, {20,21,22}} ffmf(&zv[0]);}

0100 11zv[0][0]

0104 1201080112 14

15

171819202122

13

0116012001240128

0132013601400144

zv[0][1]zv[0][2]

zv[1][0]zv[1][1]zv[1][2]zv[2][0]zv[2][1]zv[2][2]zv[3][0]zv[3][1]zv[3][2]

void ffmf( ){ }

int (*v)[3] *(*(v+1)+2)=197;

*(*(0100+1*3*4)+2*4)=197

Zeigt auf ein Feld, also ist der Inhalt eine Adresse.

0112+2*4)*( =197

*0120=197

01000100

int main(){ int zv[4][3]= {{11,12,13}, {14,15,16}, {17,18,19} {20,21,22}} ffmf(&zv[0]);}

0100 11zv[0][0]

0104 1201080112 14

15197171819202122

13

0116012001240128

0132013601400144

zv[0][1]zv[0][2]

zv[1][0]zv[1][1]zv[1][2]zv[2][0]zv[2][1]zv[2][2]zv[3][0]zv[3][1]zv[3][2]

void ffmf( ){ }

int (*v)[3] *(*(v+1)+2)=197;

*(*(0100+1*3*4)+2*4)=197

Zeigt auf ein Feld, also ist der Inhalt eine Adresse.

0112+2*4)*( =197

*0120=197

01000100

Aufgabe:Erweitern Sie die Funktion ffmf

so, dass man nicht die 2.Spalte der 1.Zeile, sondern allgemein die s-te Spalte der z-ten Zeile von zv auf einen bestimmten Wert setzen

kann. Erzeugen Sie einen Aufruf in main.

void ffmf1(int (*v)[3], int z, int s, int wert){ *(*(v+z)+s)=wert; // oder genauso möglich: // v[z][s]=wert;}

void ffmf1(int (*v)[3], int z, int s, int wert);

int main(){ int zv[4][3] = {{11,12,13}, {14,15,16}, {17,18,19}, {20,21,22}}; ffmf1(&zv[0],1,2,197);}

Alternative Syntax

int main(){ int zv[4][3]= {{11,12,13}, {14,15,16}, {17,18,19}, {20,21,22}} ffmf(zv);}

Alternative Syntax des formalen Parameters (kann genauso verwendet werden) :

0100 11zv[0][0]

0104 1201080112 14

1516171819202122

13

0116012001240128

0132013601400144

zv[0][1]zv[0][2]

zv[1][0]zv[1][1]zv[1][2]zv[2][0]zv[2][1]zv[2][2]zv[3][0]zv[3][1]zv[3][2]

void ffmf( ){

}

int v[][3] *(*(v+1)+2)=197; // gleichbedeutend mit:

v[1][2]=197

2. Möglichkeit:

Funktionsaufruf mit Pointer als Parameter:

Die Adresse des Elements der 0. Spalte der 0. Zeile des zweidimensionalen Feldes wird an die Funktion übergeben.

Beispiel:

int main(){ int zv[4][3]= {{11,12,13},{14,15,16}, {17,18,19},{20,21,22}}; ffmp(&zv[0][0]);}Auf was zeigt die Adresse von zv[0][0] ?(was ist der Inhalt von &zv[0][0])

Auf eine integer Zahl

Wie muss also der formale Parameter

in der Definition der Funktion deklariert

werden ?

void ffmp( ){

}

int main(){ int zv[4][3]= {{11,12,13},{14,15,16}, {17,18,19},{20,21,22}}; ffmp(&zv[0][0]);}

int *p

Welches Element von zv wird also verändert

Diese Funktion ffmp soll mit Hilfe der Pointerschreibweise die 2. Spalte der 1. Zeile von zv auf 197 abändern.Wie wird das programmiert ?

Beachte: Nummerierung beginnt bei 0 !

Dies ist ein POINTER auf ein int

void ffmp( ){ *(p+5)=197;}

int main(){ int zv[4][3]= {{11,12,13},{14,15,16}, {17,18,19},{20,21,22}}; ffmp(&zv[0][0]);}

int *p

Was müsste man abändern, wenn nicht die 2.Spalte der 1.Zeile, sondern allgemein die s-te Spalte der z-ten Zeile von zv auf 197 gesetzt werden soll ?

16 ist das 5. Element im Feld zv. Dieses bekommt den neuen Wert 197

void ffmp( ){ *(p+z*3+s)=197;}

int main(){ int zv[4][3]= {{11,12,13},{14,15,16}, {17,18,19},{20,21,22}}; ffmp(&zv[0][0]);}

int *p

Warum 3 ?

Weil dies die Länge einer Spalte ist !!

Wer sollte den Wert von z und s festlegen ? Wo ist es also sinnvoll z und s zu deklarieren ?

Warum ist das Programm noch syntaktisch falsch ?

Weil z und s nicht deklariert sind !

void ffmp( ){ *(p+z*3+s)=197;}

int main(){ int zv[4][3]= {{11,12,13},{14,15,16}, {17,18,19},{20,21,22}}; ffmp(&zv[0][0]);}

int *p, int z, int s

Der Programmierer, der die Funktion ffmp nutzen will.Wo muss p, z und s deklariert werden ?

Warum ist der Aufruf syntaktsch falsch ?

Weil der Aufruf aus 3 Parametern bestehen muss.

Was geschieht genau beim Ablauf des Programms ?

Wie wird der Parameter an die aufzurufende Funktion

übergeben ?

int main(){ int zv[4][3]= {{11,12,13}, {14,15,16}, {17,18,19}, {20,21,22}} ffmp(&zv[0][0]);}

void ffmp(int *p){ *(p+1*3+2)=197;}

0100 11zv[0][0]

0104 1201080112 14

15

0100

16171819202122

13

0116012001240128

0132013601400144

zv[0][1]zv[0][2]

zv[1][0]zv[1][1]zv[1][2]zv[2][0]zv[2][1]zv[2][2]zv[3][0]zv[3][1]zv[3][2]

int main(){ int zv[4][3]= {{11,12,13}, {14,15,16}, {17,18,19}, {20,21,22}} ffmp(&zv[0][0]);}

void ffmp(int *p){ *(p+1*3+2)=197;}

0100 11zv[0][0]

0104 1201080112 14

1516171819202122

13

0116012001240128

0132013601400144

zv[0][1]zv[0][2]

zv[1][0]zv[1][1]zv[1][2]zv[2][0]zv[2][1]zv[2][2]zv[3][0]zv[3][1]zv[3][2]

0100

int main(){ int zv[4][3]= {{11,12,13}, {14,15,16}, {17,18,19}, {20,21,22}} ffmp(&zv[0][0]);}

void ffmp(int *p){ *(p+1*3+2)=197;}

0100 11zv[0][0]

0104 1201080112 14

1516171819202122

13

0116012001240128

0132013601400144

zv[0][1]zv[0][2]

zv[1][0]zv[1][1]zv[1][2]zv[2][0]zv[2][1]zv[2][2]zv[3][0]zv[3][1]zv[3][2]

0100

int main(){ int zv[4][3]= {{11,12,13}, {14,15,16}, {17,18,19}, {20,21,22}} ffmp(&zv[0][0]);}

void ffmp(int *p){ *(p+1*3+2)=197;}

0100 11zv[0][0]

0104 1201080112 14

1516171819202122

13

0116012001240128

0132013601400144

zv[0][1]zv[0][2]

zv[1][0]zv[1][1]zv[1][2]zv[2][0]zv[2][1]zv[2][2]zv[3][0]zv[3][1]zv[3][2]

0100

int main(){ int zv[4][3]= {{11,12,13}, {14,15,16}, {17,18,19}, {20,21,22}} ffmp(&zv[0][0]);}

void ffmp(int *p){ *(p+1*3+2)=197;}

0100 11zv[0][0]

0104 1201080112 14

1516171819202122

13

0116012001240128

0132013601400144

zv[0][1]zv[0][2]

zv[1][0]zv[1][1]zv[1][2]zv[2][0]zv[2][1]zv[2][2]zv[3][0]zv[3][1]zv[3][2]

0100

int main(){ int zv[4][3]= {{11,12,13}, {14,15,16}, {17,18,19}, {20,21,22}} ffmp(&zv[0][0]);}

void ffmp(int *p){ *(p+1*3+2)=197;}

0100 11zv[0][0]

0104 1201080112 14

15

010016171819202122

13

0116012001240128

0132013601400144

zv[0][1]zv[0][2]

zv[1][0]zv[1][1]zv[1][2]zv[2][0]zv[2][1]zv[2][2]zv[3][0]zv[3][1]zv[3][2]0100+1*3 *4+2 *4 =0120

0100

Weil ein Element von zv 4 Byte (integer) benötigt !

int main(){ int zv[4][3]= {{11,12,13}, {14,15,16}, {17,18,19}, {20,21,22}} ffmp(&zv[0][0]);}

void ffmp(int *p){ *(p+1*3+2)=197;}

0100 110104 1201080112 14

15

0100 171819202122

13

0116012001240128

01320136014001440100+1*3 *4+2 *4 =0120

0100

zv[0][0]zv[0][1]zv[0][2]

zv[1][0]zv[1][1]zv[1][2]zv[2][0]zv[2][1]zv[2][2]zv[3][0]zv[3][1]zv[3][2]

Weil ein Element von zv 4 Byte (integer) benötigt !

int main(){ int zv[4][3]= {{11,12,13}, {14,15,16}, {17,18,19}, {20,21,22}} ffmp(&zv[0][0]);}

void ffmp(int *p){ *(p+1*3+2)=197;}

0100 110104 1201080112 14

15

0100197171819202122

13

0116012001240128

01320136014001440100+1*3 *4+2 *4 =0120

0100

zv[0][0]zv[0][1]zv[0][2]

zv[1][0]zv[1][1]zv[1][2]zv[2][0]zv[2][1]zv[2][2]zv[3][0]zv[3][1]zv[3][2]

Weil ein Element von zv 4 Byte (integer) benötigt !

Aufgabe:Erweitern Sie die Funktion ffmp so, dass man ganz allgemein die s-te Spalte der z-ten Zeile eines

zweidimensionalen Feldes mit der Spaltenlänge slen auf einen

bestimmten Wert setzen kann. Erzeugen Sie einen Aufruf in

main.

int main(){ int zv[4][3]= {{11,12,13}, {14,15,16}, {17,18,19}, {20,21,22}} // Beispiel eines Aufrufs: ffmp(&zv[0][0], 1, 2, 3, 197);}

void ffmp(int *p, int z, int s, int slen, int wert){ *(p+z*slen+s)=wert;}