Funktionen, Felder und Parameter-übergabe

Slides:



Advertisements
Ähnliche Präsentationen
Programme in C++.
Advertisements

der Universität Oldenburg
Funktionen.
Forschungszentrum caesar
Seminar: "Einführung in C/C++" Einführung in die Programmiersprache C/C++ Donnerstag Andreas Döring SS 2004.
Strukturen. In einer Struktur kann eine beliebige Anzahl von Komponenten (Daten) mit unterschiedlichen Datentypen (im Gegensatz zu Feldern) zusammengefaßt.
ARRAY oder FELD oder VEKTOR
Dynamischer Speicher. Ein Vergleich aus dem täglichen Leben...
Ein Beispiel in Java.
Dynamischer Speicher und Struktur
Pointer. Grundsätzliches: Im Arbeitsspeicher werden Daten gespeichert. Um auf die Daten eindeutig zugreifen zu können, werden diesen Daten Adressen zugeordnet.
Parameterübergabe von zweidimensionalen Feldern in Funktionen.
Objekte und Arbeitsspeicher
V AdresseWert public static void main(...){ int[] v; v=new int[2]; } Was veranlasst diese Anweisung im Arbeitsspeicher ? Es wird im Arbeitsspeicher.
FOR Anweisung.
Felder sortieren. Aufgabe: Die Zahlen eines Feldes sollen der Größe (zuerst die kleinste Zahl) nach sortiert werden.
Dynamischer Speicher. In einer Funktion wird z.B. mit der Deklaration int i; Speicher auf dem sogenannten Stack reserviert. Wenn die Funktion verlassen.
ARRAY oder FELD oder VEKTOR
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
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
Imperative Programmierung Funktionen und Parameter
PKJ 2005/1 Stefan Dissmann Methoden (Motivation) Idee: Identische Programmabschnitte zusammenfassen und mit einem Namen versehen Vorteile: Übersichtlichkeit.
PRJ 2007/1 Stefan Dissmann Motivation Problem: gleiche Datenstrukturen werden für verschiedene Objekte gebraucht: z.B. Listen von Studierenden, Kunden,
PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Methoden sind mit einem Namen versehene Programmabschnitte besitzen Rückgabetyp, Namen, Parameterliste.
EDV1 - 06FelderPointer Felder, Zeichenketten, Pointer.
Arrays,Strings&Pointer in C/C++
Weiteres Programm Studium des Breitendurchlaufs Hierzu
Wir müssen also überlegen: Implementierung der Knoten, Implementierung der Kanten, daraus: Implementierung des Graphen insgesamt. Annahme: die Knoteninhalte.
Seite 1 Interface - Konzept Ein Interface führt einen neuen Datentyp ein: interface Frau {... } Das Interface enthält Deklarationen ( keine Definitionen.
Einfach verkettete Listen
Einführung in die Programmiersprache C 1
Informatik Grundlagen, WS04, Seminar 11
Einführung in die Programmiersprache C 3.Tag Institut für Mathematische Optimierung - Technische Universität Braunschweig.
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
1. Verhalten der Objekte: Operationen Werden in den Klassen definiert Werden (i.d.R.) auf einem Objekt aufgerufen Wird das Empfängerobjekt genannt Weitere.
Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Programmierung
Die Zählschleife int s = 0 for (int k=1; k
Informatik 1 Letzte Übung.
Dynamische Datentypen
Lindenmayer-Systeme: Fraktale rekursiv zeichnen
Ganze Zahlen Die Typen int, unsigned int; Auswertung arithmetischer Aus-drücke, arithmetische Operatoren.
C-Einstieg. Agenda 1Vorbereitung 2Aufbau eines Programms 2.1Header 2.2 Methoden 2.3Main 3Datentypen & Variablen 4Operatoren(+, -, *, /) 5Logik 5.1IF 5.2Switch.
Die Grundidee Funktionsaufruf Funktionsname (Kopf) Code der Funktion
Arrays / Felder Themen: Arrays / Felder / Vektoren Was soll das eigentlich? Erstellen von Arrays Arrays auslesen. Wie sie verwaltet werden.
Agenda für heute, 12. Mai, 2005 ProzedurenProzeduren Funktionsprozeduren Prozedurparameter Lokale und globale Variablen Datentypen: Ordinaltypen.
Programmieren in C Grundlagen C 2
1 // Laengste Zeile bestimmen // // Liest die Eingabe Zeichen fuer Zeichen, bis // das erscheint. // Die laengste Zeile wird ausgegeben (bei.
Informatik Beschreibung von Abläufen durch Algorithmen 3.3 Wiederholugnsanweisungen 3. Beschreibung von Abläufen durch Algorithmen 3.3 Wiederholungsanweisungen.
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.
1 // Verkettete Liste 2 // demonstriert verkettete Listen und // Rekursion // (Einfügen am "Fuß") // #include struct Liste { int Element; Liste *weiter;
Tutorium Software-Engineering SS14 Florian Manghofer.
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.
Funktionen (Zweck und Eigenschaften) Funktionen sind Unterprogramme, die einen bestimmten Zweck erfüllen Sie zerlegen Probleme in kleine, abgeschlossene.
Pointer. * und &  Bei der Definition int var1; ○ // „normale“ Variable int *var2; ○ // Zeiger auf einen Integer int *var2 = NULL; ○ // … incl. Initialisierung.
Programmieren in C Wie speichert C
Erstellen einer Powerpoint-Präsentation
Nksainf.ch/oinf.
Von Cem, Maurice und lars
 Präsentation transkript:

Funktionen, Felder und Parameter-übergabe

Funktionsaufruf mit Feld als Parameter: Parameter = Name des Feldes

Beispiel: ... int main(){ int v[3] = {10,20,30}; f(v); }

Intern bedeutet dies: Die Adresse des nullten Elements (Komponente) des Feldes wird an die Funktion übergeben.

Beispiel: ... int main(){ f(v); // gleichbedeutend mit: f(&v[0]); ... int v[3] = {10,20,30}; f(v); // gleichbedeutend mit: f(&v[0]); ... } Dies ist eine ADRESSE

Wie muss also der formale Parameter in der Definition der Funktion deklariert werden ?

int main(){ f(v); } //void f(int p[]){ int *p void f( ){ *(p+1) = 222; int v[3] = {10,20,30}; f(v); } Für Leute, die Pointer nicht mögen, gibt es eine alternative Syntax, in der mehr der Charakter des Feldes betont wird //void f(int p[]){ Dies ist ein POINTER auf einen integer int *p void f( ){ *p = 111; *(p+1) = 222; }

int main(){ f(v); } void f(int v[]){ *(p+1) = 222; } Die beiden Schreibweisen sind gleichwertig ... Und in der nächsten Folie gehen wir wieder zurück zur Pointerschreibweise ... void f(int v[]){ *p = 111; *(p+1) = 222; }

int main(){ f(v); } void f(int *p){ *(p+1) = 222; } int v[3] = {10,20,30}; f(v); } void f(int *p){ *p = 111; *(p+1) = 222; }

Was geschieht beim Ablauf des Programms ?

int main(){ f(v); } void f(int *p){ *(p+1) = 222; } int v[3]= {10,20,30}; f(v); } v[0] 0138 10 v[1] 0142 20 v[2] 0146 30 ... 0138 ... Aufgabe: Siehe Aufgabe 6 im Arbeitsblatt. Die Aufgabe wird gemeinsam besprochen. Frage: Welchen Wert bekommt p zugewiesen ? Antwort: Die Adresse von v, also 0138 Welchen Wert hat *p ? *p = *0138 = v[0] = 111 Welchen Wert hat *(p+1) ? *(p+1) = *(0138+1) = *0142 = v[1] = 222 void f(int *p){ *p = 111; *(p+1) = 222; }

int main(){ f(v); } void f(int *p){ *(p+1) = 222; } int v[3]= {10,20,30}; f(v); } v[0] 0138 10 v[1] 0142 20 v[2] 0146 30 ... ... 0138 Aufgabe: Siehe Aufgabe 6 im Arbeitsblatt. Die Aufgabe wird gemeinsam besprochen. Frage: Welchen Wert bekommt p zugewiesen ? Antwort: Die Adresse von v, also 0138 Welchen Wert hat *p ? *p = *0138 = v[0] = 111 Welchen Wert hat *(p+1) ? *(p+1) = *(0138+1) = *0142 = v[1] = 222 void f(int *p){ *p = 111; *(p+1) = 222; }

