6. Zeiger Allgemeines Definition eines Zeigers

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

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

2. Programmierung in C

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

Inhalt. 4.5 Arbeit mit Zeigern (engl. Pointer)

F Zeiger, Felder und Strukturen in C

Zeiger (engl. Pointer)

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

einlesen n > 0? Ausgabe Negative Zahl

C kompakt für Java-Programmierer

1. Das erste Programm

Teil 5: Zeiger, Felder, Zeichenketten Gliederung

Hydroinformatik I: Referenzen und Zeiger

GI Vektoren

Zeiger: Der Adressoperator &

Programmierung mit C Zeiger

Übungspaket 14 Eindimensionale Arrays

Felder, Zeiger und Adreßrechnung

Grundlagen der Programmierung

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

Arrays (Felder/Vektoren)

8. Referenzen und Zeiger

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

Grundlagen der Programmierung

Das folgende Programm demonstriert, wie man Speicheradressen von Variablen ermittelt.

Arrays, Zeiger und Funktionen (call by reference)

Physische Datenstrukturen

C++ - Objektorientierte Programmierung Konstante und statische Elemente

Zusammenfassung des Handzettels für Programmieren in C

Hydroinformatik I: Referenzen und Zeiger

Einführung in die Programmierung zusammengesetzte Datentypen, dynamischer Speicher

Typ : void* aktuelle Parameter Pointer von beliebigem Typ

Wertebereich und Genauigkeit der Zahlendarstellung

2. Programmierung in C

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

zu große Programme (Bildschirmseite!) zerlegen in (weitgehend) unabhängige Einheiten: Unterprogramme

zu große Programme (Bildschirmseite!) zerlegen in (weitgehend) unabhängige Einheiten: Unterprogramme

9 Zeiger (Pointer). Dynamischer Speicher

C++ - Objektorientierte Programmierung Konstruktoren und Destruktoren

Tutorium Informatik 1. Aufgabe 2: Formatierte Ein- und Ausgabe

Felder (1) Allgemeines

Datei: svn/ckurs/trunk/c_texte/c_arrptr.txt, Datum: 30. Juni Felder und Zeiger

1 Vom Problem zum Programm

Inhalt. 1 Einstieg in die Welt von C Erste Schritte in C 31. Vorwort... 15

Dynamische Speicherverwaltung

Eine praktische Einführung in die Programmierung mit der Programmiersprache C

Viel Erfolg bei der Bearbeitung der Aufgaben!

Einführung in die Programmierung für NF MI. Übung 04

Dynamische Speicherverwaltung

Einführung in die Programmiersprache C

Felder, Rückblick Mehrdimensionale Felder. Programmieren in C

Grundlagen der OO- Programmierung in C#

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

5. Übung - Kanalkodierung/Programmierung

Grundlagen der Programmiersprache C++

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

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

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

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

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

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

Inhalt. Peter Sobe 63. Felder in C

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

Dr. Monika Meiler. Inhalt

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

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

Arrays. Einleitung. Deklarieren einer Array Variablen

Kapitel 4: Zeiger. Inhalt. Zeiger Zeigerarithmetik

Software Entwicklung 1

C- Kurs 07 Höhere Datentypen

Programmiersprachen Einführung in C

float *point(float a, float b); // Funktionsdeklaration Zeiger als Funktionswert // point liefert als Wert die Adresse seines Ergebnisses

Algorithmen und ihre Programmierung

Algorithmen und Datenstrukturen

Einführung in die Programmierung für NF MI. Übung 07

Deklarationen in C. Prof. Dr. Margarita Esponda

4.2 Programmiersprache C

C-Programmierung: Ausdrücke und Operatoren#Division.2F

VDK-Informatik

Felder (1) Felder (Arrays) speichern viele Datenelemente des gleichen Typs. Auf einzelne Elemente kann über einen Index zugegriffen werden

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

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

Übungspaket 20 Zeiger und Zeigervariablen

Elementare Datentypen in C++

2. Programmierung in C

Programmierkurs C++ Datenstrukturen Seite 1

Kapitel 7. Zusammengesetzte Datentypen, Vektoren, Zeichenketten

Angewandte Mathematik und Programmierung

Vorlesung Programmieren

Prozeduren und Funktionen

Vorkurs C++ Programmierung

Programmieren in C/C++ und MATLAB

