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

 << zurück
C von A bis Z von Jürgen Wolf
Das umfassende Handbuch für Linux, Unix und Windows
– 2., aktualisierte und erweiterte Auflage 2006
Buch: C von A bis Z

C von A bis Z
1.116 S., mit CD, Referenzkarte, 39,90 Euro
Galileo Computing
ISBN 3-89842-643-2
gp Kapitel 14 Zeiger (Pointer)
  gp 14.1 Zeiger deklarieren
  gp 14.2 Zeiger initialisieren
    gp 14.2.1 Speichergröße von Zeigern
  gp 14.3 Zeigerarithmetik
  gp 14.4 Zeiger, die auf andere Zeiger verweisen
    gp 14.4.1 Subtraktion zweier Zeiger
  gp 14.5 Typensicherung bei der Dereferenzierung
  gp 14.6 Zeiger als Funktionsparameter (call–by–reference)
    gp 14.6.1 Zeiger als Rückgabewert
  gp 14.7 Array und Zeiger
  gp 14.8 Zeiger auf Strings
    gp 14.8.1 Zeiger auf konstante Objekte (Read-only-Zeiger)
  gp 14.9 Zeiger auf Zeiger und Stringtabellen
    gp 14.9.1 Stringtabellen
  gp 14.10 Zeiger auf Funktionen
  gp 14.11 void-Zeiger
  gp 14.12 Äquivalenz zwischen Zeigern und Arrays


Galileo Computing - Zum Seitenanfang

14.4 Zeiger, die auf andere Zeiger verweisen  downtop

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 auf dieselbe Adresse), nämlich 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. Schreiben Sie

wert = 20;

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

Abbildung
Hier klicken, um das Bild zu Vergrößern

Abbildung 14.10   Ein Zeiger bekommt die Adresse eines anderen Zeigers


Galileo Computing - Zum Seitenanfang

14.4.1 Subtraktion zweier Zeiger  toptop

In der Standard-Headerdatei <stddef.h> befindet sich ein primitiver Datentyp ptrdiff_t, welcher 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 einige Seiten weiter unten lesen.) Hier 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;
   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.

 << zurück
  
  Zum Katalog
Zum Katalog: C von A bis Z
C von A bis Z
bestellen
 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchtipps
Zum Katalog: Shell-Programmierung






 Shell-Programmierung


Zum Katalog: Linux-UNIX-Programmierung






 Linux-UNIX-Programmierung


Zum Katalog: C/C++






 C/C++


Zum Katalog: UML 2.0






 UML 2.0


Zum Katalog: Reguläre Ausdrücke






 Reguläre Ausdrücke


Zum Katalog: Linux






 Linux


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo





Copyright © Galileo Press 2006
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.


[Galileo Computing]

Galileo Press, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de