C-Kurs 2010 Pointer. 16. September v2.7.3

Ähnliche Dokumente
C-Kurs 2011: Arrays, Strings, Pointer. Ohne Pointer geht nichts. Willkommen zum dritten Tag des C-Kurses.

Arrays (Felder/Vektoren)

Organisatorisches. Übungsleiter: Karsten Otto Homepage: Aufgaben

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

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

Grundlagen der Programmierung in C++ Arrays und Strings, Teil 1

C allgemein. C wurde unter und für Unix entwickelt. Vorläufer sind BCPL und B.

Systempraktikum im Wintersemester 2009/2010 (LMU): Vorlesung vom Foliensatz 2

Zusammenfassung des Handzettels für Programmieren in C

Vektoren 105. array-qualifier static restrict const volatile array-size-expression assignment-expression * simple-declarator identifier

Dynamischer Speicher

10 Die Programmiersprache C99: Zusammenfassung

7 Funktionen. 7.1 Definition. Prototyp-Syntax: {Speicherklasse} {Typ} Name ({formale Parameter});

Typ : void* aktuelle Parameter Pointer von beliebigem Typ

Computergrundlagen Programmieren in C

Übungspaket 14 Eindimensionale Arrays

Praxis der Programmierung

Einführung in die Programmiersprache C

Zeiger, Arrays und Strings in C und C++

Advanced Programming in C

Einführung in die Programmierung Arrays, Zeiger, Strings. Arvid Terzibaschian

3D Programmierpraktikum: Einführung in C++ - Teil 1

Computergrundlagen Programmieren in C

Übungspaket 29 Dynamische Speicherverwaltung: malloc() und free()

Einleitung Entwicklung in C Hello-World! Konstrukte in C Zusammenfassung Literatur. Grundlagen von C. Jonas Gresens

Funktionen Häufig müssen bestimmte Operationen in einem Programm mehrmals ausgeführt werden. Schlechte Lösung: Gute Lösung:

Grundlagen der Programmiersprache C für Studierende der Naturwissenschaften

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

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

Felder, Rückblick Mehrdimensionale Felder. Programmieren in C

Die Programmiersprache C99: Zusammenfassung

Programmieren in C. Die C-Standardbibliothek. Prof. Dr. Nikolaus Wulff

Grundlagen. Die Komponenten eines C Programms. Das erste Programm

Hello world. Sebastian Dyroff. 21. September 2009

Ein- und Ausgabe. C - Kurs Mario Bodemann. 15. September 2010

Dr. Monika Meiler. Inhalt

Zeichenketten (Strings) in C

Pointer. Variablen. Pointer. Ein elementares Beispiel. Pointer in C

Vorkurs C++ Programmierung

Übungspaket 23 Mehrdimensionale Arrays

Lösung Übungszettel 6 Aufgabe 1-4

INE1 Mehr zu Funktionen Ausserdem: Strings (Saiten) Call by value, struct's Call by reference Array Parameter Strings und Stringfunktionen

Übung zur Vorlesung Programmieren in C

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

PROGRAMMIEREN MIT C. }, wird kompiliert mit dem Befehl. (-o steht für output) und ausgeführt mit dem Befehl

Modellierung und Programmierung

Die Programmiersprache C Eine Einführung

Grundlagen C und C++ Einheit 03: Grundlagen in C++ Lorenz Schauer Lehrstuhl für Mobile und Verteilte Systeme

Einleitung. Informationsquellen: - Webseite zur Vorlesung, Abschnitt Informationen zu C und C++ Kurzeinführung in C/C++

9 Zeiger (Pointer). Dynamischer Speicher

RO-Tutorien 3 / 6 / 12

Programmiersprachen Einführung in C. Unser erstes C-Programm. Unser erstes C-Programm. Unser erstes C-Programm. Unser erstes C-Programm

WS03/04 Variablen und Konstanten TFH. Inhaltsverzeichnis. 1.3 Der Adressoperator &

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

Ein- und Ausgabe mit Dateien

