Eine Einführung in die Programmiersprache C und die Grundlagen ...
Eine Einführung in die Programmiersprache C und die Grundlagen ...
Eine Einführung in die Programmiersprache C und die Grundlagen ...
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
<strong>E<strong>in</strong>e</strong> <strong>E<strong>in</strong>führung</strong> <strong>in</strong> <strong>die</strong> Informatik <strong>und</strong> <strong>die</strong> <strong>Programmiersprache</strong> C<br />
Achtung, wenn nicht <strong>in</strong>itialisierte Zeiger verwendet werden, verhält sich e<strong>in</strong> Programm unvorhersehbar,<br />
im günstigsten Fall stürzt es ab, sonst werden irgendwo zufällig Variablen verändert. Bevor<br />
e<strong>in</strong> Zeiger benutzt wird, muss ihm immer e<strong>in</strong>e gültige Adresse zugewiesen werden. Zeiger <strong>die</strong> nirgendwoh<strong>in</strong><br />
zeigen, sollte man den Wert NULL zuweisen (NULL ist e<strong>in</strong>e <strong>in</strong> stdio.h vordef<strong>in</strong>ierte<br />
Konstante). Vor der Benutzung e<strong>in</strong>es Zeigers sollte man ihn entsprechend sicherheitshalber auf den<br />
Wert NULL testen, <strong>und</strong> im Falle von NULL nicht verwenden <strong>und</strong> ev. e<strong>in</strong>e Fehlermeldung ausgeben.<br />
Achtung, auf e<strong>in</strong>fache Literale kann der Adressoperator nicht angewendet werden.<br />
<strong>in</strong>t* p1 = &5; /* Nicht erlaubt, 5 hat ke<strong>in</strong>e Adresse */<br />
Achtung, bei der Deklaration/Def<strong>in</strong>iton von Po<strong>in</strong>ter gehört der * zum Po<strong>in</strong>ter, nicht zum Datentyp!<br />
<strong>in</strong>t* p1, p2, p3; /* Def<strong>in</strong>iert nicht 3 Po<strong>in</strong>ter, sondern 1 Po<strong>in</strong>ter p1, sowie<br />
2 <strong>in</strong>t Variablen p2 <strong>und</strong> p3 */<br />
<strong>in</strong>t *p1, *p2, *p3; /* Def<strong>in</strong>iert 3 Po<strong>in</strong>ter */<br />
Achtung, Po<strong>in</strong>tervariablen können e<strong>in</strong>ander nur zugewiesen werden, wenn sie vom selben Typ<br />
s<strong>in</strong>d, also auf denselben Typ zeigen. Ausgenommen davon s<strong>in</strong>d void-Po<strong>in</strong>ter, <strong>die</strong>se können an alle<br />
anderen Zeiger zugewiesen, <strong>und</strong> von allen Zeigern zugewiesen werden).<br />
<strong>in</strong>t i = 3;<br />
float f = 3.14;<br />
<strong>in</strong>t *ip1, *ip2 = &i;<br />
float *fp1, *fp2 = &f;<br />
void *Universalpo<strong>in</strong>ter;<br />
ip1 = ip2; /* OK */<br />
fp1 = fp2; /* OK */<br />
fp1 = ip2; /* Error, benoetigt cast : fp1 = (float *)ip2; */<br />
/* Via void-po<strong>in</strong>ter geht’s auch: */<br />
Universalpo<strong>in</strong>ter = ip1; /* <strong>in</strong>t-Po<strong>in</strong>ter an void Po<strong>in</strong>ter, ke<strong>in</strong> Problem */<br />
fp1 = Universalpo<strong>in</strong>ter; /* void Po<strong>in</strong>ter an float-Po<strong>in</strong>ter, ke<strong>in</strong> Problem */<br />
17.1 Call By Reference<br />
Mit Po<strong>in</strong>ter ist nun auch Call by Reference möglich, d.h. Funktionen können <strong>die</strong> übergebenen Argumente<br />
verändern, sie erhalten nicht nur Kopien. Dazu müssen e<strong>in</strong>fach <strong>die</strong> Adressen der Argumente<br />
anstelle der Argumente selbst übergeben werden. (Und weil Arraynamen eigentlich auch<br />
Zeiger s<strong>in</strong>d, werden Arrays gr<strong>und</strong>sätzlich immer by Reference übergeben)<br />
void Modify(<strong>in</strong>t *p, <strong>in</strong>t c)<br />
{<br />
c += 2;<br />
*p = *p + c; /* Veraendert Wert, auf den p zeigt */<br />
}<br />
<strong>in</strong>t ma<strong>in</strong>(<strong>in</strong>t agrc, char *argv[])<br />
{<br />
<strong>in</strong>t x = 3;<br />
<strong>in</strong>t y = 7;<br />
pr<strong>in</strong>tf(" x=%d, y=%d\n", x, y);<br />
Modify(&x, y); /* x wird veraendert, y nicht */<br />
pr<strong>in</strong>tf(" x=%d, y=%d\n", x, y);<br />
Modify(&y, 5); /* y wird veraendert */<br />
pr<strong>in</strong>tf(" x=%d, y=%d\n", x, y);<br />
return 0;<br />
}<br />
Gedruckt am 10.09.2009 14:23:00 Letzte Änderung am: 10. September 2009 Version 2.4.1, I. Oesch 58/147