FAKULTÄT FÜR TECHNIK STUDIENGÄNGE ELEKTROTECHNIK / INFORMATIONSTECHNIK UND TECHNISCHE INFORMATIK Informatik I Übung 5 Funktionen Pointer Inhaltsverzeichnis 1 2 Pointer ..................................................................................................................... 3 1.1 Pointer und ihre Datentypen .............................................................................. 3 1.2 Die Funktion malloc und free ............................................................................. 3 1.3 Die Konstante NULL........................................................................................... 4 Array ........................................................................................................................ 5 2.1 3 Eindimensionales Array...................................................................................... 5 2.1.1 Zugriff auf den Inhalt von Arrayelementen.................................................. 5 2.1.2 Pointer und Arrays...................................................................................... 5 2.1.3 Mehrdimensionale Arrays ........................................................................... 6 2.1.4 Arrays als Parameter ................................................................................... 6 Übungsaufgabe : Matrizenprodukt ........................................................................... 8 Übung 5 Seite 2 von 8 1 Pointer Was man unter einen Pointer versteht, soll folgendes Beispiel verdeutlichen. Wenn man Verpackungen betrachtet, so steht dort oft • • mindestens haltbar bis: Datum mindestens haltbar bis: siehe Deckel im ersten Fall steht an der bezeichneten Stelle der Wert, während im zweiten Fall ein Verweis auf eine andere Stelle steht, wo der Wert zu finden ist. 1.1 Pointer und ihre Datentypen Wie der Namen schon sagt verweisen Zeiger auf irgendwelche Datentypen. Der Datentyp muss bei der Deklaration des Zeigers bereits festgelegt werden. Dies geschieht folgendermaßen: Syntax datentyp *name_der_zeigervariablen; Beispiel: int *piA, *piB; Mit dem Adressoperator & bekommt man die Adresse auf das Objekt, auf welches der Pointer zeigt. Beispiel: int *piA; int iX=13; piA=&iX; printf("%d", iX); printf("%d", piA); printf("%d",*piA); 1.2 // Ausgabe: 13 // Ausgabe:=xa004->Adresse von iX // Ausgabe: 13 Die Funktion malloc und free Wenn eine Zeigervariable vereinbart wird ist ihr Wert zunächst noch nicht definiert, d.h. sie zeigt irgendwohin. Bevor ein sinnvolles Arbeiten möglich ist, muss erreicht werden, dass der Pointer auf eine Speicherstelle zeigt, die noch frei ist und ein Objekt vom vereinbarten Typ aufnehmen kann. Dies erreicht man durch die Funktion malloc. Syntax malloc(Anzahl); Parameter Anzahl: Anzahl des Datentyps als Integerzahl Anwendungsregel Übung 5 Seite 3 von 8 Die Funktion malloc reserviert einen Speicherbereich, der groß genug ist, um den Datentyp aufzunehmen. Die Größe eines Datentyps in Bytes lässt sich durch die sizeof-Funktion feststellen: malloc(sizeof(Datentyp)); Zurückgegebener Wert: Integerzahl Zeiger auf reservierten Speicherplatz 0 Der Speicherplatz konnte nicht reserviert werden Die free-Funktion gibt einen zuvor durch malloc reservierten Speicherplatz wieder frei. 1.3 Die Konstante NULL In den meisten Anwendungsfällen ist es wichtig, einem Zeiger einen definierten Wert mit der Bedeutung "zeigt zu keinem Objekt" geben zu können. Dieser Wert ist die vordefinierte Konstante NULL, die jedem Pointer unabhängig vom Typ zugewiesen werden kann. Beispiel für Zuweisung: char *a,*b; a=NULL; a NULL b NULL b=NULL; a=malloc(sizeof(char)); b=malloc(sizeof(char)); *a='e'; *b='r'; a b a e b r a r b r a r b r *a=*b; a=b; Übung 5 Seite 4 von 8 2 Array Ein Array ist eine Variable, die aus einer Anzahl von Datenelementen gleichen Typs besteht, die unmittelbar hintereinander im Speicher liegen. 2.1 Eindimensionales Array Ein eindimensionales Array besteht aus Elementen, die nicht wieder Arrays sind. Ein Array vom Typ int kann man sich folgendermaßen vorstellen: 2.1.1 Zugriff auf den Inhalt von Arrayelementen Arrayelemente sind Variablen. Mit ihnen kann man die gleichen Operationen durchführen, wie mit einer herkömmlichen Variablen des betreffenden Datentyps. Will man z.B. dem 3. Element des Arrays i den Wert 7 zuweisen, so kann dies mit der Anweisung i[2]=7; geschehen. Analog erhielt danach das erste Element mit i[0]=i[2]-4; den Wert 3. 2.1.2 Pointer und Arrays Man kann auf die Elemente eines Arrays nicht nur über den Arraynamen mit dem entsprechenden Index zugreifen, sondern auch über einen Zeiger. Gegeben sei dazu die Variable int aiX[10]; int piX; Man erhält mit &aiX[0] Übung 5 Seite 5 von 8 die Adresse des ersten Elements von an_x, also die Anfangsadresse des Arrays. Die Anfangsadresse eines Arrays erhält man in C und C++ aber nicht nur, wenn man den Namen des ersten Elements den Adressoperator & voranstellt. Sondern auch der Arrayname selbst ist stets gleichbedeutend mit der Adresse des ersten Arrayelements. Also sind die Ausdrücke &aiX[0] und aiX äquivalent, d.h., man kann die Anweisung piX=&aiX[0]; //piX enthält die Anfangsadresse des Arrays durch piX=aiX; //piX enthält die Anfangsadresse des Arrays ersetzen. 2.2 Mehrdimensionale Arrays Die Definition mehrdimensionaler Arrays erfolgt analog der Definition eindimensionaler Arrays. Der Unterschied besteht darin, dass man statt einer mehrere Dimensionen anzugeben hat. Syntax arrayname[index 1][index 2]....[index n] Beispiel: int aiK[3] [4]; an_k[0][0] an_k[1][0] an_k[2][0] 2.3 an_k[0][1] an_k[1][1] an_k[2][1] an_k[0][2] an_k[1][2] an_k[2][2] an_k[0][3] an_k[1][3] an_k[2][3] Arrays als Parameter Häufig ist es erforderlich, nicht nur ein Wert eines Datenobjektes an eine Unterfunktion zu übergeben, sondern die Werte einer ganzen Reihe. Man hat in der Sprache C und C++ wiederum 2 Möglichkeiten das Array zu übergeben. Man kann der Unterfunktion einmal das Array übergeben oder man übergibt nur den Zeiger auf das erste Element. Die zwei nachfolgenden Beispiele zeigen die zwei Möglichkeiten anhand des Bubble-SortAlgorithmus auf. Übung 5 Seite 6 von 8 Beispiel 1: Übergabe des Arrays mit n-vielen Elementen void bsort_1(int anfeld[6]) { int ni,nk; for(ni=5;ni!=0;ni--) for(nk=0;nk<ni;nk++) if(anfeld[nk]>anfeld[nk+1]) swap(&anfeld[nk],&anfeld[nk+1]); for(ni=0;ni<=5;ni++) printf("%d\n",anfeld[ni]); } Beispiel.2: Übergabe eines Zeigers auf das erste Arrayelememt void bsort_2(int *anfeld) { int ni,nk; for(ni=5;ni!=0;ni--) { for(nk=0;nk<ni;nk++) { if(*(anfeld+nk)>*(anfeld+nk+1)) { swap(anfeld+nk,anfeld+nk+1); } } } for(ni=0;ni<=5;ni++) { printf("%d\n",anfeld[ni]); } } void swap(int *nx,int *ny) { int buffer; buffer=*nx; *nx=*ny; *ny=buffer; } Übung 5 Seite 7 von 8 3 Übungsaufgabe : Matrizenprodukt Schreiben Sie ein Programm welches das Matrizenprodukt von zwei Matrizen vom Typ A(3,3) und B(3,3) berechnet und ausgibt. Definition: mit Der erste Index im Skalarprodukt cik kennzeichnet dabei den Zeilenvektor von A, der zweite Index den Spaltenvektor von B, die an der Skalarproduktbildung beteiligt sind. So ist z.B. c21 das skalare Produkt aus dem 2.Zeilenvektor von A und dem 1.Spaltenvektor von B. Die Berechnung der Matrix C soll in einer Unterfunktion erfolgen die als Übergabeparameter die zwei Matrizen A und B besitzt. Die Funktion wird im main()Programm aufgerufen. Es dürfen keine globalen Variablen deklariert werden. Übung 5 Seite 8 von 8