Übung HelloWorld /*===========================================================================

3. Arrays und Pointer

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

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

Übungspaket 23 Mehrdimensionale Arrays

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

Zeichendarstellung. Zeichen sind Zahlen (in C) Zeichen und switch

Hello World. Javakurs 2014, 1. Vorlesung. Sebastian Schuck. basierend auf der Vorlage von Arne Kappen. wiki.freitagsrunde.org. 3.

FH Ravensburg-Weingarten Schriftlich Prüfung Programmieren

Objektbasierte Entwicklung

Elementare Datentypen in C++

Programmieren in C. Felder, Schleifen und Fließkommaarithmetik. Prof. Dr. Nikolaus Wulff

Lösungsvorschlag zur 9. Übung

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

Embedded Toolchain. 1 C/C++-Grundlagen. strncpy_s, strcpy_s etc. V 4.02; Hon. Prof. Helmke 1

Embedded SQL in PostgreSQL

C Überlebenstraining

GI Vektoren

Probeklausur: BTI2 / Programmieren I Prof. Dr. H. Herold Erlaubte Hilfsmittel: Vorlesungsmitschrift; C-Bücher

Übungen zu Systemprogrammierung 1 (SP1)

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

Dynamische Speicherverwaltung

Tutorium Rechnerorganisation

16. März 2016 artb5-v1.1

1.4. Funktionen. Objektorientierte Programmierung mit C++

2. Programmierung in C

Zeiger: Der Adressoperator &

Typische Speicherfehler in C

6. Bearbeitung von Strings in C Bearbeitung von Strings in C

Beispiel für einen IPC-Server, der seinen Dienst über den Global Name Service im Netzwerk bekannt gibt. Header-Dateien einbinden

Java Einführung Objekt-Datentypen und Strings. Kapitel 8 und 9

Programmieren in C++ Einführung

Algorithmen und Datenstrukturen

Einführung Datentypen Verzweigung Schleifen Funktionen Dynamische Datenstrukturen. Java Crashkurs. Kim-Manuel Klein

Grundlagen C und C++ Einheit 02: Grundlagen in C. Lorenz Schauer Lehrstuhl für Mobile und Verteilte Systeme

Modul 122 VBA Scribt.docx

+ C - Array (Vektoren, Felder)

Zusammengehörige Daten struct. Strukturierte Datentypen und Funktionszeiger. Zugriff auf struct-elemente. Variablendeklarationen mit struct

Deklarationen in C. Prof. Dr. Margarita Esponda

FH München, FB 03 FA WS 06/07. Ingenieurinformatik. Name Vorname Matrikelnummer Sem.Gr.: Hörsaal Platz

Datentypen: Enum, Array, Struct, Union

Programmiersprachen Einführung in C

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

Lösung Übungszettel 6

Algorithmen und Programmierung II

Transkript:

C-Kurs 2010 Pointer Sebastian@Pipping.org 16. September 2010 v2.7.3 This work is licensed under the Creative Commons Attribution-ShareAlike 3.0 License.

C-Kurs Mi Konzepte, Syntax,... printf, scanf Next Do Pointer, Arrays,... Compiler, Headers,... Fr Structs, malloc,... Debugging I,... + Vorstellung der Aufgabe Mo Di Lösung der Aufgabe Debugging II stdlib, Bücher,... 2

Ohne Pointer geht nichts. 3

Themen Hello Pointer Call by Reference NULL-Pointer Pointer auf Pointer Von Pointern zu Arrays Pointer-Arithmetik Strings und Längenberechnung Const Correctness Initialisierung von Strings Mehrdimensionale Arrays Programm-Argumente: argc und argv Weiterführende Themen Zusammenfassung 4

Pointer

Variablen im RAM 0 RAM 2³²-1 6

Variablen im RAM 0 RAM int i 2³²-1 7

Variablen im RAM 0 RAM int i 5 2³²-1 8

Variablen im RAM 0 RAM int i 12-15 5 2³²-1 9

Variablen im RAM 0 RAM int i 12-15 5 12 2³²-1 10

Variablen im RAM 0 RAM int i 12-15 5 36-39 12 2³²-1 11

Variablen im RAM 0 RAM int i 12-15 5 int * p 36-39 12 2³²-1 12

Variablen im RAM 0 RAM int i 12-15 5 36 int * p 36-39 12 2³²-1 13

Variablen im RAM 0 RAM int i 12-15 5 28-31 36 int * p 36-39 12 2³²-1 14

Variablen im RAM 0 RAM int i 12-15 5 int ** pp 28-31 36 int * p 36-39 12 2³²-1 15

Was ist ein Pointer? 16

Pointer kann meinen eine... A) B) 17

Pointer kann meinen eine... A) Adresse B) 18

Pointer kann meinen eine... A) Adresse B) Variable, die eine Adresse speichert 19

Hello Pointer

21 Hello Pointer #include <stdio.h> int main() { } return 0;

22 Hello Pointer #include <stdio.h> int main() { int i = 3; } return 0;

23 Hello Pointer #include <stdio.h> int main() { int i = 3; int * p = &i; } return 0;

24 Hello Pointer #include <stdio.h> int main() { int i = 3; int * p = &i; *p = 4; } return 0;

25 Hello Pointer #include <stdio.h> int main() { int i = 3; int * p = &i; *p = 4; p = 5; } return 0;

26 Hello Pointer #include <stdio.h> int main() { int i = 3; int * p = &i; printf(i == %d, p == %p\n, i, p); *p = 4; printf(i == %d, p == %p\n, i, p); p = 5; printf(i == %d, p == %p\n, i, p); } return 0;

27 Ausgabe # gcc hello_pointer.c -o hello_pointer

Ausgabe # gcc hello_pointer.c -o hello_pointer #./hello_pointer 28

Ausgabe # gcc hello_pointer.c -o hello_pointer #./hello_pointer i == 3, p == 0xbfa3ad8c 29

Ausgabe # gcc hello_pointer.c -o hello_pointer #./hello_pointer i == 3, p == 0xbfa3ad8c *p = 4; 30

Ausgabe # gcc hello_pointer.c -o hello_pointer #./hello_pointer i == 3, p == 0xbfa3ad8c *p = 4; i == 4, p == 0xbfa3ad8c 31

Ausgabe # gcc hello_pointer.c -o hello_pointer #./hello_pointer i == 3, p == 0xbfa3ad8c *p = 4; i == 4, p == 0xbfa3ad8c p = 5; 32

Ausgabe # gcc hello_pointer.c -o hello_pointer #./hello_pointer i == 3, p == 0xbfa3ad8c *p = 4; i == 4, p == 0xbfa3ad8c p = 5; i == 4, p == 0x5 33

34 Zusammenfassung 1/2 Operator & liefert eine Adresse

Zusammenfassung 1/2 Operator & liefert eine Adresse Operator * folgt einer Adresse (er dereferenziert) 35

Zusammenfassung 1/2 Operator & liefert eine Adresse Operator * folgt einer Adresse (er dereferenziert) & und * sind komplementär; es gilt: *(&x) = x 36

37 Zusammenfassung 2/2 Pointer zeigen auf typisierte Daten: int * char *

Call by Reference

Call by Reference #include <stdio.h> int main() { int i = 0; } return 0; 39

Call by Reference #include <stdio.h> int main() { int i = 0; by_value(i); } return 0; 40

Call by Reference #include <stdio.h> int main() { int i = 0; by_value(i); by_reference(&i); } return 0; 41

Call by Reference #include <stdio.h> void by_value (int x) { x += 3; } void by_reference(int * x) { *x += 4; } int main() { int i = 0; by_value(i); by_reference(&i); } return 0; 42

Call by Reference #include <stdio.h> void by_value (int x) { x += 3; } void by_reference(int * x) { *x += 4; } int main() { int i = 0; by_value(i); printf(i == %d\n, i); by_reference(&i); printf(i == %d\n, i); } return 0; 43

44 Ausgabe # gcc call_by_reference.c \ -o call_by_reference

Ausgabe # gcc call_by_reference.c \ -o call_by_reference #./call_by_reference 45

Ausgabe # gcc call_by_reference.c \ -o call_by_reference #./call_by_reference i == 0 i == 4 46

NULL-Pointer

NULL-Pointer #include <stdlib.h> /* for NULL */... int * p = NULL; 48

