Adreßparameter in C
Unter einem Adreßparameter verstehen wir hier einen Parameter, dessen Typ ein Adreßtyp ist.
Lesen über Adreßparameter
Das folgende Programm zeigt eine Funktion, welche den Wert eines int-Objekts, dessen Adresse ihr übergeben wird, ausgibt.
main.c
#include <stdio.h>
void print( int const * const p )
{ printf( "%d\n", *p ); }int main( void )
{ int const i = 27;
print( &i );
int const * const p = &i;
print( p ); }stdout
27
27
In dem obigen Programm gibt es aber keinen erkennbaren Grund dafür, eine Adresse zu übergeben. Wenn ein int-Wert ausgegeben werden soll, ist es besser, diesen als Wert zu übergeben, wie in dem folgenden Programm.
main.c
#include <stdio.h>
void print( int const i )
{ printf( "%d\n", i ); }int main( void )
{ int const i = 29;
print( i );
int const * const p = &i;
print( *p ); }stdout
29
29
Schreiben über Adreßparameter
Das folgende Programm zeigt eine Funktion, welche den Wert eines int-Objekts, dessen Adresse ihr übergeben wird, auf 0 setzt.
main.c
#include <stdio.h>
void clear( int * const p ) { *p = 0; }
int main( void )
{ int i = 12;
printf( "%d\n", i );
clear( &i );
printf( "%d\n", i ); }stdout
12
0
Ohne Zeiger wäre es nicht möglich, daß eine aufgerufene Funktion eine Variable verändert, die innerhalb eines Argumentausdrucks jener Funktion vorkommt. Daher kann man sicher sein, daß ein Aufruf wie »f( i )« oder »f( +i )« eine Variable »i« nicht verändert. Bei einem Aufruf wie »f( &i )« ist dies jedoch möglich, falls »i« nicht mit »const« deklariert wurde.
Potentiell undefiniertes Verhalten
Die Funktion »f« hat potentiell undefiniertes Verhalten, da bei einem Aufruf mit zwei gleichen Zeigern mehrere Schreibzugriffe auf dasselbe Objekt ohne einen dazwischen befindlichen Sequenzpunkt erfolgen.
main.c
#include <stdio.h>
void f( int * const p, int * const q )
{ ( *p = 2 )+( *q = 3 ); }int main( void )
{ int i = 1;
f( &i, &i );
printf( "%d\n", i ); }Protokoll
3
Übungsaufgaben
Bei den folgenden Aufgaben sollten Adreßparameter nur verwendet werden, wo dies nötig ist, und »const« sollte überall verwendet werden, wo dies möglich ist.
/ Zuweisung
Fügen Sie die Definition einer Funktion »assign« an Stelle der Ellipse »…« in das folgende Programm ein, welche den Wert ihres zweiten Arguments in das durch das erste Argument angegebene int-Objekt schreibt.
main.c
#include <stdio.h>
- …
int main( void )
{ int i = 7;
printf( "%d\n", i );
assign( &i, 34 );
printf( "%d\n", i ); }stdout
7
34
/ Vertauschen
Fügen Sie die Definition einer Funktion »swap« (Aussprache: /swɑp/) an Stelle der Ellipse »…« in das folgende Programm ein, welche die Werte der beiden als Argumente angegebenen int-Objekte miteinander vertauscht.
main.c
#include <stdio.h>
- …
int main( void )
{ int i = 16; int j = 82;
printf( "i = %d, j = %d\n", i, j );
swap( &i, &j );
printf( "i = %d, j = %d\n", i, j ); }stdout
i = 16, j = 82
i = 82, j = 16