int main(){ f(v); } void f(int *p){ *(p+1) = 222; } int v[3]= {10,20,30}; f(v); } v[0] 0138 10 v[1] 0142 20 v[2] 0146 30 ... ... 0138 Aufgabe: Siehe Aufgabe 6 im Arbeitsblatt. Die Aufgabe wird gemeinsam besprochen. Frage: Welchen Wert bekommt p zugewiesen ? Antwort: Die Adresse von v, also 0138 Welchen Wert hat *p ? *p = *0138 = v[0] = 111 Welchen Wert hat *(p+1) ? *(p+1) = *(0138+1) = *0142 = v[1] = 222 void f(int *p){ *p = 111; *(p+1) = 222; }

int main(){ f(v); } void f(int *p){ *(p+1) = 222; } int v[3]= {10,20,30}; f(v); } v[0] 0138 10 v[1] 0142 20 v[2] 0146 30 ... ... 0138 Aufgabe: Siehe Aufgabe 6 im Arbeitsblatt. Die Aufgabe wird gemeinsam besprochen. Frage: Welchen Wert bekommt p zugewiesen ? Antwort: Die Adresse von v, also 0138 Welchen Wert hat *p ? *p = *0138 = v[0] = 111 Welchen Wert hat *(p+1) ? *(p+1) = *(0138+1) = *0142 = v[1] = 222 void f(int *p){ *p = 111; *(p+1) = 222; }