NULL-Pointer #include <stdlib.h> /* for NULL */... int * p = NULL;... int b = *p; 49

NULL-Pointer #include <stdlib.h> /* for NULL */... int * p = NULL;... int b = *p; BANG! 50

51 Zusammenfassung NULL markiert Abwesenheit

52 Zusammenfassung NULL markiert Abwesenheit NULL-Pointern darf nicht gefolgt werden

53 Zusammenfassung NULL markiert Abwesenheit NULL-Pointern darf nicht gefolgt werden Wir müssen wissen, ob ein Pointer NULL ist, bevor wir ihm folgen

Pointer auf Pointer

55 Anwendungen Mehrdimensionale Arrays

Anwendungen Mehrdimensionale Arrays Call by Reference von Pointern 56

57 man strtod STRTOD(3) Linux Programmer's Manual STRTOD(3) NAME strtod, strtof, strtold - convert ASCII string to floating-point number SYNOPSIS #include <stdlib.h>... double strtod(const char *nptr, char **endptr); float strtof(const char *nptr, char **endptr);

58 man strtod STRTOD(3) Linux Programmer's Manual STRTOD(3) NAME strtod, strtof, strtold - convert ASCII string to floating-point number SYNOPSIS #include <stdlib.h>... double strtod(const char *nptr, char **endptr); float strtof(const char *nptr, char **endptr);

