C++Guns – RoboBlog

08.06.2010

Pointer und so

Filed under: Allgemein — Tags: — Thomas @ 21:06

Hier gefunden http://www.wachtler.de/ck/8_4_Grunddatentypen.html

C erhält durch Zeigerarithmetik erst richtig Leben; die größere Effektivität von Programmen in C rührt zu einem großen Teil davon. Angenommen, eine Funktion soll ein Feld mit double-Elementen löschen, also alle Werte zu 0.0 setzen. Ein ehemaliger FORTRAN- oder Pascal-Programmierer würde die Funktion vielleicht so schreiben:

/* grloel.c 31. 7.95 kw
*/

#include

void loesche_double( double feld[], size_t wieviele )
{
size_t i;

for( i=0 ; i < wieviele ; i++ ) feld[i] = 0.0; } Das funktioniert natürlich, aber die Lösung enthält überflüssige Berechnungen. Abgesehen von der nötigen Erhöhung des Schleifenzählers (Auswertung von ++) muß bei jedem Durchlauf die Adresse des Elementes feld[i] berechnet werden. Dazu muß das Programm die Adresse hernehmen, die mit dem Namen feld verbunden ist (das ist die Adresse des ersten Feldelements), und dazu ein Produkt addieren, nämlich i*sizeof(double) (zur Auswertung von feld[i]). Mit Zeigerarithmetik läßt sich die Funktion wesentlich schneller machen: /* grloes.c 31. 7.95 kw */ #include

void loesche_double( double *feld, size_t wieviele )
{
double *pfeld = feld;
double *pende = feld+wieviele;

while( pfeld < pende ) *pfeld++ = 0.0; } Jetzt wird der Parameter feld als Zeiger auf das erste Element aufgefaßt. Ein Zeiger (pfeld) wandert durch das Feld und zeigt nacheinander auf die zu löschenden Elemente. Neben der eigentlichen Zuweisung (=) muß in der Schleife nur noch zu pfeld bei jedem Durchlauf der Wert sizeof(double) addiert werden (Auswertung von ++). Die aufwendige Multiplikation entfällt, außerdem hat man statt zwei Additionen nur noch eine.

No Comments »

No comments yet.

RSS feed for comments on this post. TrackBack URL

Leave a comment

You must be logged in to post a comment.

Powered by WordPress