Pointer

ChrisLem

Mitglied
Hallo erstmal,

Ich hatte vor kurzem 2 Wochen Praktikum und deswegen VIELLL Zeit, da hab ich mein altes C - Buch wieder rausgeholt namens : "Jetzt lerne ich C" von Markt und Technik. Das ging auch alles soweit gut, ich hab alles verstanden nur dann kam ich zu den letzten kapiteln, da hatte ich Probleme. Ich hab Verständnisproleme wie ich mit einem Pointer umzugehen habe!

Ein Pointer ist ja nur die Adresse von einer Variable im Speicher, aber was bringt mir das???

Der andere Punkt war die Speicherverwaltung.

Auf Deutsch das interessante (laut einigen Büchern und Personenaussagen) kann ich nicht! AHHH, da ich immernoch Zeit hatte, hab ich den umstieg von c auf c++ gewagt, das ging ebenfalls ganz gut nur das ich mit Pointern in dem sinne immernoch nicht wirklich was anfangen konnte, und das war depremierend, in die Windows programmierung hab ich erst garnicht reingeschaut... Wenn ich hier so einige Posts lese verstehe ich einfach nur Bahnhof, wie kann ich das ändern, kann mir jmd was Empfehlen? Wäre echt nett,

Christan L.
 
Ich versuch dir mal den Sinn anhand eines einfachen Beispiels zu erklaeren.

Nehmen wir mal an du hast eine Funktion die soll zwei Integerwerte vertauschen (bubblesort)

also
int a soll den inhalt von b erhalten
und b soll den inhalt von a erhalten
Code:
int swap(int a, int b)
{
int temp;
temp =  a;
a = b;
b = temp;

return ???????
}

Da eine Funktion (Methode) nur 1 Rueckgabewert haben kann ist es dir unmoeglich beide integerwerte so einfach zuruck zu geben. Klar koenntest du ne (Poit artige) struktur zurueckgeben aber dieser aufwand waehre deinem ziel nicht gerecht.

Also uebergibst du Variablen nicht nach wert sondern nach verweis! Sprich du uebergibst keine Kopie (wie das bei werte paramenter der fall ist) sondern du uebergibst die Adresse (den Speicherort) der jeweiligen Variable. Somit aenderst du die Varialble ansich und brauchst sie nicht durch return zurueckgeben.

Ich habe nie C programmiert nur C++ drum kommen die meisten leicht durchschaubaren Beispiele aus der C++ Sprache.

Funktionszeiger sind eine weitere moeglichkeit die dir Zeiger bieten. Damit kannst du Funktionen aufrufen die letzten endes erst zur Laufzeit bekannt werden. In C++ kommt mann um Zeiger nicht herum in C wohl auch nicht.
 
Thx das hat mir schon sehr geholfen, kennt noch irgendwer texte oder tuts aus dem i-net die das noch gut Beschreiben, dann wäre es nett wenn er die addys hier reinposten würde THX

Christian L.
 
#include <stdio.h>

void intvertauschen(int a, int b);

void main()
{
int zahl1, zahl2, *zahl1verweis, *zahl2verweis;

*zahl1verweis = zahl1;
*zahl2verweis = zahl2;

printf("Zahl 1: ");
scanf("%d /n", &zahl1);+

printf("Zahl 2: ");
scanf("%d /n", &zahl2);

intvertauschen(zahl1, zahl2);

printf("1. Zahl: %d /n 2.Zahl: %d /n", zahl1, zahl2);
}

void intvertauschen(int a, int b);
{
*zahl1verweis = b;
*zahl2verweis = a;
}

wäre sowas korrekt oder korriegiert mich mal bitte... und verbessert das ganze damit ich sehe was ich falsch gemacht habe!

THX Christian L.
 
Mit Zeigern würde dasso ausschauen:

void Tauschen( int *x, int *y); //Vorwärtsdeklaration

int main()
{
int a=3, b=4; //ein paar Werte definieren
int *pZeigerAufA=&a; // Zeiger deklarieren und ihnen
int *PZeigerAufB=&b; //die Adressen der Variablen
//zuweisen (der & Operator)
Tauschen(pZeigerAufA, pZeigerAufB); //die Zeiger übergeben

cout<<"Adresse von a:"<<pZeigerAufA;
cout<<" und jetzt den Wert: "<<*pZeigerAufA<<endl;

return 0;
}

void Tauschen (int *x, int *y) //übernimmt 2 Zeiger
{
int temp = *x; //den Wert, auf den x zeigt temp zuweisen;
*x = *y;
*y = temp; //der Wert von temp wird auf die Adresse,
//auf die y zeigt, geschrieben
}
 
also... pointer sind eigendlich das schönste in allen sprachen, wenn man sie erstmal verstanden hat.
Einige beispiele da oben zeigen ja die anwendung :)

in C is ja die sache so, dass du keine Prozeduren hast wie in Pascal, sondern nur funktionen. Daher kommt das ja mit dem Rückgabewert.
angenommen du willst nun einige zeilen kapseln, dann geht das ja in Funktionen rein.
Jetzt willst du meinetwegen 5 Variablen berechnen und die musst du dann zurückgeben. Aber C kann ja mit return nur eine einzige variable rausgeben, dann is schluss.
--> Also legst du einen pointer auf die Variable bevor du sie reingibst in die Aufruf-Funktion. Bsp.: Pzahl1 = &zahl1; *Pzahl2=zahl2; (beides möglich).

Indem du nun die Referenzen in die Aufruffunktion gibst, kannst du dort den --> direkten <-- Wert der Variable ändern. d.h. du musst nichts mehr zurückgeben.

Das nächste schöne sind Pointer und Felder. Schau da mal im Buch nach was du da alles schönes findest.
In der Praxis ist es ja besonders wichtig, speichereffizient zu arbeiten. Und eh man die <string.h> einbindet sollte man sich überlegen, ob man einen stringcopy nicht viel besser mit einer kleinen Pointeroperation erledigen kann ;)

Greets, Zyrkon
 
Ähm, also es wäre wohl angebracht Pointer und Referenzen (auch wenn nur für den "Lernanfang") zu differenzieren, um einer evtl. späteren allgemeinen Verwirrung vorzubeugen ;).

Und wg. strcpy(): Ich bezweifle, dass du sie schneller schreiben kannst als in der CRT (allerdings ist es eine nette Lernaufgabe ein paar String-Funktionen od. eine String-Klasse selbst zu schreiben (Tipp für alle die üben wollen)).
 
Tja Zeiger sind schon was tolles wenn man das Prinzip mal verstanden hat. Ich möchte noch ein Beispiel posten, das nicht ganz so kompliziert ist wie die vorgehenden *g*.

#include <stdio.h>

void Rueckgabe(int *, int *);

void main(void)
{
int a=10;
int b=20;
// Ausgabe vor der Funktion
printf("a: %d\n",a);
printf("b: %d\n",b);

Rueckgabe(&a, &b);
// Hier werden die Variablen als
// Referenz übergeben (nur Adresse)

// Ausgabe nach der Funktion
printf("a: %d\n",a);
printf("b: %d\n",b);

// Effekt: es werden zwei Variablen
// manipuliert obwohl die Funktion
// keinen Rückgabewert hat
}

void Rueckgabe(int *x, int *y)
{
*x=100;
*y=200;
}


Gruss Homer
 

Neue Beiträge

Zurück