59 Pointer auf Pointer int i = 3; int * p = &i;

60 Pointer auf Pointer int i = 3; int * p = &i; int ** pp = &p;

Variablen im RAM (Wiederholung) 0 RAM int i 12-15 5 int ** pp 28-31 36 int * p 36-39 12 2³²-1 61

Von Pointern zu Arrays

63 Von Pointern zu Arrays #include <stdio.h> int main() { } return 0;

64 Von Pointern zu Arrays #include <stdio.h> void dump(const int * data, int count) { } int main() { } return 0;

65 Von Pointern zu Arrays #include <stdio.h> void dump(const int * data, int count) { int i = 0; for (; i < count; ++i) { } } int main() { } return 0;

66 Von Pointern zu Arrays #include <stdio.h> void dump(const int * data, int count) { int i = 0; for (; i < count; ++i) { printf(field %d: %d\n, i + 1, *(data + i)); } } int main() { } return 0;

67 Von Pointern zu Arrays #include <stdio.h> void dump(const int * data, int count) { int i = 0; for (; i < count; ++i) { printf(field %d: %d\n, i + 1, data[i]); } } int main() { } return 0;

68 Von Pointern zu Arrays #include <stdio.h> void dump(const int * data, int count) { int i = 0; for (; i < count; ++i) { printf(field %d: %d\n, i + 1, data[i]); } } int main() { int const primes[] = {2, 3, 5, 7, 11}; } return 0;

69 Von Pointern zu Arrays #include <stdio.h> void dump(const int * data, int count) { int i = 0; for (; i < count; ++i) { printf(field %d: %d\n, i + 1, data[i]); } } int main() { int const primes[] = {2, 3, 5, 7, 11}; dump(primes, 5); return 0; }

70 Von Pointern zu Arrays #include <stdio.h> void dump(const int * data, int count) { int i = 0; for (; i < count; ++i) { printf(field %d: %d\n, i + 1, data[i]); } } int main() { int const primes[] = {2, 3, 5, 7, 11}; dump(primes, sizeof(primes) / sizeof(int)); return 0; }

71 Von Pointern zu Arrays #include <stdio.h> void dump(const int * data, int count) { int i = 0; for (; i < count; ++i) { printf(field %d: %d\n, i + 1, data[i]); } } int main() { int const primes[] = {2, 3, 5, 7, 11, 13}; dump(primes, sizeof(primes) / sizeof(int)); return 0; }

72 Zusammenfassung (1/5) Array-Zugriff via [n ] ähnlich Java

73 Zusammenfassung (2/5) Array = Pointer auf das erste Element

74 Zusammenfassung (3/5) a [n ] = *(a + n )

75 Zusammenfassung (4/5) sizeof(variable ) = Von variable belegter Speicher in Byte

76 Zusammenfassung (5/5) sizeof(type ) = Von type -Instanzen belegter Speicher in Byte

Pointer-Arithmetik

Pointer-Arithmetik int numbers[3]; char text[] = software libre; 78

Pointer-Arithmetik int numbers[3]; char text[] = software libre; Es gilt: 1. numbers[i] = *(numbers + i) 2. 3. 79

Pointer-Arithmetik int numbers[3]; char text[] = software libre; Es gilt: 1. numbers[i] = *(numbers + i) 2. text[j] = *(text + j) 3. 80

