Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
Vorwort
Vorwort des Gutachters
1 Einstieg in C
2 Das erste Programm
3 Grundlagen
4 Formatierte Ein-/Ausgabe mit »scanf()« und »printf()«
5 Basisdatentypen
6 Operatoren
7 Typumwandlung
8 Kontrollstrukturen
9 Funktionen
10 Präprozessor-Direktiven
11 Arrays
12 Zeiger (Pointer)
13 Kommandozeilenargumente
14 Dynamische Speicherverwaltung
15 Strukturen
16 Ein-/Ausgabe-Funktionen
17 Attribute von Dateien und das Arbeiten mit Verzeichnissen (nicht ANSI C)
18 Arbeiten mit variabel langen Argumentlisten – <stdarg.h>
19 Zeitroutinen
20 Weitere Headerdateien und ihre Funktionen (ANSI C)
21 Dynamische Datenstrukturen
22 Algorithmen
23 CGI mit C
24 MySQL und C
25 Netzwerkprogrammierung und Cross–Plattform-Entwicklung
26 Paralleles Rechnen
27 Sicheres Programmieren
28 Wie geht’s jetzt weiter?
A Operatoren
B Die C-Standard-Bibliothek
Stichwort

Buch bestellen
Ihre Meinung?

Spacer
<< zurück
C von A bis Z von Jürgen Wolf
Das umfassende Handbuch
Buch: C von A bis Z

C von A bis Z
3., aktualisierte und erweiterte Auflage, geb., mit CD und Referenzkarte
1.190 S., 39,90 Euro
Rheinwerk Computing
ISBN 978-3-8362-1411-7
Pfeil 12 Zeiger (Pointer)
Pfeil 12.1 Zeiger deklarieren
Pfeil 12.2 Zeiger initialisieren
Pfeil 12.2.1 Speichergröße von Zeigern
Pfeil 12.3 Zeigerarithmetik
Pfeil 12.4 Zeiger, die auf andere Zeiger verweisen
Pfeil 12.4.1 Subtraktion zweier Zeiger
Pfeil 12.5 Typensicherung bei der Dereferenzierung
Pfeil 12.6 Zeiger als Funktionsparameter (call–by–reference)
Pfeil 12.6.1 Zeiger als Rückgabewert
Pfeil 12.7 Array und Zeiger
Pfeil 12.8 Zeiger auf Strings
Pfeil 12.8.1 Zeiger auf konstante Objekte (Read-only-Zeiger)
Pfeil 12.9 Zeiger auf Zeiger und Stringtabellen
Pfeil 12.9.1 Stringtabellen
Pfeil 12.10 Zeiger auf Funktionen
Pfeil 12.11 void-Zeiger
Pfeil 12.12 Äquivalenz zwischen Zeigern und Arrays
Pfeil 12.13 Der »restrict«-Zeiger


Rheinwerk Computing - Zum Seitenanfang

12.4 Zeiger, die auf andere Zeiger verweisen Zur nächsten ÜberschriftZur vorigen Überschrift

Zeiger können letztendlich auch auf andere Zeiger verweisen:

int *ptr1;
int *ptr2;

ptr1 = ptr2;

In diesem Fall zeigen beide Zeiger auf dieselbe Adresse. Dies ist ein wenig verwirrend. Daher folgt ein kleines Beispiel dazu:

/* ptr8.c */
#include <stdio.h>
#include <stdlib.h>

int main(void) {
   int wert=10;
   int *ptr1;
   int *ptr2;

   ptr1 = &wert;
   ptr2 = ptr1;

   printf("ptr1 verweist auf %p\n", ptr1);
   printf("Wert in %p ist %d\n\n", ptr1, *ptr1);

   printf("ptr2 verweist auf %p\n", ptr2);
   printf("Wert in %p ist %d\n\n", ptr2, *ptr2);

   printf("Adresse von ptr1 : %p\n", &ptr1);
   printf("Adresse von ptr2 : %p\n", &ptr2);
   printf("Adresse von wert : %p\n\n", &wert);

   printf("ptr1 [%p] -> [%p] = [%d]\n", &ptr1, ptr1, *ptr1);

   printf("ptr2 [%p] -> [%p] = [%d]\n", &ptr2, ptr2, *ptr2);
   return EXIT_SUCCESS;
}

