Adreßparameter in C [] (Adreßparameter in C), Lektion, Seite 723309
https://www.purl.org/stefan_ram/pub/adressparameter_c (Permalink) ist die kanonische URI dieser Seite.
Stefan Ram
C-Kurs

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

Seiteninformationen und Impressum   |   Mitteilungsformular  |   "ram@zedat.fu-berlin.de" (ohne die Anführungszeichen) ist die Netzpostadresse von Stefan Ram.   |   Eine Verbindung zur Stefan-Ram-Startseite befindet sich oben auf dieser Seite hinter dem Text "Stefan Ram".)  |   Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram. Schlüsselwörter zu dieser Seite/relevant keywords describing this page: Stefan Ram Berlin slrprd slrprd stefanramberlin spellched stefanram723309 stefan_ram:723309 Adreßparameter in C Stefan Ram, Berlin, and, or, near, uni, online, slrprd, slrprdqxx, slrprddoc, slrprd723309, slrprddef723309, PbclevtugFgrsnaEnz Erklärung, Beschreibung, Info, Information, Hinweis,

Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram.
https://www.purl.org/stefan_ram/pub/adressparameter_c