• Keine Ergebnisse gefunden

Funktionen und Zeiger

N/A
N/A
Protected

Academic year: 2022

Aktie "Funktionen und Zeiger"

Copied!
3
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Einf¨ uhrung in die Programmierung

Bachelor of Science

Prof. Dr. Rethmann

Fachbereich Elektrotechnik und Informatik Hochschule Niederrhein

WS 2009/10

Ubersicht ¨

Arrays

Datentypen, Operatoren und Kontrollstrukturen Funktionen und Zeiger

Zeichenketten

Dateioperationen und Standardbibliotheken strukturierte Programmierung

modulare Programmierung

Einf¨uhrung in die Programmierung Funktionen 2 / 21

Funktionen

Funktionen erledigen eine abgeschlossene Teilaufgabe.

Funktionen zerlegen Programme in kleinere Einheiten und erh¨ohen so die ¨Ubersichtlichkeit und die Wartbarkeit von Programmen!→strukturierte Programmierung

Oft gebrauchte Funktionen und Daten sind in Bibliotheken (Libraries) bereitgestellt: stdio,stdlib,string,math, ...

Bei gut entworfenen Funktionen reicht es zu wissenwasgetan wird, gleichg¨ultigwieeine Aufgabe gel¨ost wird.

Einf¨uhrung in die Programmierung Funktionen 3 / 21

Funktionen

Syntax:

Typ F u n k t i o n s n a m e ( P a r a m e t e r l i s t e ) { V e r e i n b a r u n g e n

A n w e i s u n g e n }

Beispiel:

int max (int a , int b ) { if ( a > b )

return a ; return b ; }

Eine Funktion kann mitreturneinen Wert zur¨uckgeben.

Einf¨uhrung in die Programmierung Funktionen 4 / 21

Funktionen

# include < stdio .h >

long int fakult (int n ) { int i ;

long int res = 1;

for ( i = 2; i <= n ; i ++) res *= i ;

return res ; }

void main (void) { int wert ;

printf ( " Wert ? " );

scanf ( " % d " , & wert );

printf ( " % d ! = % ld \ n " , wert , fakult ( wert ));

}

Einf¨uhrung in die Programmierung Funktionen 5 / 21

Funktionen

# include < stdio .h >

int summe (int n ) { int i , sum = 0;

for ( i = 1; i < n ; i ++) sum += i ;

return sum ; }

void main (void) { int wert = 42;

int erg ;

erg = summe ( wert );

printf ( " sum ( 1 + 2 + . . . + % d ) = % d \ n " , wert , erg );

}

Einf¨uhrung in die Programmierung Funktionen 6 / 21

Funktionen

# include < stdio .h >

int binom (int n , int k ) { if ( n == k || k == 0)

return 1;

return binom (n -1 , k -1) + binom (n -1 , k );

}

void main (void) { int a = 7;

int b = 3;

int erg ;

erg = binom (a , b );

printf ( " b i n K o e f f (% d ,% d ) = % d \ n " , a , b , erg );

}

Einf¨uhrung in die Programmierung Funktionen 7 / 21

Funktionen

G¨ultigkeitsbereich von Bezeichnern:

Parameternamen und lokal deklarierte Variablen sind nur innerhalb der Funktion bekannt und f¨ur andere Funktionen nicht sichtbar!

→ andere Funktionen k¨onnen dieselben Namen ohne Konflikte nutzen!

R¨uckgabewerte:

Eine Funktion muss keinen R¨uckgabewert liefern: Typvoid An der aufrufenden Stelle darf der R¨uckgabewert einer Funktion ignoriert werden.

Einf¨uhrung in die Programmierung Funktionen 8 / 21

(2)

Funktionen

Funktionen m¨ussen (wie Variablen) deklariert sein, bevor sie benutzt werden k¨onnen.

Funktionsdeklaration:

int square (int x );

Funktionsdefinition:

int square (int x ) { return x * x ; }

Funktionen der Standard-Bibliothek werden inDefinitionsdateien (header file) wiestdio.hundmath.hdeklariert.

Definitionsdateien werden mittels#include-Anweisung am Anfang einer Quelldatei bereitgestellt.

Einf¨uhrung in die Programmierung Funktionen 9 / 21

Anmerkungen

Rufen sich zwei Funktionen gegenseitig auf,m¨ussenzun¨achst Funktionsprototypen definiert werden:

int a (int y ); /* P r o t o t y p */

int b (int z ); /* P r o t o t y p */

int a (int x ) {

return b ( x - 1) * b ( x - 2);

}

int b (int x ) {

return ( x <= 0) ? x * 2 : a ( x - 10);

}

Parameternamen im Prototyp und im Funktionskopf m¨ussen nicht

¨

ubereinstimmen.

Einf¨uhrung in die Programmierung Funktionen 10 / 21

Anmerkungen

Compiler-Fehler, wenn Prototyp und Funktionskopf unterschiedliche R¨uckgabewerte oder Parameter haben.

Beispiel:

int sqr (int x );

...

float sqr (float x ) { return x * x ; }

Beispiel:

int fkt (int x , int y );

...

int fkt (int x ) { return x * x ; }

Aufruf einer Funktion, die vorher nicht deklariert wurde:

Als R¨uckgabetyp wirdintangenommen.

Es werden keine Annahmen ¨uber Parameter getroffen.

Compiler-Verhalten abh¨angig von der Implementierung.

Einf¨uhrung in die Programmierung Funktionen 11 / 21

Zeiger und Adressen

Ein Zeiger ist nichts anderes als eine Adresse im Hauptspeicher, an der ein Objekt steht.

Wof¨ur braucht man das?

Einf¨uhrung in die Programmierung Zeiger und Adressen 12 / 21

Zeiger und Adressen

Wof¨ur braucht man das?

Der Wert eines Funktionsparameters wird als Kopie an die Funktion ¨ubergeben.

Damit ist sichergestellt, dass die Funktion den Wert im aufrufenden Programmteil nicht zerst¨oren kann.

Aber wie kann dann eine Funktion einen Wert im aufrufenden Programmteil ¨andern? (bspw.scanf("%d", &n))

Einf¨uhrung in die Programmierung Zeiger und Adressen 13 / 21

Zeiger und Adressen

Wof¨ur braucht man das?

Wollen wir ein Array an eine Funktion ¨ubergeben, z.B. um die Werte zu sortieren, m¨usste das gesamte Array kopiert werden.

Damit das nicht passiert (kostet viel Zeit), wird der Funktion nur die Adresse ¨ubergeben, an der sich das Array befindet.

Einf¨uhrung in die Programmierung Zeiger und Adressen 14 / 21

Zeiger und Adressen

Wof¨ur braucht man das?

Oft ist zu dem Zeitpunkt, an dem ein Programm geschrieben wird, noch nicht klar, wieviele Daten zu verwalten sind: sollen 100 B¨ucher oder 1.000.000 B¨ucher gespeichert werden?

Da wir nicht auf Verdacht Platz f¨ur 1.000.000 B¨ucher reservieren wollen, kann w¨ahrend des Programmablaufs vom Betriebssystem zus¨atzlicher Speicherplatz bereitgestellt werden.

Um diesen bereitgestellten Speicherplatz im Programm auch nutzen zu k¨onnen, teilt uns das Betriebssystem die Adresse der ersten reservierten Speicherstelle mit.

Einf¨uhrung in die Programmierung Zeiger und Adressen 15 / 21

Zeiger und Adressen

F¨ur jeden TypT kann man einenZeiger auf T erzeugen. Der Wert eines Zeigertyps ist die Adresse eines Objekts.

Spezieller Wert:der leere Zeiger (NULL-Zeiger) entspricht der Konstante 0. Programme sind besser lesbar, wenn die logische KonstanteNULLverwendet wird.

Vereinfachtes Bild der Speicherorganization:

i+1

... ...

i+3 i+4 i+5 i+2

i

Speicherzellen sind fortlaufend nummeriert und adressierbar, sie k¨onnen einzeln oder in zusammenh¨angenden Gruppen bearbeitet werden.

Einf¨uhrung in die Programmierung Zeiger und Adressen 16 / 21

(3)

Zeiger und Adressen

DerAdressoperator&liefert die Adresse eines Objekts.

DerInhaltsoperator*liefert das Objekt, das unter einer Adresse abgelegt ist.

Beispiel:

int i , j ; /* Integer - Wert */

int * p ; /* Zeiger auf Integer - Wert */

p = & i ; /* p := Adresse von i */

/* also : p zeigt auf i */

