Programmieren in C. Zeiger und Zeichenketten. Prof. Dr. Nikolaus Wulff

Ähnliche Dokumente
Programmieren in C. Funktionen mit Zeigern und Adressen. Prof. Dr. Nikolaus Wulff

8. Referenzen und Zeiger

2. Programmierung in C

Zeiger. C-Kurs 2012, 2. Vorlesung. Tino Kutschbach 10.

F Zeiger, Felder und Strukturen in C

Inhalt. 4.5 Arbeit mit Zeigern (engl. Pointer)

Programmierwerkstatt. Arrays, Pointer und Referenzen

Zeiger (engl. Pointer)

Zeiger in C und C++ Zeiger in Java und C/C++

Programmieren mit C++ Zeiger (pointer) und Text (string) Inhalt

Praxis der Programmierung

Java Referenzdatentypen genauer betrachtet

Crashkurs C++ - Teil 1

Teil 5: Zeiger, Felder, Zeichenketten Gliederung

Teil 5: Felder, Zeiger, Zeigerarithmetik Gliederung

C++ Teil 5. Sven Groß. 13. Mai Sven Groß (IGPM, RWTH Aachen) C++ Teil Mai / 18

C++ Teil 6. Sven Groß. 23. Nov Sven Groß (IGPM, RWTH Aachen) C++ Teil Nov / 15

C- Kurs 08 Zeiger. Dipl.- Inf. Jörn Hoffmann leipzig.de. Universität Leipzig Ins?tut für Informa?k Technische Informa?

Programmieren in C. Speicher anfordern, Unions und Bitfelder. Prof. Dr. Nikolaus Wulff

Zeiger, Arrays und Strings in C und C++

Felder, Zeiger und Adreßrechnung

Einführung Pointer. C-Kurs 2013, 2. Vorlesung. Nico Andy

Zeiger (1) Allgemeines

Arrays,Strings&Pointer in C/C++

C-Pointer (Zeiger, Adressen) vs. C++ Referenzen

Programmiersprache 1 (C++) Prof. Dr. Stefan Enderle NTA Isny

Praxis der Programmierung

6 ZEIGER UND REFERENZEN - ALLGEMEINES

RO-Tutorien 3 / 6 / 12

Funktionen: Rückgabewert

Methoden. Gerd Bohlender. Einstieg in die Informatik mit Java, Vorlesung vom

Repetitorium Programmieren I + II

2. Programmierung in C

Zusammenfassung des Handzettels für Programmieren in C

Programmierung mit C Zeiger

2. Programmierung in C

C++ Teil 5. Sven Groß. 8. Mai IGPM, RWTH Aachen. Sven Groß (IGPM, RWTH Aachen) C++ Teil 5 8. Mai / 16

Kapitel 8. Adressen und Zeiger

C++ - Einführung in die Programmiersprache Zeiger, Referenzen und Strukturen. Leibniz Universität IT Services Anja Aue

Arrays (Felder/Vektoren)

Programmieren in C. Eine Einführung in die Programmiersprache C. Prof. Dr. Nikolaus Wulff

Arrays. Einleitung. Deklarieren einer Array Variablen

C-Pointer (Zeiger, Adressen) vs. C++ Referenzen

pue13 January 28, 2017

Programmierung und Angewandte Mathematik

Betriebssysteme, Rechnernetze und verteilte Systeme 1. Crashkurs C (2)

Einstieg in die Informatik mit Java

Repetitorium Programmieren I + II

Programmieren 1 C Überblick

int i=1; //Integerzahl i anlegen und mit 1 initialisieren float wert; //Floatzahl deklarieren scanf( %f,&wert); //Wert über Tastatur eingeben

INE1 Arrays, Zeiger, Datenstrukturen

Informatik Vorkurs - Vorlesung 2

C++ Teil 5. Sven Groß. 16. Nov Sven Groß (IGPM, RWTH Aachen) C++ Teil Nov / 16

Programmieren in C. Operatoren, Variablen und deren Sichtbarkeit. Prof. Dr. Nikolaus Wulff

JAVA BASICS. 2. Primitive Datentypen. 1. Warum Java? a) Boolean (logische Werte wahr & falsch)

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Referenzen. Referenzen

Strukturen in C. Strukturen stellen eine Zusammenfassung von Datenelementen unterschiedlichen Typs unter einem Namen dar.

Variablen. Deklaration: «Datentyp» «Variablenname» Datentyp bestimmt Größe in Bytes: sizeof Beispiel: long int v; Größe: 4 Bytes

Proseminar - Zeiger in C

Variablen in C++ Einfache Variablen Strukturen Arrays und Zeichenketten Zeiger und Referenzen Parameter Dynamische Speicherverwaltung

Klausur in Programmieren

Informatik II. Woche 10, Giuseppe Accaputo

Java Datentypen und Variablen

! "eine Zeichenkette\nmit Doppelapostroph \" und Backslash \\"

Ausdrücke in C. Ein großes Teilgebiet der Sprache C im Zusammenhang von Dieter Holzhäuser