int main(){ f(v); } void f(int *p){ *(p+1) = 222; } int v[3]= {10,20,30}; f(v); } v[0] 0138 10 v[1] 0142 20 v[2] 0146 30 ... ... 0138 Aufgabe: Siehe Aufgabe 6 im Arbeitsblatt. Die Aufgabe wird gemeinsam besprochen. Frage: Welchen Wert bekommt p zugewiesen ? Antwort: Die Adresse von v, also 0138 Welchen Wert hat *p ? *p = *0138 = v[0] = 111 Welchen Wert hat *(p+1) ? *(p+1) = *(0138+1) = *0142 = v[1] = 222 void f(int *p){ *p = 111; *(p+1) = 222; }

int main(){ f(v); } void f(int *p){ *(p+1) = 222; } int v[3]= {10,20,30}; f(v); } v[0] 0138 10 v[1] 0142 20 v[2] 0146 30 ... ... 0138 Aufgabe: Siehe Aufgabe 6 im Arbeitsblatt. Die Aufgabe wird gemeinsam besprochen. Frage: Welchen Wert bekommt p zugewiesen ? Antwort: Die Adresse von v, also 0138 Welchen Wert hat *p ? *p = *0138 = v[0] = 111 Welchen Wert hat *(p+1) ? *(p+1) = *(0138+1) = *0142 = v[1] = 222 void f(int *p){ *p = 111; *(p+1) = 222; }

int main(){ f(v); } void f(int *p){ *(p+1) = 222; } int v[3]= {10,20,30}; f(v); } v[0] 0138 10 v[1] 0142 20 v[2] 0146 30 ... ... 0138 Aufgabe: Siehe Aufgabe 6 im Arbeitsblatt. Die Aufgabe wird gemeinsam besprochen. Frage: Welchen Wert bekommt p zugewiesen ? Antwort: Die Adresse von v, also 0138 Welchen Wert hat *p ? *p = *0138 = v[0] = 111 Welchen Wert hat *(p+1) ? *(p+1) = *(0138+1) = *0142 = v[1] = 222 void f(int *p){ *p = 111; *(p+1) = 222; }