* p = 5; /* Inhalt von p := 5 */

j = * p ; /* j := Inhalt der Adresse p */

p i

... ... ...

Einf¨uhrung in die Programmierung Zeiger und Adressen 17 / 21

Parameter¨ ubergabe

Alle Parameter werden als Wert ¨ubergeben (call by value).

Innerhalb der Funktionen werden private Kopien der ¨ubergebenen Parameter angelegt, die w¨ahrend der Ausf¨uhrung benutzt werden.

Beispiel:

void swap (int a , int b ) { int t = a ;

a = b ; b = t ; }

...

swap (x , y );

x y

10 20

a b t

10 20

x y

10 20

a b t

10 20

10 swap

main

Einf¨uhrung in die Programmierung Zeiger und Adressen 18 / 21

Parameter¨ ubergabe

swapkann die Werte beim Aufrufer nicht beeinflussen, da nur Werte (Kopien) ¨ubergeben werden.

L¨osung:Der Aufrufer muss Zeiger auf die Werte, die ge¨andert werden sollen, ¨ubergeben (call by reference).

Beispiel:

void swap (int *a , int * b ) {

int t = * a ;

* a = * b ;

* b = t ; }

...

swap (& x , & y );

x y

10 20

x

y 10

20

a b t

a b

t 10

swap main

Einf¨uhrung in die Programmierung Zeiger und Adressen 19 / 21

Zeiger und Adressen

Die Syntax der Variablenvereinbarungint *pimitiert die Syntax von Ausdr¨ucken, in denen die Variable auftreten kann:

Der Ausdruck*pist einint-Wert.

Daraus folgt:

Ein Zeiger darf nur auf eine Art von Objekt zeigen.

Jeder Zeiger zeigt auf einen festgelegten Datentyp.

Ausnahme:EinZeiger aufvoid

nimmt einen Zeiger beliebigen Typs auf,

darf aber nicht selbst zum Zugriff verwendet werden.

Einf¨uhrung in die Programmierung Zeiger und Adressen 20 / 21

Zeiger und Adressen

void * v ; int i = 1;

double d = 2.0;

v = & i ; /* v zeigt auf i */

*(int *) v += 1; /* cast n o t w e n d i g ! */

/* also : i += 1 */

printf ( " %d , % d \ n " , i , *(int *) v );

v = & d ; /* v zeigt auf d */

*(double *) v += 1.0; /* cast n o t w e n d i g ! */

/* also : d += 1 */

printf ( " %f , % f \ n " , d , *(double *) v );

Einf¨uhrung in die Programmierung Zeiger und Adressen 21 / 21

Referenzen

ÄHNLICHE DOKUMENTE

Die Postzahlen der Eintragungen in die neue Einlage haben sich ohne Unterbrechun g an die letzte _Postzahl der alten Einlage anzuschließen. Die neue Einlage ist

vermessen den Teil einer Parzelle, auf e i n e n u nausgeschi cdenen Teil des ganzen Gru ndbuchskörpers verfaßt werden.. das Ergebnis

Des connaissances de base en calcul des probabilit´es, calcul diff´erentiel et int´egral et alg`ebre lin´eaire sont suffisantes pour profiter de la plus grande partie de

In dem von Robert Bradley und Edward Sandifer herausgegebenen Buch Leonhard Euler: Life, Work and Legacy analysieren 24 Autoren Eulers Leben und Werk.. Die tiefsch¨urfenden Artikel

Die wissenschaftlichen Verdienste von Schur k¨onnen kaum hoch genug eingesch¨atzt werden: Hermann Weyl (1885–1955) st¨utzte sich in seinem – nota bene Schur gewidmeten – Buch

La deuxi`eme partie de l’ouvrage (cryptographie asym´etrique) aborde essentiellement l’algorithme RSA et le probl`eme du logarithme discret, mais pr´esente aussi d’autres syst`emes

Die folgenden Disziplinen werden angegangen: Meteorologie, Optik (Kapitel 4 bis 6), Dynamik von Fl¨ussigkeiten, Wellen (Ka- pitel 7 bis 9), Beispiele aus der Pflanzenwelt und

Eindr¨ucklich wird dies etwa dargestellt bei der Frage, was die richtige Verallgemeinerung der ganzen Zahlen Z in Q in einem beliebigen Zahlk¨orper anstelle von Q ist, wie sich