Objekte werden eindeutig beschrieben durch ihren Typ und einen beliebig wählbaren Bezeichner.

Algorithmen und Datenstrukturen

U3 3. Übung U3 3. Übung. Systemnahe Programmierung in C Übungen Moritz Strübe Universität Erlangen-Nürnberg Informatik 4, 2009 U3.fm

Besprechung Aufgabe 1. Pointer. Register und Ports. SPiC - Ü U3.1

Unterprogramme. AnPr. Wiederholungen im Code werden vermieden. Programme werden leichter lesbar. Die Entwicklung und der Test werden vereinfacht.

Einführung in die Programmierung

Prozeduren und Funktionen

Bereits behandelt: Einfache Datentypen / Variablen. Schleifen und Verzweigungen. Funktionen. Heute: Felder, Zeiger, Referenzen. Freispeicherverwaltung

RO-Tutorien 17 und 18

Bereits behandelt: Einfache Datentypen / Variablen. Schleifen und Verzweigungen. Funktionen. Heute: Felder, Zeiger, Referenzen. Freispeicherverwaltung

Funktionen. mehrfach benötigte Programmteile nur einmal zu schreiben und mehrfach aufzurufen

Kapitel 4. Programmierkurs. Datentypen. Arten von Datentypen. Wiederholung Kapitel 4. Birgit Engels, Anna Schulze WS 07/08

Programmiersprachen Einführung in C

Programmiertechnik. Teil 4. C++ Funktionen: Prototypen Overloading Parameter. C++ Funktionen: Eigenschaften

Arrays. Theorieteil. Inhaltsverzeichnis. Begriffe. Programmieren mit Java Modul 3. 1 Modulübersicht 3

Java I Vorlesung 6 Referenz-Datentypen

Überblick: Teil C Systemnahe Softwareentwicklung

RO-Tutorien 15 und 16

Grundlagen der OO- Programmierung in C#

Pointer und Arrays. INE1, Montag M. Thaler, Office TG208. ZHAW, M. Thaler, K. Rege, G.

Propädeutikum. Dipl.-Inf. Frank Güttler M. Sc. Stephan Fischer

6. Zeiger Allgemeines Definition eines Zeigers

Einführung in C. EDV1-04C-Einführung 1

Übungsblatt 1. Java Vorkurs (WS 2017)

1. Referenzdatentypen: Felder und Strings. Referenz- vs. einfache Datentypen. Rückblick: Einfache Datentypen (1) 4711 r

1. Referenzdatentypen: Felder und Strings

Programmieren in Java

2. Programmierung in C

Angewandte Mathematik und Programmierung

Verwendung Vereinbarung Wert einer Funktion Aufruf einer Funktion Parameter Rekursion. Programmieren in C

6. Funktionen, Parameterübergabe

Variablen und Parameter

Primitive Datentypen und Felder (Arrays)

Transkript:

Programmieren in C Zeiger und Zeichenketten Prof. Dr. Nikolaus Wulff

Zeiger Variablen benötigen zur Laufzeit einen bestimmten Speicherplatz. Die Größe des Bedarfs richtet sich nach dem Typ der Variablen, ein char belegt 1 Byte, ein int 4 Byte und ein long 8 Byte, etc. C bietet sogenannte Zeiger, mit denen explizit auf den Speicherplatz, d.h. die Adresse der jeweiligen Variablen zugegriffen werden kann. Zeiger werden bei der Deklaration durch ein * gekennzeichnet, int* u ist ein Zeiger auf ein int, double* f ein Zeiger auf ein double etc. Prof. Dr. Nikolaus Wulff Programmieren in C 2

Adressen Der Adress-Operator & liefert die Adresse einer Variablen (nicht zu verwechseln mit Bit-AND!). int i = 5; long l = 2; int* p = &i; var adress value i: 0xFF00 5 l: 0xFF04 2 p: 0xFF10 0xFF00 Das Codefragment zeigt drei Variablen i, l, p vom Typ int, long und Zeiger auf int. Die Variable i mit dem Wert 5 hat die (willkürliche) Speicheradresse 0xFF00. Dem Zeiger p wurde die Adresse von i zugewiesen. Er hat den Wert 0xFF00. Prof. Dr. Nikolaus Wulff Programmieren in C 3

Dereferenzierung Der Derefenzierungs-Operator * liefert den Wert einer Zeigervariablen: int i = 5; long l = 2; int* p = &i; printf("i=%d i_adr=%p p=%p p_adr=%p *p=%d\n", i, &i, p, &p, *p); Ausgabe: > i=5 i_adr=0xff00 p=0xff00 p_adr=0xff10 *p=5 Mit dem Ausdruck *p wird also der Wert der Speicherzelle auf den p zeigt geliefert. In diesem Fall ist dies der Wert der Variablen i gleich 5. Prof. Dr. Nikolaus Wulff Programmieren in C 4