int main(){ f(v); } void f(int *p){ *(p+1) = 222; } int v[3]= {10,20,30}; f(v); } v[0] 0138 10 v[1] 0142 20 v[2] 0146 30 ... ... 0138 Aufgabe: Siehe Aufgabe 6 im Arbeitsblatt. Die Aufgabe wird gemeinsam besprochen. Frage: Welchen Wert bekommt p zugewiesen ? Antwort: Die Adresse von v, also 0138 Welchen Wert hat *p ? *p = *0138 = v[0] = 111 Welchen Wert hat *(p+1) ? *(p+1) = *(0138+1) = *0142 = v[1] = 222 void f(int *p){ *p = 111; *(p+1) = 222; }

int main(){ f(v); } void f(int *p){ *(p+1) = 222; } int v[3]= {10,20,30}; f(v); } v[0] 0138 10 v[1] 0142 20 v[2] 0146 30 ... ... 0138 Aufgabe: Siehe Aufgabe 6 im Arbeitsblatt. Die Aufgabe wird gemeinsam besprochen. Frage: Welchen Wert bekommt p zugewiesen ? Antwort: Die Adresse von v, also 0138 Welchen Wert hat *p ? *p = *0138 = v[0] = 111 Welchen Wert hat *(p+1) ? *(p+1) = *(0138+1) = *0142 = v[1] = 222 void f(int *p){ *p = 111; *(p+1) = 222; }

int main(){ f(v); } void f(int *p){ *(p+1) = 222; } int v[3]= {10,20,30}; f(v); } v[0] 0138 10 v[1] 0142 20 v[2] 0146 30 ... 0138 ... 0138 void f(int *p){ *p = 111; *(p+1) = 222; } 0138

int main(){ f(v); } void f(int *p){ *(p+1) = 222; } int v[3]= {10,20,30}; f(v); } v[0] 0138 111 v[1] 0142 20 v[2] 0146 30 ... 0138 ... 0138 void f(int *p){ *p = 111; *(p+1) = 222; } 0138

int main(){ f(v); } void f(int *p){ *(p+1) = 222; } int v[3]= {10,20,30}; f(v); } v[0] 0138 111 v[1] 0142 20 v[2] 0146 30 ... 0138 ... 0138 void f(int *p){ *p = 111; *(p+1) = 222; } 0138 (0138+1 *4) =0142

int main(){ f(v); } void f(int *p){ *(p+1) = 222; } int v[3]= {10,20,30}; f(v); } v[0] 0138 111 v[1] 0142 222 v[2] 0146 30 ... 0138 ... 0138 Welche Art von Parameter ist p ? (i), (o), (i/o) void f(int *p){ *p = 111; *(p+1) = 222; } 0138 Ein Input-Output-Parameter, also (i/o) (0138+1 *4) =0142

Frage: Wie ist der Programmablauf beim Aufruf von f(&v[0])

Antwort: Wie beim Aufruf von f(v)

Frage: Wie ist der Programmablauf beim Aufruf von f(&v[1])

int main(){ f(&v[1]); } int *p void f( ){ *(p+1) = 222; } int v[3] = {10,20,30}; f(&v[1]); } int *p void f( ){ *p = 111; *(p+1) = 222; }

Was geschieht beim Ablauf des Programms ?

int main(){ f(&v[1]); } void f(int *p){ *(p+1) = 222; } int v[3]= {10,20,30}; f(&v[1]); } v[0] 0138 10 v[1] 0142 20 v[2] 0146 30 ... 0142 ... Aufgabe: Siehe Aufgabe 6 im Arbeitsblatt. Die Aufgabe wird gemeinsam besprochen. Frage: Welchen Wert bekommt p zugewiesen ? Antwort: Die Adresse von v, also 0138 Welchen Wert hat *p ? *p = *0138 = v[0] = 111 Welchen Wert hat *(p+1) ? *(p+1) = *(0138+1) = *0142 = v[1] = 222 void f(int *p){ *p = 111; *(p+1) = 222; }

int main(){ f(&v[1]); } void f(int *p){ *(p+1) = 222; } int v[3]= {10,20,30}; f(&v[1]); } v[0] 0138 10 v[1] 0142 20 v[2] 0146 30 ... ... 0142 Aufgabe: Siehe Aufgabe 6 im Arbeitsblatt. Die Aufgabe wird gemeinsam besprochen. Frage: Welchen Wert bekommt p zugewiesen ? Antwort: Die Adresse von v, also 0138 Welchen Wert hat *p ? *p = *0138 = v[0] = 111 Welchen Wert hat *(p+1) ? *(p+1) = *(0138+1) = *0142 = v[1] = 222 void f(int *p){ *p = 111; *(p+1) = 222; }

