3 Übungsaufgabe

Werbung
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
Herunterladen