Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Arrays,Strings&Pointer in C/C++

Ähnliche Präsentationen


Präsentation zum Thema: "Arrays,Strings&Pointer in C/C++"—  Präsentation transkript:

1 Arrays,Strings&Pointer in C/C++
Vortrag Mathias Reich Am © M.d.R

2 Pointer Da zur Zeit der Compelierung des Programms nicht immer der Umfang der zu bearbeitenden Daten feststeht muss man sich - in manchen Programmen - die Möglichkeit offen halten zur Laufzeit des Programms beliebige Datenmengen einzulesen.Dies erreicht an durch sogenannte dynamische Speicherverwaltung. Eine Möglichkeit sie zu realisieren, ist die Verwendung sogenannten Zeigern oder Pointern. Was sind Pointer? Ein Pointer ist eine Zahl. Er beschreibt die genaue Adresse wo sich im Speicher ein gewisser Wert befindet. Er zeigt immer auf den ERSTEN Byte eines Typs. Ein Pointer enthält den Ort einer Variablen, aber nicht was sich hinter ihr verbirgt. Je nach System ist die Länge eines Pointers unterschiedlich. Pointer haben aber auch noch andere Vorteile: z.B. die Möglichkeit verkettete Listen oder binäre Bäume zu verwalten. © M.d.R

3 Pointer Allgemeine Deklaration: <typ> *<name>
typ ist der Datentyp auf den der Pointer zeigt. Mit dem (Rechen-) Operator “&“ wird die Adresse einer Variable berechnet. Mit dem (Referenz-) Operator “*“ erhält man die Variable auf die ein Pointer zeigt. Programmbeispiel.: int * i; /* Variable i ist ein Pointer auf einen Integerwert */ Zum Pointeroperator * existiert der inverser Gegenoperator &, d.h. *&variable = &*variable = variable © M.d.R

4 Programmbeispiel int main() {
int j = 1; /* erzeuge eine Variable j mit dem Wert 1*/ int *i; /* erzeuge einen Pointer den man i nennt */ /* und der auf einen Integerwert zeigt */ i = &j; /* i soll nun auf die Adresse von j zeigen */ /* Ein Ausdruck würde jetzt z.B. zeigen: j = 1; *i = 1; i = &i = Ändert man nun den Wert *i auf 2 */ *i = 2; /* bleiben die Pointeradressen gleich, aber es gilt *i = 2 und ebenfalls j = 2. */ } © M.d.R

5 Pointer als formale Parameter
Standardmäßig werden Parameter bei der Übergabe an Funktionen immer “by value“ übergeben, d.h. dass sie immer kopiert werden. Bei der Parameterübergabe mit Hilfe von Pointern ist dies nicht der Fall. Folgende Prozedur erwartet einen Pointer. Bekommt also nur die “Adresse“, an der der Wert steht. Beim Aufruf nur die Adresse des Parameters übergeben. Bsp.: void funkname(int *p) /* verwende den Wert der hinter der Adresse p steckt */ { *p = 1 /* setze den Wert auf 1 */ } int main{} int i funkname(&i); /* gebe die Adresse von i weiter */ © M.d.R

6 Dynamische Speicherverwaltung
Um während der Laufzeit des Programms den Speicher zu verwalten gibt es einige Funktionen. void * malloc(int Anzahl von Bytes) reserviert dementsprechend viele Bytes im Speicher void * calloc(int AnzahlElemente, int Elementlänge) reserviert Anzahl*Länge viele Bytes im Speicher !Beide Funktionen löschen den Reservierten Speicher (schreiben ihn mit Nullen voll)! void * realloc(void alteAdresse, int AnzahlElemente) vergrößert den Speicher auf neue Anzahl der Elemente; behält alte Informationen bei. free(void * Adresse) gibt den reservierten Speicher wieder frei. Sollte bei Aufruf einer Funktion im System zuwenig Speicher vorhanden sein, so wird der Wert NULL zurückgegeben. Bsp.: Erzeugung des Speichers für ein Feld mit n Integerwerten calloc(n,sizeof(int)); © M.d.R

7 Pointersprünge Mit den Operatoren + und – kann man zur nächsten Speicheradresse springen. Hierbei springt der Pointer jeweils um eine Längeneinheit des Elementtyps. D.h. am Ende eines Sprunges steht der Pointer wieder am Anfang eines neuen Elements. Bsp.: int i; int *p1 = &i; int *p2 = p1 ++; Nun würde p2 den Wert p2 = p1+sizeof(int) besitzen. © M.d.R