Bei diesem Programm verweisen beide Zeiger auf denselben Wert (genauer gesagt auf dieselbe Adresse), nämlich auf die Adresse der Variablen wert. Mit ptr2 = ptr1 bekommt ptr2 dieselbe Adresse zugewiesen, auf die schon ptr1 zeigt. Auffällig ist hierbei auch, dass kein Adressoperator verwendet wird. Dieser wird nicht benötigt, da der Wert eines Zeigers schon eine Adresse ist und ein Zeiger auch einen Wert als Adresse erwartet.

Würde jetzt

*ptr1 = 11;

im Programm eingefügt, würde der Wert der Variablen wert auf 11 geändert, und somit wäre die Ausgabe des Programms immer 11. Falls Sie

wert = 20;

schreiben, werden auch die beiden Zeiger (mit Verwendung des Dereferenzierungsoperators) 20 ausgeben, da die Zeiger ja weiterhin auf die Speicheradresse der Variablen wert zeigen.

Abbildung 12.10 Ein Zeiger bekommt die Adresse eines anderen Zeigers.


Rheinwerk Computing - Zum Seitenanfang

12.4.1 Subtraktion zweier Zeiger topZur vorigen Überschrift

In der Standard-Headerdatei <stddef.h> befindet sich ein primitiver Datentyp ptrdiff_t, der meist mit int deklariert ist. Dieser wird verwendet, um das Ergebnis aus der Subtraktion zweier Zeiger zurückzugeben. Diese Subtraktion wird verwendet, um zu berechnen, wie weit zwei Zeiger zum Beispiel in einem Vektorelement voneinander entfernt sind. Näheres über den Zusammenhang von Arrays bzw. Strings und Zeigern können Sie in Abschnitt 12.7 lesen. Hier sehen Sie ein einfaches Listing:

/* ptr9.c */
#include <stdio.h>
#include <stddef.h>  /* für ptrdiff_t */
#include <stdlib.h>

int main(void) {
   char *ptr1, *ptr2;
   ptrdiff_t diff; /* Primitiver Datentyp */
   char string[] = { "Hallo Welt\n" };

   /* ptr2 auf Anfangsadresse von string */
   ptr2 = string;
   /* ptr1 6 Bytes weiter von der Adresse ptr2 platzieren */
   ptr1 = ptr2 + 6;
   /* Wie weit liegen beide Zeiger voneinander entfernt? */
   diff = ptr1-ptr2;
   // Nach dem neuen C99-Standard können Sie die formatierte
   // Ausgabe auch mit dem Argumenttyp-Modifikator t für
   // ptrdiff_t verwenden, also %td anstatt %d.
   printf("Differenz der beiden Zeiger : %d Bytes\n",diff);
   printf("%s",ptr1);  /* Welt */
   printf("%s",ptr2);  /* Hallo Welt */
   return EXIT_SUCCESS;
}

Mit der Zeile

ptr1 = ptr2 + 6;

lassen Sie den Zeiger ptr1 auf die Adresse string[6] zeigen. ptr2 zeigt hingegen weiterhin auf die Anfangsadresse des Strings (string[0]). Die Differenz dieser beiden Zeiger beträgt 6 Bytes, da diese so weit voneinander entfernt sind.



Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen. >> Zum Feedback-Formular
<< zurück
  
  Zum Katalog
Zum Katalog: C von A bis Z

 C von A bis Z
Jetzt bestellen


 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchtipps
Zum Katalog: C/C++






 C/C++


Zum Katalog: Einstieg in C






 Einstieg in C


Zum Katalog: Schrödinger programmiert C++






 Schrödinger
 programmiert C++


Zum Katalog: C++ Handbuch






 C++ Handbuch


Zum Katalog: IT-Handbuch für Fachinformatiker






 IT-Handbuch für
 Fachinformatiker


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo




Copyright © Rheinwerk Verlag GmbH 2009
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Rheinwerk Computing]

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de