zeiger



  • mach da gerade so ein tutorial für c++ und bin da gerade bei zeigern angelangt. bis jetzt hab ich die funktionsweise eigentlich verstanden nur ist mir noch nicht ganz bewusst wofür die gut sind. kann mir das wer erklären?



  • die suchfunktion eines forums zu bemühen ist schon ein hartes brot 🙄

    http://www.c-plusplus.net/forum/viewtopic.php?t=87136



  • naja ist zwar auch nicht wirklich was ich suche, da dort nur erläutert wird wie es funktioniert, aber trotzdem danke.

    ich hätte lieber ein kleines beispiel wo man in der praxi den zeiger wirklich brauchen kann, weil ich mir nicht wirklich vorstellen kann, was ich mit zeigern machen kann, das ich mit variablen nicht hinbekomme.





  • zeiger machen z.b. das handling von großen datenmengen einfacher (bei funktionsaufrufen). auch lassen sich mit zeigern dynamische datenstrukturen bauen (bäume, verkettete listen, usw...).



  • Die Frage stellen sich viele am Anfang.
    Einen Pointer brauchst du, wenn du dynamisch Speicher anforderst.
    also

    int *p=new int;
    

    oder bei Funktionsparametern:
    [cpp]
    int f (int a, int b, *int erg)
    {
    if (erg) erg=a+b;
    return a
    b;
    }
    [/cpp]
    Das Beispiel ist zwar an den Haaren herbeigezogen, aber das Prinzip ist hier: Der Parameter wird verändert, und dann muss er ein Pointer sein. Alles andere ist eine Kopie und wird nicht verändert.
    In c++ würde man das mit Referenzen machen, aber diese ist für dieses Beispiel vergleichbar mit pointern.

    Klaro?



  • hier mal ein beispiel was nicht an den haaren herbeigezogen ist

    typedef struct UNIVERSELL
    {
    	struct UNIVERSELL *prev;
    	struct UNIVERSELL *next;
    	void *daten;
    }UNIVERSELL;
    
    typedef struct KUNDE
    {
    	int kndnr;
    	char name[30+1];
    }KUNDE;
    
    int make_u_list(UNIVERSELL **start, UNIVERSELL **end, int structsize)
    											// structsize ist die Groesse des Datensegments
    {
    	UNIVERSELL *act;
    	int errorc = 0;
    	act = (UNIVERSELL *) malloc(sizeof(UNIVERSELL));
    	if(act==NULL)		// wenn diese Bedingung wahr ist konnte kein Speicher für die
    	{					// universelle Liste reserviert werden
    		errorc = -1;	// und die Funktion wird mit Fehlercode: -1 beendet
    	}
    	else
    	{
    		act->daten = malloc(structsize);
    		if(act->daten == NULL)		// wenn diese Bedingung wahr ist konnte kein Speicher für das
    		{							// Datensegment reserviert werden
    			free(act);				// Der für UNIVERSELL reservierte Speicher wird wieder freigegeben
    			errorc = -1;			// und die Funktion wird mit Fehlercode: -1 beendet
    		}
    		else						// Hier ist Speicher für alles reserviert
    		{
    			if(*start == NULL)		// WENN diese Bedingung wahr ist
    			{
    				*start = act;		// ist es das erste Element einer neuen Liste
    				act->prev = NULL;	// und "prev" muß dementsprechend gezielt ins Leere zeigen
    			}
    			else					// SONST gibt es einen Vorgaenger
    			{
    				act->prev = *end;	// auf den "prev" dann zeigen muss
    			}
    			*end = act;				// Das neue Element ist auch immer das letzte in der Liste
    			act->next = NULL;		// und "next" muß dementsprechend gezielt ins Leere zeigen
    		}
    	}
    	return errorc;
    }
    

    diese funktion erstellt einen teil einer doppelt verketteten liste, welche aus beliebig vielen elementen und einem xbeliebigem datensegment bestehen kann. das struct KUNDE kann durch ein beliebiges anderes struct ersetzt werden in dem ganz andere daten gespeichert werden können...

    wenn man also zu dem zeitpunkt an dem man das programm schreibt noch keine ahnung hat wie viele daten zur laufzeit des programms gesammelt werden müssen kommt man eben nicht ohne pointer aus...

    grüße,

    sternenstaub


Anmelden zum Antworten