Pointer-Arithmetik int numbers[3]; char text[] = software libre; Es gilt: 1. numbers[i] = *(numbers + i) 2. text[j] = *(text + j) 3. sizeof(char) sizeof(int) 81

Pointer-Arithmetik int numbers[3]; char text[] = software libre; Es gilt: 1. numbers[i] = *(numbers + i) 2. text[j] = *(text + j) 3. sizeof(char) sizeof(int) Für Operatoren +/- auf Pointern folgt: 82

Pointer-Arithmetik int numbers[3]; char text[] = software libre; Es gilt: 1. numbers[i] = *(numbers + i) 2. text[j] = *(text + j) 3. sizeof(char) sizeof(int) Für Operatoren +/- auf Pointern folgt: Sprungweite variiert mit dem Typen! 83

Strings

85 Strings ABC

86 Strings ABC = { 65, 66, 67, 0 }

87 Strings ABC = { 65, 66, 67, 0 } 012

88 Strings ABC = { 65, 66, 67, 0 } 012 = { 48, 49, 50, 0 }

89 Strings ABC = { 65, 66, 67, 0 } 012 = { 48, 49, 50, 0 } 012\0

90 Strings ABC = { 65, 66, 67, 0 } 012 = { 48, 49, 50, 0 } 012\0 = { 48, 49, 50, 0, 0 }

91 Strings ABC = { 65, 66, 67, 0 } 012 = { 48, 49, 50, 0 } 012\0 = { 48, 49, 50, 0, 0 } #include <string.h>... strlen(abc);

92 Strings ABC = { 65, 66, 67, 0 } 012 = { 48, 49, 50, 0 } 012\0 = { 48, 49, 50, 0, 0 } #include <string.h>... strlen(abc); = 3

93 my_strlen int my_strlen(const char * str) { } return ( );

94 my_strlen int my_strlen(const char * str) { char const * const begin = str; } return ( );

95 my_strlen int my_strlen(const char * str) { char const * const begin = str; while (*str) { str++; } return ( ); }

96 my_strlen int my_strlen(const char * str) { char const * const begin = str; while (*str) { str++; } return (str - begin); }

Const Correctness

98 Const Correctness (1/6) Modifikator const verbietet Schreibzugriff

99 Const Correctness (2/6) int foo;

100 Const Correctness (2/6) const int foo;

101 Const Correctness (2/6) int const foo;

102 Const Correctness (3/6) int * foo;

103 Const Correctness (3/6) int * foo; <1>

104 Const Correctness (3/6) int * foo; <2a> <2b> <1>

105 Const Correctness (4/6) <1> int * const foo;

106 Const Correctness (4/6) <1> int * const foo; Verboten: foo =...;

107 Const Correctness (4/6) <1> int * const foo; Verboten: foo =...; <2a> const int * foo; <2b> int const * foo;

108 Const Correctness (4/6) <1> int * const foo; Verboten: foo =...; <2a> const int * foo; <2b> int const * foo; Verboten: foo[0] =...;

109 Const Correctness (5/6) <2a,1> const int * const foo; <2b,1> int const * const foo;

110 Const Correctness (5/6) <2a,1> const int <2b,1> * const foo; int const * const foo; Verboten: foo =...; foo[0] =...;

111 Const Correctness (6/6) const int * const * foo;

112 Const Correctness (6/6) const int * const * foo; Erlaubt: foo =...;

113 Const Correctness (6/6) const int * const * foo; Erlaubt: foo =...; Verboten: foo[0] =...; foo[0][0] =...;

114 Const Correctness in APIs int my_strlen( char * str); int my_strlen(const char * str);

115 Const Correctness in APIs int my_strlen( char * str); Funktion darf Inhalt von str verändern int my_strlen(const char * str);

116 Const Correctness in APIs int my_strlen( char * str); Funktion darf Inhalt von str verändern my_strlen(abc) gibt Compile-Fehler int my_strlen(const char * str);

117 Const Correctness in APIs int my_strlen( char * str); Funktion darf Inhalt von str verändern my_strlen(abc) gibt Compile-Fehler int my_strlen(const char * str); Funktion darf Inhalt von str nicht verändern