int main(){ f(&v[1]); } void f(int *p){ *(p+1) = 222; } int v[3]= {10,20,30}; f(&v[1]); } v[0] 0138 10 v[1] 0142 20 v[2] 0146 30 ... ... 0142 Aufgabe: Siehe Aufgabe 6 im Arbeitsblatt. Die Aufgabe wird gemeinsam besprochen. Frage: Welchen Wert bekommt p zugewiesen ? Antwort: Die Adresse von v, also 0138 Welchen Wert hat *p ? *p = *0138 = v[0] = 111 Welchen Wert hat *(p+1) ? *(p+1) = *(0138+1) = *0142 = v[1] = 222 void f(int *p){ *p = 111; *(p+1) = 222; }

int main(){ f(&v[1]); } void f(int *p){ *(p+1) = 222; } int v[3]= {10,20,30}; f(&v[1]); } v[0] 0138 10 v[1] 0142 20 v[2] 0146 30 ... ... 0142 Aufgabe: Siehe Aufgabe 6 im Arbeitsblatt. Die Aufgabe wird gemeinsam besprochen. Frage: Welchen Wert bekommt p zugewiesen ? Antwort: Die Adresse von v, also 0138 Welchen Wert hat *p ? *p = *0138 = v[0] = 111 Welchen Wert hat *(p+1) ? *(p+1) = *(0138+1) = *0142 = v[1] = 222 void f(int *p){ *p = 111; *(p+1) = 222; }

int main(){ f(&v[1]); } void f(int *p){ *(p+1) = 222; } int v[3]= {10,20,30}; f(&v[1]); } v[0] 0138 10 v[1] 0142 20 v[2] 0146 30 ... ... 0142 Aufgabe: Siehe Aufgabe 6 im Arbeitsblatt. Die Aufgabe wird gemeinsam besprochen. Frage: Welchen Wert bekommt p zugewiesen ? Antwort: Die Adresse von v, also 0138 Welchen Wert hat *p ? *p = *0138 = v[0] = 111 Welchen Wert hat *(p+1) ? *(p+1) = *(0138+1) = *0142 = v[1] = 222 void f(int *p){ *p = 111; *(p+1) = 222; }

int main(){ f(&v[1]); } void f(int *p){ *(p+1) = 222; } int v[3]= {10,20,30}; f(&v[1]); } v[0] 0138 10 v[1] 0142 20 v[2] 0146 30 ... ... 0142 Aufgabe: Siehe Aufgabe 6 im Arbeitsblatt. Die Aufgabe wird gemeinsam besprochen. Frage: Welchen Wert bekommt p zugewiesen ? Antwort: Die Adresse von v, also 0138 Welchen Wert hat *p ? *p = *0138 = v[0] = 111 Welchen Wert hat *(p+1) ? *(p+1) = *(0138+1) = *0142 = v[1] = 222 void f(int *p){ *p = 111; *(p+1) = 222; }

int main(){ f(&v[1]); } void f(int *p){ *(p+1) = 222; } int v[3]= {10,20,30}; f(&v[1]); } v[0] 0138 10 v[1] 0142 20 v[2] 0146 30 ... ... 0142 Aufgabe: Siehe Aufgabe 6 im Arbeitsblatt. Die Aufgabe wird gemeinsam besprochen. Frage: Welchen Wert bekommt p zugewiesen ? Antwort: Die Adresse von v, also 0138 Welchen Wert hat *p ? *p = *0138 = v[0] = 111 Welchen Wert hat *(p+1) ? *(p+1) = *(0138+1) = *0142 = v[1] = 222 void f(int *p){ *p = 111; *(p+1) = 222; }

