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.13 Der »restrict«-Zeiger topZur vorigen Überschrift

Mit dem C99-Standard wurde der Typqualifizierer restrict neu eingeführt. Mit diesem Schlüsselwort können Sie Zeiger qualifizieren, sogenannte restrict-Zeiger. Der restrict-Zeiger hat eine enge Beziehung zu dem Speicherobjekt, auf das er verweist. Mit dem Qualifizierer geben Sie quasi vor, dass während der Lebensdauer des Zeigers das Speicherobjekt, auf das dieser verweist, nicht verändert werden kann und der Zugriff nur über diesen restrict-Zeiger erfolgen darf. Einfachstes Beispiel:

int * restrict iRptr = malloc (sizeof (int) );

Damit geben Sie praktisch vor, dass Sie den von malloc() zurückgegebenen reservierten Speicher nur mit dem Zeiger iRptr verwenden. Wohlgemerkt: Mit dem Qualifizierer restrict geben Sie nur dem Compiler das Versprechen, dass Sie auf das Speicherobjekt ausschließlich mit diesem Zeiger zurückgreifen. Jede Manipulation außerhalb des restrict-Zeigers, und sei es nur lesend, ist unzulässig.

Zu überprüfen, ob der restrict-Zeiger richtig verwendet wird, Sie also nur über diesen Zeiger auf ein Speicherobjekt zugreifen, ist Ihre Aufgabe. Der Compiler kann nicht überprüfen, ob Sie Ihr Versprechen eingehalten haben. Fall Sie die Regeln nicht einhalten, gibt es zwar keine Fehlermeldung des Compilers und häufig auch keine Probleme bei der Ausführung des Programms, aber dennoch ist das Verhalten laut Standard undefiniert. Abgesehen davon: Mit oder ohne den restrict-Zeiger bleibt die Ausführung des Programms dieselbe.

Der Vorteil des restrict-Zeigers ist es, dass Sie es dem Compiler ermöglichen, Optimierungen des Maschinencodes durchzuführen, die sonst bei Zeigern zu Problemen führen können. Allerdings muss der Compiler auch diesem Hinweis nicht nachkommen und kann den Qualifizierer restrict auch ignorieren.

Der restrict-Zeiger kann auch sehr gut bei Funktionen verwendet werden, um anzuzeigen, dass sich zwei Zeiger in der Parameterliste nicht überlappen dürfen, sprich, dasselbe Speicherobjekt verwenden. Beispielsweise ist bei

int flaeche( int * w, int * b ) {
   /* ... * /
}

nicht klar angegeben, ob sich die beiden Speicherobjekte, auf die die Zeiger w und h verweisen, überlappen dürfen oder nicht. Mit dem neuen Qualifizierer restrict ist dies jetzt sofort erkennbar:

int flaeche( int * restrict w, int * restrict b ) {
   /* ... * /
}

Wird trotzdem versucht, die Funktion mit sich überlappenden Speicherobjekte aufzurufen, ist das weitere Verhalten undefiniert. Ein ungültiger Aufruf kann beispielsweise wie folgt aussehen:

int val, x=20, y=10;
// Unzulässig, wegen den restrict-Zeigern,
// zwei gleiche Speicherobjekte werden verwendet,
// die sich somit überlappen
val = flaeche( &x, &x );
// OK, zwei verschiedene Speicherobjekte
val = flaeche( &x, &y );

Vom restrict-Zeiger wird mittlerweile auch rege in der Standard-Bibliothek Gebrauch gemacht. Beispielsweise sieht die Syntax der Funktion strncpy() wie folgt aus:

#include <string.h>

char *strncpy( char * restrict s1,
               const char * restrict s2,
               size_t n );

Die Funktion kopiert n Bytes vom Quellarray s2 in das Zielarray s1. Dadurch, dass die beiden Zeiger als restrict deklariert sind, müssen Sie beim Aufruf der Funktion beachten, dass die Zeiger nicht auf dieselben Speicherobjekte verweisen, sprich. sich nicht überlappen. Betrachten Sie dazu folgendes Beispiel:

char arr1[20];
char arr2[] = { "Hallo Welt" };
// Ok, 10 Zeichen von arr2 nach arr1 kopieren
strncpy( arr1, arr2, 10 );
arr1[10] = '\0'
// Unzulässig, Speicherbereiche überlappen sich,
// das gibt nur Datensalat.
strncpy( arr1, arr1, 5 );

Ein weiteres klassisches Beispiel von Funktionen der Standardbibliothek sind die Funktionen memcyp() und memmove() in der Headerdatei <string.h>. Die Syntax der Funktionen lautet:

#include <string.h>

void *memcpy( void * restrict s1,
              const void * restrict s2,
              size_t n );

void *memmove( void *s1,
               const void *s2,
               size_t n);

Bei diesen beiden Funktionen kann man sehr schön sehen, dass sich bei memcpy() der Quell- und der Zielbereich nicht überlappen dürfen, weil sonst die restrict-Regel verletzt würde. Bei der anderen Standardfunktion memmove() hingegen dürfen sich der Quell- und der Zielbereich überlappen.


Hinweis

Da sich der C99-Standard noch nicht auf allen Compilern komplett durchgesetzt hat, wurde bei den Beispielen in diesem Buch auf restrict-Zeiger verzichtet. Die Syntaxbezeichnungen der Standardfunktionen hingegen wurden bereits im C99-Standard verfasst.




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