118 Const Correctness in APIs int my_strlen( char * str); Funktion darf Inhalt von str verändern my_strlen(abc) gibt Compile-Fehler int my_strlen(const char * str); Funktion darf Inhalt von str nicht verändern my_strlen(abc) erlaubt und sicher

Initialisierung von Strings

120 Initialisierung von Strings char a[] = Hallo;

Initialisierung von Strings char a[] = Hallo; sizeof(a) = sizeof(char)*(5 + 1) 121

Initialisierung von Strings Variante Mit Array char a[] = Hallo; sizeof(a) = sizeof(char)*(5 + 1) 122

Initialisierung von Strings Variante Mit Array char a[] = Hallo; sizeof(a) = sizeof(char)*(5 + 1) Inhalt les- und schreibbar 123

Initialisierung von Strings Variante Mit Array char a[] = Hallo; sizeof(a) = sizeof(char)*(5 + 1) Inhalt les- und schreibbar Variante Nur Pointer 124

Initialisierung von Strings Variante Mit Array char a[] = Hallo; sizeof(a) = sizeof(char)*(5 + 1) Inhalt les- und schreibbar Variante Nur Pointer char * p = Hallo; 125

Initialisierung von Strings Variante Mit Array char a[] = Hallo; sizeof(a) = sizeof(char)*(5 + 1) Inhalt les- und schreibbar Variante Nur Pointer char * p = Hallo; sizeof(p) = sizeof(char *) 126

Initialisierung von Strings Variante Mit Array char a[] = Hallo; sizeof(a) = sizeof(char)*(5 + 1) Inhalt les- und schreibbar Variante Nur Pointer char * p = Hallo; sizeof(p) = sizeof(char *) Inhalt nicht schreibbar 127

Initialisierung von Strings Variante Mit Array char a[] = Hallo; sizeof(a) = sizeof(char)*(5 + 1) Inhalt les- und schreibbar Variante Nur Pointer const char * p = Hallo; sizeof(p) = sizeof(char *) Inhalt nicht schreibbar 128

129 Variante Nur Pointer #include <stdio.h> int main() { char * a = hallo; char * b = hallo; } return 0;

130 Variante Nur Pointer #include <stdio.h> int main() { char * a = hallo; char * b = hallo; printf(a=%p\n b=%p\n, a, b); } return 0;

131 Variante Nur Pointer #include <stdio.h> int main() { char * a = hallo; char * b = hallo; printf(a=%p\n b=%p\n, a, b); a[0] = `X'; } return 0;

132 Ausgabe # gcc rombad.c -o rombad

Ausgabe # gcc rombad.c -o rombad #./rombad 133

Ausgabe # gcc rombad.c -o rombad #./rombad a=0x80484dc b=0x80484dc 134

Ausgabe # gcc rombad.c -o rombad #./rombad a=0x80484dc b=0x80484dc 135

Ausgabe # gcc rombad.c -o rombad #./rombad a=0x80484dc b=0x80484dc Segmentation fault 136

137 GCC Flag -Wwrite-strings # gcc -Wall -Wextra -Wwrite-strings \ rombad.c -o rombad

138 GCC Flag -Wwrite-strings # gcc -Wall -Wextra -Wwrite-strings \ rombad.c -o rombad rombad.c: In function `main': rombad.c:4: warning: initialization discards qualifiers from pointer target type rombad.c:5: warning: initialization discards qualifiers from pointer target type

139 Variante Nur Pointer #include <stdio.h> int main() { char * a = hallo; char * b = hallo; printf(a=%p\n b=%p\n, a, b); a[0] = `X'; } return 0;

140 Variante Nur Pointer #include <stdio.h> int main() { const char * a = hallo; const char * b = hallo; printf(a=%p\n b=%p\n, a, b); a[0] = `X'; } return 0;

141 Variante Nur Pointer #include <stdio.h> int main() { const char * a = hallo; const char * b = hallo; printf(a=%p\n b=%p\n, a, b); a[0] = `X'; } return 0;

Mehrdimensionale Arrays

Mehrdimensionale Arrays Zwei Varianten: Array von Arrays ( deep array ) linear ( flat array ) 143

Variante Array von Arrays

145 2D-Array als Array von Arrays 0 1 2 3 4 5

146 2D-Array als Array von Arrays 0 1 2 3 4 5

