06.10.2013 Aufrufe

Eine Einführung in die Programmiersprache C und ... - C /C++ Ecke

Eine Einführung in die Programmiersprache C und ... - C /C++ Ecke

Eine Einführung in die Programmiersprache C und ... - C /C++ Ecke

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

<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 11.09.2008 13:04:00 Letzte Änderung am: 11. September 2008 Version 2.4, I. Oesch 58/147

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!