Verständnisfrage Zeiger

Schnelle objektorientierte, kompilierende Programmiersprache.
Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Grafische Oberfläche

Beitrag von Xin » So Dez 14, 2008 11:34 pm

+Fuss+ hat geschrieben:Ja danke für die Seite,
Ich hab zwar erst ein bisschen gelesen, hört sich aber gut an!

Hoffentlich hab ich das bis morgen verstanden.
Einfach fragen stellen.
Notfalls verpasse ich Dir ein paar Aufgaben, die mit Zeigern zu tun haben.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Grafische Oberfläche

Beitrag von nufan » Mo Dez 15, 2008 3:29 pm

+Fuss+ hat geschrieben:Hoffentlich hab ich das bis morgen verstanden.
Lass dir lieber Zeit um es richtig zu verstehen. Wichtig ist zu unterscheiden ob du mit der Adresse oder dem Wert des Ziels arbeitest.

Hast du dir schon mal die Zeiger-Beispiele im Wiki angesehen?

Benutzeravatar
+Fuss+
Beiträge: 385
Registriert: Fr Nov 14, 2008 8:16 pm

Re: Grafische Oberfläche

Beitrag von +Fuss+ » Mo Dez 15, 2008 5:07 pm

Beispiele wären vielleicht nicht schlecht.

Eine Frage:
wenn ich

Code: Alles auswählen

int *x=irgendwas
*(x+1)
schreib, dann zeigt der Zeiger auf irgendwas, was im Speicher hinter irgendwas steht, oder?

wenn ich allerdings

Code: Alles auswählen

int *x=irgendwas
(*x)+1
schreib, dann müsste doch der Wert von dem Zeiger erhöht werden. Hier kann man doch die Klammern weglassen, da * hier eine höhere Priotität hat als +.
Seh ich das richtig oder ist das Schwachsinn?

MfG Fuss

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Grafische Oberfläche

Beitrag von nufan » Mo Dez 15, 2008 5:17 pm

Code: Alles auswählen

int *x=irgendwas
*(x+1)
Bei der Deklaration weißt du etwas zu. Aber wohin zeigt der Zeiger? Das weiß wohl keiner so genau...

Das ist genau das, worauf ich dich vorhin hingewiesen habe. Der * weist auf darauf hin, dass du im Wertbereich und nicht im Adressbereich arbeitest.

Wenn du willst, dass der Zeiger permanent auf das nächste Element zeigt, musst du einfach den Zeiger inkrementieren. Willst du jedoch den Wert des Elementes auf das der Zeiger zeigt inkrementieren, musst du so vorgehen:

Code: Alles auswählen

(*x)++;
In manchen Fällen sind Klammern überflüssig, hier aber nicht. Mach lieber ein paar zu viel, als ein paar zu wenig. :)
Zuletzt geändert von nufan am Mo Dez 15, 2008 5:28 pm, insgesamt 1-mal geändert.

Benutzeravatar
+Fuss+
Beiträge: 385
Registriert: Fr Nov 14, 2008 8:16 pm

Re: Grafische Oberfläche

Beitrag von +Fuss+ » Mo Dez 15, 2008 5:24 pm

Mach lieber ein paar zu viel, als ein paar zu wenig.
Das sagt der Mathelehrer auch immer...

aber ich glaube, dass ich das jetzt einigermaßen verstanden habe mit den Zeiger.

& für Adresse
* für Wert....

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: Grafische Oberfläche

Beitrag von Kerli » Mo Dez 15, 2008 5:30 pm

dani93 hat geschrieben:

Code: Alles auswählen

    int *x=irgendwas
    *(x+1)

Bei der Deklaration weißt du etwas zu. Aber wohin zeigt der Zeiger? Das weiß wohl keiner so genau...

Die zweite Zeile. Dieser Ausdruck ist irgendwie sinnlos ;)
Wenn 'irgendwas' zb ein Array ist bzw. der Zeiger auf das erste Element, dann ist das vollkommen korrekt und wird auch so verwendet. Das ganz wird auch Pointerarithmetik gennant, und zb hier erklärt.

Ich glaube da fehlt dem Wiki noch etwas :P
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Grafische Oberfläche

Beitrag von nufan » Mo Dez 15, 2008 5:34 pm

+Fuss+ hat geschrieben:& für Adresse
Mit dem & Operator bekommst du die Adresse von der Variable.

Angenommen y ist ein Pointer vom gleichen Typ wie x.
Schreibst du

Code: Alles auswählen

y = &x;
Bekommt y die Adresse von x. Betrachte x einfach als eine Variable, deren Wert die Adresse von etwas anderem ist.
Richtig müsste es so heißen:

Code: Alles auswählen

y = x;
Dann zeigt y auf das gleiche Element wie x.
Kerli hat geschrieben:Wenn irgendwas ein Array ist, dann ist das vollkommen korrekt und wird auch so verwendet.
Hab ich auch schon wegeditiert :D

Benutzeravatar
+Fuss+
Beiträge: 385
Registriert: Fr Nov 14, 2008 8:16 pm

Re: Grafische Oberfläche

Beitrag von +Fuss+ » Mo Dez 15, 2008 6:04 pm

ok
jetzt hab ich das mit den Zeigern und Zeigern auf Zeiger verstanden...

Nur das mit Zeiger als Parameter versteh ich nicht.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Grafische Oberfläche

Beitrag von Xin » Mo Dez 15, 2008 6:06 pm

+Fuss+ hat geschrieben:ok
jetzt hab ich das mit den Zeigern und Zeigern auf Zeiger verstanden...

Nur das mit Zeiger als Parameter versteh ich nicht.
Merkst Du den Widerspruch? ;-)

Lass Dir Zeit mit den Zeigern, ich brauche vermutlich noch bis zum Wochenende, um den nächsten Artikel zu dem Thema fertig zu stellen. Zeiger können frustrierend sein, wenn man nur glaubt, sie verstanden zu haben.
Keine Sorge, wenn man sie verstanden hat, sind sie einfach, aber es erfordert halt etwas Erfahrung.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: Grafische Oberfläche

Beitrag von Dirty Oerti » Mo Dez 15, 2008 7:35 pm

Ein paar kleine Beispiele:

Code: Alles auswählen


int a = 5;
int b = 1;


int *z;

z = &a;
// (*z == a) wäre nun TRUE

z = a; //Wird eine Warnung erzeugen
// (*z) enthält nun etwas total konfuses. (Den Wert, der an der Stelle 5 im Speicher steht)

*z++;
//a ist nun 6

z = &b;

*z++;
//b ist nun 2

Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Antworten