147 2D-Array als Array von Arrays a 0 1 2 3 4 5

148 2D-Array als Array von Arrays a a[0] 0 1 2 a[1] 3 4 5

149 2D-Array als Array von Arrays a a[0] 0 1 2 a[1] 3 4 5 a[1][2]

150 2D-Array als Array von Arrays int main() { } return 0;

2D-Array als Array von Arrays int main() { int row0[] = {0, 1, 2}; int row1[] = {3, 4, 5}; int * const d[] = {row0, row1}; } return 0; 151

2D-Array als Array von Arrays int main() { int row0[] = {0, 1, 2}; int row1[] = {3, 4, 5}; int * const d[] = {row0, row1}; demo_deep(d); return 0; } 152

2D-Array als Array von Arrays void demo_deep(int * const * a) { } a[1][2] *= 2; int main() { int row0[] = {0, 1, 2}; int row1[] = {3, 4, 5}; int * const d[] = {row0, row1}; demo_deep(d); return 0; } 153

Variante Linear

155 2D-Array linear 0 1 2 3 4 5

156 2D-Array linear a 0 1 2 3 4 5

157 2D-Array linear a 0 1 2 3 4 5 a[0] a[1] a[1][2]

158 2D-Array linear int main() { } return 0;

2D-Array linear int main() { int f[][3] = { {0, 1, 2}, {3, 4, 5} }; } return 0; 159

2D-Array linear int main() { int f[][3] = { {0, 1, 2}, {3, 4, 5} }; demo_flat(f); return 0; } 160

2D-Array linear void demo_flat(int a[][3]) { } a[1][2] *= 2; int main() { int f[][3] = { {0, 1, 2}, {3, 4, 5} }; demo_flat(f); return 0; } 161

Variante Hybrid

163 2D-Array-Hybrid int main() { } return 0;

2D-Array-Hybrid int main() { int f[][3] = { {0, 1, 2}, {3, 4, 5} }; } return 0; 164

2D-Array-Hybrid int main() { int f[][3] = { {0, 1, 2}, {3, 4, 5} }; int * const d[] = {f[0], f[1]}; } return 0; 165

2D-Array-Hybrid int main() { int f[][3] = { {0, 1, 2}, {3, 4, 5} }; int * const d[] = {f[0], f[1]}; demo_deep(d); demo_flat(f); return 0; } 166

2D-Array-Hybrid void demo_deep(int * const * a); void demo_flat(int a[][3]); int main() { int f[][3] = { {0, 1, 2}, {3, 4, 5} }; int * const d[] = {f[0], f[1]}; demo_deep(d); demo_flat(f); return 0; } 167

argc und argv

169 argc und argv #include <stdio.h> int main() { } return 0;

170 argc und argv #include <stdio.h> int main(int argc, char ** argv) { } return 0;

171 argc und argv #include <stdio.h> int main(int argc, char ** argv) { printf(%d parameters\n, argc - 1); } return 0;

argc und argv #include <stdio.h> int main(int argc, char ** argv) { int i = 0; printf(%d parameters\n, argc - 1); for (; i < argc; ++i) { } } return 0; 172

argc und argv #include <stdio.h> int main(int argc, char ** argv) { int i = 0; printf(%d parameters\n, argc - 1); for (; i < argc; ++i) { printf([%d] %s\n, i, argv[i]); } return 0; } 173

174 Ausgabe # gcc print_args.c -o print_args

Ausgabe # gcc print_args.c -o print_args #./print_args free 'open source' software 175

Ausgabe # gcc print_args.c -o print_args #./print_args free 'open source' software 3 parameters [0]./print_args [1] free [2] open source [3] software 176

Weiterführende Themen

Weiterführende Themen Character Encodings, Unicode, wchar_t Sicherer Umgang mit Strings Der Typ size_t Void-Pointer Funktions-Pointer 178

Zusammenfassung

Zusammenfassung sizeof(x ) liefert die Größe von x in Byte Operator & liefert eine Adresse Operator * folgt einer Adresse (er dereferenziert) Pointer sind typisiert Arrays sind Pointer auf ihr erstes Element Strings sind nulltermininiert Const Correctness bei Pointern ist wichtig 180

181 Danke! Fragen? http://blog.hartwork.org/