int main(){ f(&v[1]); } void f(int *p){ *(p+1) = 222; } int v[3]= {10,20,30}; f(&v[1]); } v[0] 0138 10 v[1] 0142 20 v[2] 0146 30 ... ... 0142 Aufgabe: Siehe Aufgabe 6 im Arbeitsblatt. Die Aufgabe wird gemeinsam besprochen. Frage: Welchen Wert bekommt p zugewiesen ? Antwort: Die Adresse von v, also 0138 Welchen Wert hat *p ? *p = *0138 = v[0] = 111 Welchen Wert hat *(p+1) ? *(p+1) = *(0138+1) = *0142 = v[1] = 222 void f(int *p){ *p = 111; *(p+1) = 222; }

int main(){ f(&v[1]); } void f(int *p){ *(p+1) = 222; } int v[3]= {10,20,30}; f(&v[1]); } v[0] 0138 10 v[1] 0142 20 v[2] 0146 30 ... ... 0142 Aufgabe: Siehe Aufgabe 6 im Arbeitsblatt. Die Aufgabe wird gemeinsam besprochen. Frage: Welchen Wert bekommt p zugewiesen ? Antwort: Die Adresse von v, also 0138 Welchen Wert hat *p ? *p = *0138 = v[0] = 111 Welchen Wert hat *(p+1) ? *(p+1) = *(0138+1) = *0142 = v[1] = 222 void f(int *p){ *p = 111; *(p+1) = 222; }

int main(){ f(&v[1]); } void f(int *p){ *(p+1) = 222; } int v[3]= {10,20,30}; f(&v[1]); } v[0] 0138 10 v[1] 0142 20 v[2] 0146 30 ... ... 0142 Aufgabe: Siehe Aufgabe 6 im Arbeitsblatt. Die Aufgabe wird gemeinsam besprochen. Frage: Welchen Wert bekommt p zugewiesen ? Antwort: Die Adresse von v, also 0138 Welchen Wert hat *p ? *p = *0138 = v[0] = 111 Welchen Wert hat *(p+1) ? *(p+1) = *(0138+1) = *0142 = v[1] = 222 void f(int *p){ *p = 111; *(p+1) = 222; }

int main(){ f(&v[1]); } void f(int *p){ *(p+1) = 222; } int v[3]= {10,20,30}; f(&v[1]); } v[0] 0138 10 v[1] 0142 20 v[2] 0146 30 ... ... 0142 Aufgabe: Siehe Aufgabe 6 im Arbeitsblatt. Die Aufgabe wird gemeinsam besprochen. Frage: Welchen Wert bekommt p zugewiesen ? Antwort: Die Adresse von v, also 0138 Welchen Wert hat *p ? *p = *0138 = v[0] = 111 Welchen Wert hat *(p+1) ? *(p+1) = *(0138+1) = *0142 = v[1] = 222 void f(int *p){ *p = 111; *(p+1) = 222; }

int main(){ f(&v[1]); } void f(int *p){ *(p+1) = 222; } int v[3]= {10,20,30}; f(&v[1]); } v[0] 0138 10 v[1] 0142 20 v[2] 0146 30 ... ... 0142 Aufgabe: Siehe Aufgabe 6 im Arbeitsblatt. Die Aufgabe wird gemeinsam besprochen. Frage: Welchen Wert bekommt p zugewiesen ? Antwort: Die Adresse von v, also 0138 Welchen Wert hat *p ? *p = *0138 = v[0] = 111 Welchen Wert hat *(p+1) ? *(p+1) = *(0138+1) = *0142 = v[1] = 222 void f(int *p){ *p = 111; *(p+1) = 222; }

int main(){ f(&v[1]); } void f(int *p){ *(p+1) = 222; } int v[3]= {10,20,30}; f(&v[1]); } v[0] 0138 10 v[1] 0142 20 v[2] 0146 30 ... ... 0142 Aufgabe: Siehe Aufgabe 6 im Arbeitsblatt. Die Aufgabe wird gemeinsam besprochen. Frage: Welchen Wert bekommt p zugewiesen ? Antwort: Die Adresse von v, also 0138 Welchen Wert hat *p ? *p = *0138 = v[0] = 111 Welchen Wert hat *(p+1) ? *(p+1) = *(0138+1) = *0142 = v[1] = 222 void f(int *p){ *p = 111; *(p+1) = 222; }