8 Strings – Zeichenketten
Ein großer Unterschied zwischen Java und C (bzw.C++) ist das Fehlen eines eigenen Typs für Strings. In C behilft man sich durch einen kleinem Trick. Man erzeugt ein Feld von mehreren einzelnen Zeichen. Da sich diese Strings keinesfalls an einheitliche Größen halten, ‘weiß‘ der Computer nicht, wann das Feld im Speicher endet. Um mit solchen Zeichenketten arbeiten zu können, brauchen sie ein allgemein gültiges Ende, welches vom Computer erkannt werden kann. Konvention : ‘\0‘ (=“Nullbyte“) Es muss somit das Ende jeder Zeichenkette mit diesem Zeichen gekennzeichnet werden. Die Zeichenkette muss also im Speicher immer ein Zeichen länger sein als die Anzahl der gewollten Zeichen. © M.d.R

9 Funktionsübersicht Funktionen zur Bearbeitung von Zeichenketten
Name Kurzbeschreibung Strcat() Verkettung von zwei Zeichenketten Strchr() erstes Vorkommen eines Zeichens in einer Zeichenkette Strrchr() letztes Vorkommen eines Zeichens in einer Zeichenkette Strcmp() Vergleich zweier Zeichenketten Strncmp() Vergleich bis zur Stelle n Strcpy() Zeichenkette kopieren Strncpy() kopieren bis zur Länge n Strdup() Zeichenkette duplizieren Strlen() Länge der Zeichenkette abfragen Strxfrm() Zeichenkette umwandeln Swab() Kopieren mit Vertauschen benachbarter Bytes ... Und noch einige Andere. © M.d.R

10 Arrays Felder sind ähnlich wie in Java. Es gibt jedoch signifikante Unterschiede: z.B. Felder “wissen nicht“, wie groß sie sind. (S.a. Strings) => Gefahr “falscher“ Indices (z.B. Überziehung eines Feldes) => Eigene Überwachung im Programm Es können echte mehrdimensionale Felder definiert werden, nicht nur Felder von Feldern. Allgemeine Deklaration <Typ des einzelnen Elementes> <Name> [dim 1][dim 2]...[dim n]; Programmbeispiel String char zeichenkette [11]; /* Achtung: ein Feld mehr als Anzahl der Buchstaben*/ zeichenkette=“Hallo Welt“; Des weiteren kann man natürlich jedes Element eines Feldes einzeln Aufrufen. Beispiel String zeichenkette[1] würde den Buchstaben “a“ ausgeben. Erinnerung: die Indizes von Feldern beginnen mit dem 0-ten Element und gehen bis dim-1 © M.d.R

11 Arrays Wie erwähnt sind die Indizes von Feldern kompliziert
Bsp. 2-dimensionales Feld: Im Speicher werden die Felder a und b float a[5][5], b[25] gleichbehandelt. a = Zeiger auf a[0][0] *a = a[0][0] Ebenso gilt: b = Zeiger auf b[0] *b = b[0] Wie schon erwähnt kann man mit Pointern auch springen. Springt man nun mit a = a+1; Bekommt man einen Zeiger auf a[1][0]. a = a+6; Wäre ein Verschiebung des Zeigers auf den Wert a[0][1]. ! Nicht abgesichert: Überschreitung des Feldes! Möglich: Unbemerkte Verwertung der dort vorhandenen Daten Zugriff auf durch andere Programme geschützte Daten © M.d.R

12 Programmbeispiele Vergleich Java C
Matrixmultiplikation in Java public double[] produkt(double[][]matrix, double[]vector,int m) { for (int i=0,i<m,i++) ergebnis[i]=0; for (int j=0,j<m,j++) ergebnis[i] += matrix[i][j] * vektor[j]; } return ergebnis; Fortsetzung: public void main() { int m=2; float [ ][ ] matrix = new float [m][m] float [ ] vektor = new float [m]; float [ ] ergebnis = new float [m]; ergebnis =produkt(matrix,vektor,m); for(int i=0,i<m,i++) System.out.println(ergebnis[i]); } © M.d.R

13 Programmbeispiele Vergleich Java C
Matrixmultiplikation in C float * produkt(int m, float *matrix, float *vektor); { int i,j; ergebnis = calloc(m,sizeof(float)); for (i=0;i<m;i++) ergebnis[i]=0; for (j=0,j<m,j++) ergebnis[i] += matrix[i*m+j]* vektor[j]; } return ergebnis; Fortsetzung: void main (); { float *matrix; float *vektor; float * ergebnis; int m=2; matrix=calloc(m*m,sizeof(float)); vektor=calloc(m,sizeof(float)); matrix={...}; /* Wertezuweisung */ vektor={...}; /* Wertezuweisung */ ergebnis = produkt(m,matrix,vektor) for(i=0,i<m,i++) printf(ergebnis[i],\n); } © M.d.R


Herunterladen ppt "Arrays,Strings&Pointer in C/C++"

Ähnliche Präsentationen


Google-Anzeigen