Nachname:... Vorname:... MatrNr.:... Klausur PR2. int main() { char Text[] = "Sehr geehrte Damen und Herren!"; char *tmp=text;

Einstieg in die Informatik mit Java

Zeiger in C. Thomas Mechelke August 2011

5 DATEN Variablen. Variablen können beliebige Werte zugewiesen und im Gegensatz zu

Crashkurs C++ - Teil 1

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

Unterprogramme, Pointer und die Übergabe von Arrays

2. Programmierung in C

Transkript:

6. Zeiger www.c-programme.de Stefan Thiemert Kapitel 6 - Seite 1 von 6 6. 1. Allgemeines Zeiger spielen in der Programmierung eine wichtige Rolle. Sie sind wichtig, bei der Arbeit mit Arrays und Funktionen. Ein Zeiger ist eine Variable, deren Inhalt die Adresse einer anderen Variable im Hauptspeicher des Computers ist. Mit dieser Adresse kann man auf die Variable zugreifen. Die folgende Abbildung soll dies noch einmal verdeutlichen: Der Zeiger z zeigt hierbei im Hauptspeicher auf die Variable b. Bei der Arbeit mit Zeigern benötigen wir 2 Operatoren: & * Adreßoperator, wird vor die Variable geschrieben und liefert die Adresse der Variable zurück (siehe Funktion scanf!) Verweisoperator, wird vor den Zeiger geschrieben und liefert den Wert der Variable zurück, auf die der Zeiger gerichtet ist. 6. 2. Definition eines Zeigers Ein Zeiger wird folgendermaßen definiert: datentyp *zeigername; Zu beachten ist dabei, daß der Zeiger immer nur auf Variablen vom angegebenen Datentyp zugreifen kann. Hat der Zeiger beispielsweise den Datentyp int, so kann er nicht auf Variablen vom Datentyp float zeigen. Es besteht wiederum die Möglichkeit, daß mehrere Zeiger vom gleichen Datentyp hintereinander definiert werden. Das kennst Du aber schon von der Definition von einfachen Variablen.

6. 3. Zugriff auf Zeiger www.c-programme.de Stefan Thiemert Kapitel 6 - Seite 2 von 6 6. 3. 1. Adresse zuweisen Auf einen Zeiger kann auf 3 Arten zugegriffen werden. Man kann dem Zeiger die Adresse einer Variablen zuweisen, man kann die Adresse, auf die der Zeiger zeigt, auslesen und den Wert der Variablen, auf die der Zeiger zeigt, auslesen. Man weist einem Zeiger folgendermaßen eine Adresse zu: zeiger = &variablen; Dem Zeiger wird also die Adresse der Variablen zugewiesen. 6. 3. 2. Adresse auslesen Um die Adresse, auf die der Zeiger zeigt, auszulesen, gibt man einfach nur den Zeigernamen an. Um die Adresse auszugeben, benötigst Du in der Funktion printf() den Formatstring %p (p = pointer, engl. Zeiger). Die Adresse wird in hexadezimaler Form ausgegeben. Hexadezimale Zahlen werden folgendermaßen in das duale Zahlensystem umgerechnet: 0 = 0 1 = 1 2 = 2 3 = 3 4 = 4 5 = 5 6 = 6 7 = 7 8 = 8 9 = 9 A = 10 B = 11 C = 12 D = 13 E = 14 F = 15 Die Zahlen werden von rechts nach links betrachtet. Die erste Zahl wird mit 1 multipliziert, die zweite mit 16, die dritte mit 16*16 usw. Die Produkte werden miteinander addiert und damit hat man die hexadezimale Zahl in eine Zahl zur Basis 2 umgerechnet. Bei einer Zahl FF32D wird also folgendermaßen gerechnet: 15*65536 + 15*4096 + 3*256 + 2*16 + 13*1 = 1045293 Wenn der Zeiger also die Adresse FF32D hat, so zeigt er auf die Adresse 1045293.

6. 3. 3. Wert der Adresse auslesen www.c-programme.de Stefan Thiemert Kapitel 6 - Seite 3 von 6 Wenn Du den Wert der Variablen, auf deren Adresse der Zeiger gerichtet ist, auslesen möchtest, so mußt Du den Verweisoperator vor den Zeigernamen setzen: *zeigername Diese Zeichenkette kannst Du wiederum in eine printf() - Anweisung einbinden. Du hast außerdem die Möglichkeit, den Wert der Variablen zu ändern. Wenn beispielsweise der Zeiger z auf die Variable v zeigt, so kann man den Wert der Variablen auch folgendermaßen ändern: *z = neuerwert; Der Variable v wurde also ein neuer Wert zugewiesen. 6. 4. Zeiger in Funktionen Wie schon in Kapitel 5.5 erwähnt, werden die Werte von Parametern in Funktionen nicht geändert, auch wenn man es scheinbar tut. Hat man dies aber vor, so kann man statt der Variablen, Zeiger auf diese Variablen übergeben. Dann ist es möglich, die Werte der Parameter zu ändern. Bei der Definition der Funktion muß der Zeiger in der Parameterliste eingetragen werden: rückgabewert funktionsname(datentyp *zeigername) In der Funktion kann man auf den Wert der Variable mittels Verweisoperator * zugreifen. Im Hauptprogramm sieht der Aufruf der Funktion dann folgendermaßen aus: funktionsname(zeigername); Du hast auch die Möglichkeit, gleich die Adresse der Variablen zu übergeben. Du benötigst dann nicht extra einen Zeiger.Der Aufruf sieht dann folgendermaßen aus: funktionsname(&variablenname); Es wird also die Adresse übergeben, was ja einem Zeiger entspricht.

6. 5. Zeiger auf Arrays www.c-programme.de Stefan Thiemert Kapitel 6 - Seite 4 von 6 In Kapitel 4 wurden für die einzelnen Feldelemente von Arrays Indizes benutzt. Alternativ dazu kann man auch Zeiger benutzen. Dazu wird zuerst ein Feld definiert: datentyp feldname[groesse]; Zusätzlich wird ein Zeiger definiert, der auf den gleichen Datentyp zeigen kann: datentyp *zeigername; Dieser Zeiger wird nun auf das Array gesetzt: zeigername = feldname; Diese Zeile bewirkt, daß der Zeiger auf das 1. Feldelement zeigt, also feldname[0]. Will man nun auf eines der Feldelemente zugreifen, so mußt man einfach den Index zum Zeiger hinzu addieren. *(zeigername + 3) = 10; würde dann also bewirken, daß feldname[3] den Wert 10 zugewiesen bekommen würde. 6. 6. Anwendung von Zeigern: dynamische Speicherplatzzuweisung Bei Feldern hatten wir bisher nur die Möglichkeit, die Größe am Beginn des Programms festzulegen. Dies bringt Nachteile mit sich, wenn man nicht so viele Feldelemente benötigt, oder noch schlimmer, wenn man mehr benötigt, als man vorher festgelegt hat. Dazu benutzt man die Funktion malloc(). Diese Funktion legt die Größe während des Programmablaufs fest. Wenn man beispielsweise eine Variable vom Typ Integer definiert, so wird im Hauptspeicher Platz in der Größe von 2 Byte reserviert. Genau dies macht auch die Funktion malloc(). Als erstes wird ein Zeiger definiert: datentyp *zeigername; Die Funktion malloc() wird dann wie folgt aufgerufen: zeigername = (datentyp *) malloc (groesse * sizeof(datentyp));

www.c-programme.de Stefan Thiemert Kapitel 6 - Seite 5 von 6 Die Funktion sizeof() liefert den benötigten Speicherplatz für den jeweiligen Datentyp zurück. Im Fall Integer wäre dies also 2. Den Zeiger zeigername kannst Du nun wie einen normalen Zeiger auf ein Array benutzen. Das hast Du ja schon in Kapitel 6.5 gelernt. Wenn Du mit der Verarbeitung fertig bist, so mußt Du den Speicher wieder freigeben. Dies tust Du mit der Funktion free(). Sie wird folgendermaßen aufgerufen: free(zeigername); Wichtig! Um die Funktion malloc() benutzen zu können, mußt Du die vordefinierte Bibliothek malloc.h mit #include einbinden. 6. 7. Aufgaben 1. Schreib ein Programm, das eine beliebige Anzahl von Noten einliest. Die Anzahl soll bei Programmstart vom Nutzer abgefragt werden. Das Programm soll folgende Aufgaben erfüllen: Einlesen der Noten Bestimmen von Minimum und Maximum Berechnung des Durchschnittswertes Anzeigen einer Liste aller Noten mit Durchschnitt, Minimum und Maximum Realisiere das ganze Programm mit einem Zeiger und dynamischer Speicherplatzzuweisung. Lösungsvorschlag: lsg_6_1.c 1330 Byte 04. 06. 2001 2. Schreib eine Funktion tausch, welche zwei übergebene ganze Zahlen vertauscht. Schreib ein dazugehöriges Hauptprogramm zum testen. Hinweis: Übergib statt der beiden ganzen Zahlen die Adressen der beiden Zahlen und arbeite dann mit den Zeigern. Lösungsvorschlag: lsg_6_2.c 479 Byte 04. 06. 2001

3. Gegeben sind 2 Integervariablen: www.c-programme.de Stefan Thiemert Kapitel 6 - Seite 6 von 6 Name: zahl1 Name: zahl2 Wert: 5 Wert: 10 Adresse: FD00 Adresse: FD02 Schreib nach jedem Schritt auf, welche Werte sich ändern: a) zeiger1 = &zahl1; b) zeiger2 = &zahl2; c) *zeiger1+=20; d) *zeiger2-=3; e) *zeiger1 = *zeiger2 + 5; f) *zeiger2 = *zeiger1 - zahl2; Lösung: lsg_6_3.txt 182 Byte 04. 06. 2001