Arrays,Strings&Pointer in C/C++

Slides:



Advertisements
Ähnliche Präsentationen
Einführung in die Programmiersprache C/C++
Advertisements

Imperative Programmierung
Imperative Programmierung
der Universität Oldenburg
Forschungszentrum caesar
Zusammenfassung der Vorwoche
(kleine!) Java Einführung Mittwoch, Heute Ziel: erstes Java-Programm erstellen Von der Aufgabenstellung bis zur Lösung Grundlagen Einfache.
der Universität Oldenburg
der Universität Oldenburg
Java: Objektorientierte Programmierung
Java: Dynamische Datentypen
Indirekte Adressierung
FH-Hof Indirekte Adressierung Richard Göbel. FH-Hof Einfache Speicherung von Daten Eine "einfache" Deklaration definiert direkt eine Speicherplatz für.
FH-Hof Verwaltung von Zeichenketten Richard Göbel.
Java: Grundlagen der Sprache
Java: Referenzen und Zeichenketten
Strukturen. In einer Struktur kann eine beliebige Anzahl von Komponenten (Daten) mit unterschiedlichen Datentypen (im Gegensatz zu Feldern) zusammengefaßt.
Dynamischer Speicher. Ein Vergleich aus dem täglichen Leben...
Dynamisches Array als "verkettete Liste". Ein Vergleich.
Dynamischer Speicher und Struktur
Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen...
Parameterübergabe von zweidimensionalen Feldern in Funktionen.
Polymorphie (Vielgestaltigkeit)
Polymorphie (Vielgestaltigkeit)
Objekte und Arbeitsspeicher
Dynamischer Speicher. In einer Funktion wird z.B. mit der Deklaration int i; Speicher auf dem sogenannten Stack reserviert. Wenn die Funktion verlassen.
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 7 Claudio Moraga, Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 5 Claudio Moraga; Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
Java-Kurs - 2. Übung Entwicklungsumgebung Struktur von Programmen
PKJ 2005/1 Stefan Dissmann Ausblick Es fehlen noch: Möglichkeiten zum Strukturieren größerer Programme Umgang mit variabler Zahl von Elementen Umgang mit.
PKJ 2005/1 Stefan Dissmann Rückblick auf 2005 Was zuletzt in 2005 vorgestellt wurde: Klassen mit Attributen, Methoden und Konstruktoren Referenzen auf.
Verkettete Liste Visualisierung. New-Operator Mit dem New-Operator kann zur Laufzeit (dynamisch) Speicherplatz reserviert und angelegt werden Vorteil:
EDV1 - 06FelderPointer Felder, Zeichenketten, Pointer.
DVG Felder1 Felder. DVG Felder 2 Was sind Felder? Felder sind Reihungen aus endlich vielen Elementen gleichen Typs. Z.B.: Vektoren : (x.
Wir müssen also überlegen: Implementierung der Knoten, Implementierung der Kanten, daraus: Implementierung des Graphen insgesamt. Annahme: die Knoteninhalte.
Java programmieren mit JavaKara
Programmieren in C Zeichen-/Stringfunktionen Dynamischer Speicher
Einführung in die Programmiersprache C 3.Tag Institut für Mathematische Optimierung - Technische Universität Braunschweig.
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
Einführung in die Programmiersprache C 4
Informatik 1 Letzte Übung.
Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 1 Algorithmen und Datenstrukturen SS 2005 Mag.Th. Hilpold u. Dr. A.Stritzinger Institut.
Dynamische Datentypen
Variablenkonzept Klassisch, in Java Basistyp
Einfach und doppelt verkettete Listen in JAVA by Jens Weibler
CuP - Java Vierte Vorlesung Entspricht ungefähr Kapitel 2.1 des Skriptums Montag, 14. Oktober 2002.
Programmieren in C Grundlagen C 2
Programmiervorkurs WS 2014 Referenzdatentypen
CuP - Java Achte Vorlesung Entspricht ungefähr Kapitel 4.1 des Skriptums Montag, 28. Oktober 2002.
Java-Kurs - 3. Übung Hausaufgabe Arrays For-Schleifen.
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.
Delphi Chars und Strings
Funktionen. Aufgabe : Eingabe zweier Zahlen ---> Minimum bestimmen Dann nochmals Eingabe zweier Zahlen ---> Minimum bestimmen.
Pointer. Grundsätzliches: Im Arbeitsspeicher werden Daten gespeichert. Um auf die Daten eindeutig zugreifen zu können, werden diesen Daten Adressen zugeordnet.
Funktionen, Felder und Parameter- übergabe. Funktionsaufruf mit Feld als Parameter: Parameter = Name des Feldes.
Variablen und Operatoren. C++ Teil 2: Grundstrukturen Variablen Operatoren Kontrollstrukturen Funktionen Header-Dateien Pointer und Referenzen.
Tutorium Software-Engineering SS14 Florian Manghofer.
Java Programme nur ein bisschen objektorientiert.
Tutorium Software-Engineering SS14 Florian Manghofer.
Tutorium Software-Engineering SS14 Florian Manghofer.
Pointer, Arrays und verkettete Listen. Mehrdimensionale Arrays  Pointer auf ein Array von Pointern  int32 **matrix = new int32*[3];  matrix: Zeiger.
Tutorium Software-Engineering SS14 Florian Manghofer.
Tutorium Software-Engineering SS14 Florian Manghofer.
Funktionen (Zweck und Eigenschaften) Funktionen sind Unterprogramme, die einen bestimmten Zweck erfüllen Sie zerlegen Probleme in kleine, abgeschlossene.
Strukturen (Eigenschaften) Strukturen dienen zur Zusammenfassung mehrerer Komponenten verschiedener Typen zu einer Einheit, die dann mit gemeinsamen Namen.
Pointer. * und &  Bei der Definition int var1; ○ // „normale“ Variable int *var2; ○ // Zeiger auf einen Integer int *var2 = NULL; ○ // … incl. Initialisierung.
Arrays in Java Ein Array ist eine Variable, die aus einer An-zahl von Elementen des gleichen Datentyps besteht, die aufeinanderfolgend im Speicher liegen.
Arrays in C Ein Array ist eine Variable, die aus einer Anzahl von Elementen des gleichen Datentyps besteht, die aufeinanderfolgend im Speicher liegen.
 Präsentation transkript:

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

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

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

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 = 223654321392 &i = 223654321384 Ä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

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

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

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

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

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

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

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

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

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