4 in 1 - Medieninformatik - Hochschule RheinMain
4 in 1 - Medieninformatik - Hochschule RheinMain
4 in 1 - Medieninformatik - Hochschule RheinMain
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
Programmieren <strong>in</strong> C<br />
Funktionsparameter<br />
Programmieren <strong>in</strong> C<br />
Strukturen<br />
Funktionsparameter<br />
Strukturen – struct<br />
Grundtypen<br />
• In Java Werte<br />
Änderbare Parameter durch<br />
Verpacken <strong>in</strong> Objekte<br />
• In C Werte<br />
Änderbare Parameter durch<br />
Adressoperator (“call by reference”)<br />
• Idiom für z.B. scanf<br />
Felder<br />
• In Java als Referenz übergeben<br />
Werte <strong>in</strong> Feld ändern möglich<br />
Zuweisung heißt Referenz kopieren<br />
• In C Parameter als Zeiger übergeben<br />
Werte <strong>in</strong> Feld können geändert<br />
werden<br />
Zuweisung an Feld nicht möglich<br />
1 void f1(<strong>in</strong>t *pi) { *pi = 17; }<br />
2 void g1(<strong>in</strong>t a[]) {<br />
3 <strong>in</strong>t c[3] = {1,2,3};<br />
4 a = c; /* erlaubt */ }<br />
5 void g2(<strong>in</strong>t *a) {<br />
6 <strong>in</strong>t c[3] = {1,2,3}; a = c; }<br />
7 void g3(<strong>in</strong>t *a) { a[0] = 17; }<br />
1 <strong>in</strong>t i=2;<br />
2 <strong>in</strong>t a[3] = {2,3,5};<br />
3 <strong>in</strong>t b[3] = {2,3,5};<br />
4 /* b = a; nicht erlaubt */<br />
5 f1(&i);<br />
6 /* i == 17 */<br />
7 g3(a);<br />
8 /* a[0] == 17 */<br />
9 scanf("%d", &i);<br />
10 /* i == */<br />
Wie Java-Klasse ohne Methoden<br />
• Alle Komponenten public<br />
Def<strong>in</strong>ition mit struct<br />
• Variablendef<strong>in</strong>ition bei<br />
struct-Deklaration möglich<br />
• Spätere Variablendef<strong>in</strong>ition möglich,<br />
immer mit Schlüsselwort struct<br />
• Initialisierung <strong>in</strong> Reihenfolge der<br />
Deklaration möglich<br />
• Größe implementierungsabhängig<br />
Zugriff auf Komponenten mit .-Operator<br />
Zuweisung ist Kopie<br />
44<br />
• NICHT wie <strong>in</strong> Java<br />
1234 Susi S<strong>in</strong>nlos<br />
4711 Willi Wahns<strong>in</strong>n<br />
1 struct person {<br />
2 char name[40];<br />
3 unsigned <strong>in</strong>t id;<br />
4 } susi;<br />
5<br />
6 struct person rudi;<br />
7 struct person willi = {<br />
8 "Willi Wahns<strong>in</strong>n",<br />
9 4711<br />
10 };<br />
1 strcpy (susi.name, "Susi S<strong>in</strong>nlos");<br />
2 susi.id = 1234;<br />
3 rudi = willi;<br />
4 willi.id = 123456;<br />
5 willi.name[0] = ’X’;<br />
6 pr<strong>in</strong>tf("%6d %s\n", susi.id, susi.name);<br />
7 pr<strong>in</strong>tf("%6d %s\n", rudi.id, rudi.name);<br />
8 pr<strong>in</strong>tf("%ld\n", sizeof (struct person));<br />
Prof. Dr. Peter Barth (HS-Rhe<strong>in</strong>Ma<strong>in</strong>) Programmieren 3 29. Januar 2013 85 / 326<br />
Prof. Dr. Peter Barth (HS-Rhe<strong>in</strong>Ma<strong>in</strong>) Programmieren 3 29. Januar 2013 86 / 326<br />
Programmieren <strong>in</strong> C<br />
Strukturen<br />
Programmieren <strong>in</strong> C<br />
Strukturen<br />
Strukturen – Speicherlayout<br />
Speicherlayout<br />
• Compiler entscheidet<br />
• Ke<strong>in</strong>e Annahmen treffen<br />
Beispiel<br />
• F<strong>in</strong>det heraus wo was liegt<br />
• Code nicht gut/portabel<br />
0<br />
4<br />
8<br />
12<br />
16<br />
a 0x44ac2d20<br />
b<br />
c d<br />
d<br />
e<br />
Füll-Bytes<br />
1 struct p1 {<br />
2 short a;<br />
3 <strong>in</strong>t b;<br />
4 char c[3];<br />
5 char d[4];<br />
6 <strong>in</strong>t e;<br />
7 };<br />
1 struct p1 p;<br />
2 char *base = (char *) &p;<br />
3 pr<strong>in</strong>tf("== p:%p ==\n", base);<br />
4 pr<strong>in</strong>tf("a:%2ld b:%2ld c:%2ld d:%2ld e:%2ld\n",<br />
lp a b c<br />
5 ((char *) &p.a)-base, ((char *) &p.b)-base,<br />
0x.. 2 0x.. 1 0x.. 0 0x..<br />
6 ((char *) &p.c)-base, ((char *) &p.d)-base,<br />
7 ((char *) &p.e)-base);<br />
== p:0x44ac2d20 ==<br />
a: 0 b: 4 c: 8 d:11 e:16<br />
Strukturen und Zeiger<br />
Zugriff mit -><br />
• pp->id ist Kurzform für (*pp).id<br />
• Erlaubt e<strong>in</strong>fachen Zugriff auf<br />
Komponenten e<strong>in</strong>er Struktur<br />
• Beispiel: 987654 Rudi Ratlos<br />
Bequem bei Zeigerketten<br />
• Beispiel: 0<br />
1 void change(struct person *pp) {<br />
2 strcpy(pp->name, "Rudi Ratlos");<br />
3 pp->id = 987654;<br />
4 }<br />
1 struct person *pp = &rudi;<br />
2 change(pp);<br />
3 pr<strong>in</strong>tf("%6d %s\n", pp->id, pp->name);<br />
1 struct node {<br />
2 <strong>in</strong>t data;<br />
3 struct node *next;<br />
4 };<br />
1 struct node c = {0, NULL};<br />
2 struct node b = {1, &c};<br />
3 struct node a = {2, &b};<br />
4 struct node *lp = &a;<br />
5 pr<strong>in</strong>tf("%d\n", lp->next->next->data);<br />
Prof. Dr. Peter Barth (HS-Rhe<strong>in</strong>Ma<strong>in</strong>) Programmieren 3 29. Januar 2013 87 / 326<br />
Prof. Dr. Peter Barth (HS-Rhe<strong>in</strong>Ma<strong>in</strong>) Programmieren 3 29. Januar 2013 88 / 326