int main(){ f(&v[1]); } void f(int *p){ *(p+1) = 222; } int v[3]= {10,20,30}; f(&v[1]); } v[0] 0138 10 v[1] 0142 20 v[2] 0146 30 ... 0142 ... 0142 Aufgabe: Siehe Aufgabe 6 im Arbeitsblatt. Die Aufgabe wird gemeinsam besprochen. Frage: Welchen Wert bekommt p zugewiesen ? Antwort: Die Adresse von v, also 0138 Welchen Wert hat *p ? *p = *0138 = v[0] = 111 Welchen Wert hat *(p+1) ? *(p+1) = *(0138+1) = *0142 = v[1] = 222 void f(int *p){ *p = 111; *(p+1) = 222; } 0142

int main(){ f(&v[1]); } void f(int *p){ *(p+1) = 222; } int v[3]= {10,20,30}; f(&v[1]); } v[0] 0138 10 v[1] 0142 20 v[2] 0146 30 ... 0142 ... 0142 void f(int *p){ *p = 111; *(p+1) = 222; } 0142

int main(){ f(&v[1]); } void f(int *p){ *(p+1) = 222; } int v[3]= {10,20,30}; f(&v[1]); } v[0] 0138 10 v[1] 0142 111 v[2] 0146 30 ... 0142 ... 0142 void f(int *p){ *p = 111; *(p+1) = 222; } 0142

int main(){ f(&v[1]); } void f(int *p){ *(p+1) = 222; } int v[3]= {10,20,30}; f(&v[1]); } v[0] 0138 10 v[1] 0142 111 v[2] 0146 30 ... 0142 ... 0142 void f(int *p){ *p = 111; *(p+1) = 222; } 0142 (0142+1 *4) =0146

int main(){ f(&v[1]); } void f(int *p){ *(p+1) = 222; } int v[3]= {10,20,30}; f(&v[1]); } v[0] 0138 10 v[1] 0142 111 v[2] 0146 222 ... 0142 ... 0142 void f(int *p){ *p = 111; *(p+1) = 222; } 0142 (0142+1 *4) =0146

Aufgabe:

Erstellen Sie die Funktion reset, die eine bestimmte Anzahl sich hintereinander befindlicher Elemente eines Integer-Feldes auf 0 setzt. Testen Sie danach die Funktion in einem Programm.

// includes vorher einfügen const int len = 10; void reset1(int // includes vorher einfügen const int len = 10; void reset1(int *p, int von, int bis); int main(){ int zahlen[len]; int i; // Feld irgendwie füllen for(i=0;i<len;i++){ zahlen[i] = 10+2*i; }

Geben Sie die einzelnen Elemente des Feldes an: 10 12 14 16 18 20 22 24 26 28

// Feld ausdrucken for(i=0;i<len;i++){ printf("%d ",zahlen[i]); } printf("\n"); reset1(zahlen, 3, 7); // Feld ausdrucken for(i=0;i<len;i++){ printf("%d ",zahlen[i]); } }

void reset1(int *p, int von, int bis){ int i; for(i=von; i<=bis; i++){ *(p+i)=0; } }

Geben Sie die einzelnen Elemente des Feldes an: 10 12 14 26 28

Weitere mögliche Lösung:

void reset2(int. p, int anz){ int i; for(i=0; i<anz; i++){ void reset2(int *p, int anz){ int i; for(i=0; i<anz; i++){ *(p+i)=0; } }

int main(){ // ... // statt // reset1(zahlen, 3, 7); // alternativ: reset2( ); // ... }

Weitere mögliche Lösung:

void reset3(int. von, int. bis){ while(von <= bis){ void reset3(int *von, int *bis){ while(von <= bis){ *von=0; von=von+1; } }

int main(){ // ... // statt // reset1(zahlen, 3, 7); // alternativ: reset3( } &zahlen[3], &zahlen[7] );

void reset3(int. von, int. bis){ while(von <= bis){ void reset3(int *von, int *bis){ while(von <= bis){ *von=0; von=von+1; } } Wie müssen die Adressen der Feldelemente organisiert sein, damit diese Lösung funktioniert? Adresse Feldelement 0 < Adresse Feldelement 1 < Adresse Feldelement 2 < …

Aufgabe:

Verändern Sie die Funktion reset1 so, dass der Programmierer, der sie verwendet, bestimmen kann, auf welchen Wert (nicht nur 0), die Elemente gesetzt werden sollen. Die veränderte Funktion soll reset1a heissen.

void reset1a(int *p, int von, int bis, int wert){ int i; for(i=von; i<=bis; i++){ *(p+i)=wert; } }

Alternative Syntax bei der Definition einer Funktion mit einem Feld als Parameter

z.B. ist gleichbedeutend mit int main(){ int v[3] = {10,20,30}; f(v); } p[1] z.B. ist gleichbedeutend mit *(p+1) Dies gilt NUR innerhalb der Definition (Implementierung) der Funktion (unten). void f(int p[]){ p[0]= 111; // *p=111 p[1]= 222; // *(p+1)=222 }

Funktionsaufruf mit Feld als reinem Input-Parameter.

Aufgabe: Erzeugen Sie eine Funktion mit einem Feld als Parameter Aufgabe: Erzeugen Sie eine Funktion mit einem Feld als Parameter. Das Feld soll nur daraufhin überprüft werden, ob seine Elemente positive Werte haben.

int istPositiv(int v[], int anz){ int i=0; while(i<anz){ if(v[i]<0) return(-1); i=i+1; } return(0); } Welche Art von Parameter ist das Feld v ? (i), (o), (i/o) Ein reiner Input-Parameter, also (i) v[i] = v[i+1]; Ein unkonzentrierter Programmierer könnte z.B. folgendes machen: Welche Art von Parameter ist dann das Feld v ? v ist dann ein (i/o)-Parameter.

// Hier ist noch das // Hauptprogramm int main(){ int erg; int w[4]={11,12,-6,9}; erg=istPositiv(w,4); printf("erg=%d\n",erg); return(0); } Welchen Wert hat erg ? erg hat den Wert –1, da mindestens ein Element einen negativen Wert hat.

Um ein Feld als reinen Input-Parameter (read-only- Speicher) zu benutzen, d.h. es (schreibgeschützt) gegen Veränderungen durch den Programmierer zu schützen, kann man den Parameter mit const als eine Konstante deklarieren.

int istPositiv(const int v[], int anz){ int i=0; while(i<anz){ if(v[i]<0) return(-1); i=i+1; } return(0); } Was würde mit einem unkonzentrierten Programmierer passieren, wenn er folgendes macht: v[i] = v[i+1]; Er bekommt eine Fehlermeldung des Compilers.

int istPositiv(const int v[], int anz){ int i=0; while(i<anz){ if(v[i]<0) return(-1); i=i+1; } return(0); } const Welchen Parameter könnte man auch noch schreibschützen? Was müsste man dazu tun? while(anz>1) anz=anz+1; Ist dies sinnvoll? Da anz kein Pointer, kann sein Wert doch nach außen nicht geändert werden. Endlosschleife, deswegen sinnvoll Diesen Input-Parameter

Aufgabe: Erzeugen Sie eine Funktion, die ein Integer-Feld der Länge 2 der Größe nach aufsteigend sortiert. 2 Lösungsvarianten machen

1. Lösung

void my1Sort2(const int vI[], int vO[]){ if(vI[0]<vI[1]){ vO[0]=vI[0]; vO[1]=vI[1]; } else{ vO[0]=vI[1]; vO[1]=vI[0]; } } Welche Art von Parameter ist das Feld vI und vO ? (i), (o), (i/o) vI : (i), also reiner Input-Parameter vO : (o), also reiner Output-Parameter

2. Lösung

void my2Sort2(int v[]){ int temp0, temp1; temp0=v[0]; temp1=v[1]; if(v[0]>v[1]){ v[0]=temp1; v[1]=temp0; } } Welche Art von Parameter ist das Feld v ? (i), (o), (i/o) v : (i/o), also Input- und Output-Parameter

Welche Zusicherung muss an die Input-Parameter gemacht werden:

Sie müssen die Länge 2 haben.