Indirekte Zuweisung Mit dem *-Operator lassen sich nicht nur Speicheradressen auslesen sondern auch modifzieren: p = &i; i = 1; printf("i = %d \n",i); *p = 2; printf("i = %d \n",i); Ausgabe: i = 1 i = 2 Es gibt jetzt also zwei Möglichkeiten die Variable i zu lesen oder schreiben, direkt oder indirekt per *p. Beachten Sie die unterschiedliche Bedeutung der Operatoren & und * je nach Kontext! Prof. Dr. Nikolaus Wulff Programmieren in C 5

Zeichenketten char* ist ein Zeiger auf ein Zeichen vom Typ char. Eine Zeichenkette ist ein Feld von Zeichen, dass mit dem Zeichen '\0' terminiert wird. Ebenso wie normale int oder long Variablen lassen sich Zeiger inkrementieren. Hierbei wird allerdings nicht eins hinzu addiert sondern immer die aktuelle Bytegröße der jeweiligen Referenz. Es ist einfach mit Zeigern über ein Feld zu iterieren. Es soll eine Funktion printstring zum Anzeigen einer Zeichenkette implementiert werden. Prof. Dr. Nikolaus Wulff Programmieren in C 6

PrintString Ein char Array soll angezeigt werden: void printstring(char* str) { char c = *str; while(c) { printf("%c", c); str++; c = *str; char str[] ="hallo world\n"; printstring(&str[0]); Mit dem Ausdruck &str[0] wird explizit die Adresse des 0-ten Elements des Feldes übergeben. Prof. Dr. Nikolaus Wulff Programmieren in C 7

Zeiger über Zeiger... Es ist allerdings genauso gut möglich eine Zeigervariable zu übergeben oder direkt die Speicherposition des Feldes: char str[] = {'h','a','l','l','o','\0'; char* pstr1 = str; char* pstr2 = &str[0]; printstring(str); printstring(&str[0]); printstring(pstr1); printstring(pstr2); Beachten Sie die explizite Terminierung mit '\0' im Gegensatz zu char str[] = hallo pstr1 und pstr2 zeigen auf den selben Speicherbereich. Alle Aufrufe von printstring bewirken das Selbe. Prof. Dr. Nikolaus Wulff Programmieren in C 8

Zeichenketten kopieren Mit Hilfe von Zeigern soll eine Funktion zum Kopieren einer Zeichenkette implementiert werden: void stringcopy(char* src, char* dest) { while(*src) { *dest++ = *src++; Die Schleife terminiert sobald *src == 0 ist. Beachten Sie das Zusammenspiel des Inkrementoperators ++ und des Dereferenzierungsoperators *, es wird erst inkrementiert nachdem das Zeichen von src nach dest kopiert wurde. Prof. Dr. Nikolaus Wulff Programmieren in C 9

PrintString Kurzversion Es gibt immer viele Implementierungsmöglichkeiten eine Funktion zu implementieren. Hierbei gilt es Laufzeitverhalten, Wartbarkeit und Lesbarkeit abzuwägen: void printstring(char* str) { while(*str) { printf("%c",*str++); Diese Version ist kürzer als die Ursprüngliche. Statt printf("%c"...) wird häufig die Funktion putchar zur Ausgabe eines Zeichen verwendet... Prof. Dr. Nikolaus Wulff Programmieren in C 10

char* str versus char str[] Statt Zeiger kann auch explizit mit Feldindizes gearbeitet werden: void printstring(char str[]) { int i; for(i=0; str[i]; i++) { putchar(str[i]); Diese Implementierung betont mehr den Feldcharakter mit einem Laufindex. Beachten Sie die Abbruchbedingung der for- Schleife. Prof. Dr. Nikolaus Wulff Programmieren in C 11

Zeigerarithmetik Eine letzte Variante zeigt das auch Arithmetik mit Zeigern möglich ist: void printstring(char str[]) { int i; for(i=0; *(str+i); i++) { putchar(*(str+i)); Dies bedeutet das i-te Element der Zeichenkette str[] lässt sich unterschiedlich addressieren: str[i] entspricht dem Ausdruck *(str + i) und natürlich auch i-mal str++ und dann *str Es muss explizit geklammert werden! *str + i!= *(str+i) Prof. Dr. Nikolaus Wulff Programmieren in C 12

ByValue versus byreferenz C übergibt immer Kopien der Variablen an Funktionen. Es ist daher nur dann möglich die Werte von Variablen des aufrufenden Programms zu ändern wenn nicht die Kopien der Variablen sondern die Adressen der Variablen übergeben werden. Diese Adressen sind zwar auch Kopien jedoch zeigen diese auf die selben Variablen. Diese Art der Parameterübergabe nennt sich Call byreference im Gegensatz zu Call by Value. Es soll eine Funktion swap implementiert werden, die zwei double Gleitkommazahlen vertauscht. Prof. Dr. Nikolaus Wulff Programmieren in C 13

swap byreference void swap(double x, double y){ double tmp = x; x = y; y = tmp; By Value ist falsch! Obige Version vertauscht nur innerhalb von swap. Nur die by Reference Version von swap vertauscht tatsächlich auch die Variablen des Aufrufers: void swap(double* x, double* y){ double tmp = *x; *x = *y; *y = tmp; By Reference funktioniert... Prof. Dr. Nikolaus Wulff Programmieren in C 14