C++ Pointer Teil 2 ---AHH !!!??!!!

Diskutiere C++ Pointer Teil 2 ---AHH !!!??!!! im Developer Network Forum im Bereich Hardware & Software Forum; In meinem Buch wird dauernd bei den Pointern vo "Referenzierung" und "Dereferenzierung" gesprochen. Auch wenn es blöd erscheint aber ich kann...
  • C++ Pointer Teil 2 ---AHH !!!??!!! Beitrag #1
C

Cmon

Bekanntes Mitglied
Dabei seit
20.02.2000
Beiträge
89
Reaktionspunkte
0
Ort
Deutschland
In meinem Buch wird dauernd bei den Pointern vo "Referenzierung" und "Dereferenzierung"
gesprochen.
Auch wenn es blöd erscheint aber ich kann mit diesen Wörtern nichts anfangen!!

Vorallem wundert es mich das bei manchen pointern kein * zu finden ist.

Ein Beispiel:

int i_var = 13; //das ist klar!
int *ptr1 = &i_var; //das ist auch klar!
int *ptr2 = ptr1; //warum hat ptr2 keinen //stern ?
int feld[10] = {
11,
11,
11 } //ein array, klar.
ptr3 = feld; //das ist doch nur eine //Konstante und kein
//pointer, oder??

weiteres: Was bedeutet "instanz" ????

Ich würde mich auf eure Antworten freuen!!!!
 
  • C++ Pointer Teil 2 ---AHH !!!??!!! Beitrag #2
D

Detonator

Bekanntes Mitglied
Dabei seit
09.02.2000
Beiträge
122
Reaktionspunkte
0
Dereferenzieren heisst einfach in der Pointerhierarchie einen Schritt nach unten....
Bei int *ptr2 (dereferenziert) durch das *Symbol.... bekommt ptr2 ueber Umwege den Wert Deiner Variablen....
Der Stern ist doch da was suchst Du denn...
Kleine Frage aeh ptr3 ist gar nicht vereinbart muss aber vom Typ IntArray sein..... man muss schon einen Typ angeben....
Instanz ist ein Objekt dass Du mit Hilfe einer Klasse auf dem Haldenspeicher erzeugt hast....

Stringbuffer sb = new Stringbuffer();

Damit erschaffst Du eine Instanz (Objekt der Klasse Stringbuffer mit Hilfe des Konstruktors der Klasse....)

Mit dem Stern bei *ptr2=ptr1 meintest Du vielleicht warum ptr1 keinen Stern hat???
Also normale Zuweisung:
V1 = x;
V1 bekommt an die Stelle den Linkswertes den Rechtswert von x...

Genauso ist es bei deinem Prob nur dass der Rechtswert von ptr1 an die Stelle des Linkswertes von *ptr2 geschrieben....
Heisst soviel wie du gehst der Referenz von ptr2 dann hast Du den Pointer dereferenziert...
Kann man leider so schlecht erklaeren.....

Hoffe es hilft trotzdem....
Um es sich am Anfang anschaulich zu machen kannst Du Dir mal ein Variablendiagramm zeichnen steht bestimmt irgendwo in Deinem schlauen C++ Buch...

Bis denn dann
Detonator



------------------
Dagegen!!
 
  • C++ Pointer Teil 2 ---AHH !!!??!!! Beitrag #3
C

Cmon

Bekanntes Mitglied
Dabei seit
20.02.2000
Beiträge
89
Reaktionspunkte
0
Ort
Deutschland
Also wenn ich das richtig verstanden habe
wird bei der derefernzierung ein Pointer angelegt der eine Adresse eines anderen Pointer beinhaltet, mit der man auf ein objekt zugreift.
Das leuchtet ein. Das könnte auch zu einer Hierarchie, einen Stammbaum oder so passen.

Und wenn ich eine Pointervariable aufrufe muss ich dann keinen stern oder ein & zeichen angeben ?

int i;
int *ptr1 = &i;
int *ptr2 = ptr1; //kein stern oder ein & zeichen ?

aber vielen dank!!! :)
 
  • C++ Pointer Teil 2 ---AHH !!!??!!! Beitrag #4
D

Detonator

Bekanntes Mitglied
Dabei seit
09.02.2000
Beiträge
122
Reaktionspunkte
0
Ganz einfach wenn Du ein & Zeichen vor den Variablennamen schreibst übergibst Du an den Pointer nicht den Wert sondern die Referenz auf den Wert.... also die Adresse
Waehrend du beim zweiten Fall sozusagen den "Wert" des Pointers uebergibst und nicht seine Referenz...
Das ganze hat folgenden Vorteil wenn Du z.B. in Java eine Methode folgendermassen aufrufst
Variable : int x =5;
int y=6;
Methode: sum (int a, int b){}

Aufruf: sum(x,y);

Dann uebergibst Du an die Parameter der Methode (a und b) eine KOPIE der Werte von x und y das heisst x und y werden durch die Methode nicht veraendert.....
Uebergibst Du nun aber die Referenz (&x)
z.B. in C++ dann wird keine Kopie des Wertes uebergeben sondern seine Adresse und wenn Du in der Methode nen den Wert veraenderst dann veraendert sich der Wert von x, weil Du ja sozusagen seine Speicheradresse uebergeben hast.....

Jaja Pointer sind was schoenes....

CU
Detonator


------------------
Dagegen!!
 
  • C++ Pointer Teil 2 ---AHH !!!??!!! Beitrag #5
P

Pfund_Gehacktes

Mitglied
Dabei seit
14.03.2000
Beiträge
11
Reaktionspunkte
0
  • C++ Pointer Teil 2 ---AHH !!!??!!! Beitrag #6
T

TT

Bekanntes Mitglied
Dabei seit
19.07.1999
Beiträge
3.789
Reaktionspunkte
0
Ort
einer anderen Welt
Habe mir jetzt nicht alle Beiträge durchgelesen, aber im Prinzip sieht es so aus:

int *ptr1 = &i_var;

Der Pointer zeit auf i_var

int *ptr2 = ptr1;

Der Pointer bekommt die selbe Adresse wie ptr1, zeigt also auch auf i_var

Das mit ptr3 ist das jetzt ein Tipfehler?

Meiner Meinung sollte das heißen:

int *ptr3 = &feld;
Dann zeigt er auf das Feld.

TT

------------------
Nur der Weise schweigt, um seine Dummheit zu verbergen. (TT Rulez)
Moderator der Software-Zone bei Grossmaster B
Moderator der Netzwerkzone und Philosophie-Ecke sowie Co-Admin bei Scrabbledo's InfoBoard
 
  • C++ Pointer Teil 2 ---AHH !!!??!!! Beitrag #7
W

Washuu-Chan

Mitglied
Dabei seit
21.04.2000
Beiträge
5
Reaktionspunkte
0
Ort
Jurai Empire
Ummm, alle scheinen hier den armen Kerl verwirren zu wollen...Hierarhie? Kami-sama...
An dieser Stelle muss ich Bemerkung machen, dass C oft als "middle-level" language bezeichnet wird, dass heisst, dass C zwar nicht direkt mit dem Prozessor umgeht, wie Assembler, ist aber ohne Rücksicht auf die Ideale der "high-level"-Sprachen für den Prozessor optimiert. Deswegen gibt es hier oft Situationen, wo 2 thematisch verschiedene Dinge zusammengefasst werden, nur weil aus der Sicht des Prozessors die vollkommen gleich sind.
Beispiele dafür sind zum Beispiel: es gibt keine bool'schen Variablen oder werte, weil int dass genausogut machen kann, char kann man sowohl für einen Buchstaben benutzen, aber auch für eine Zahl -128..127 usw.
Dazu gehören auch Pointer, die unter C so ziemlich dasselbe sind wie Arrays. Ich werde gleich beschreiben wieso, da kannst du dir aber gleich merken - C ist nicht kompliziert, C ist eher primitiv gebaut - hättest du dich zuvor mit ASM beschäftigt, wird dir die ganze Struktur "von unten gesehen" vollkommen klar.
Also:
Also, was ist ein Pointer? das ist eine Variable, ist 4 Byte gross (auf 32-bit Platformen) und enthält eine Adresse auf den Speicher.
mit "Type" * "Name" definierst du einen Pointer, der auf eine Variable von Typ "Type" zeigt bzw. (wichtig!) auf eine Liste von hintereinander folgenden solchen Variablen (auch bekannt als Array)
Dereferenzieren bedeutet nichts anderes als "den Wert der Variable, auf die der Pointer zeigt, rauszuholen"
Beispiel:
int a; // Normale Variable int
int *p; // Pointer auf eine int-Variable
zu diesem Zeitpunkt ist p irgendwo schon vorhanden, und enthält irgendeinen sinnlosen Wert, also zeigt schon mal irgendwohin
p = &a; // &a bedeutet "Adresse von der Speicherstelle, wo der Wert von a abgelegt ist", nun wird diese adresse in der Variable p gespeichert
*p = 3; // *p bedeutet "Speicherstelle, wohin p zeigt, darein wird nun 3 geschrieben.

Das wäre die einfache Beschreibung von den Pointern.

Nun zur Pointerarithmetik:
Pointer ist im prinzip eine bestimmte Zahl (Adresse), also verbietet uns nichts auch arithmetische Operationen damit zu durchführen, allerdings kommen nur + und - in frage.
p+1 - was hätte das für Bedeutung? Das ist die Adresse, die gleich nach der Adresse folgt, auf die p zeigt. Allerdings is hier wichtig, von welchen Typ dieser Pointer ist. In unserem Fall ist es "int *p", also zeigt er auf int's, und diese sind 4 Byte gross (auf 32-bit Systemen), also ist p+1 die Adresse, die um 4 Byte von der Adresse entfernt ist, wohin p zeigt.
Da können wir zum Beispiel schreiben:
int *r = p+1; // nun haben wir noch einen Pointer auf int namens "r", der auf die "4-Byte-nächste" Adresse zeigt als p.
Was ist denn nun mit Arrays? - Man kann schreiben:
*(p+1) = 4; // da haben wir diese nächste Speicherstelle mit 4 beschrieben
aber man kann es auch so schreiben:
p[1] = 4; // glaubst du oder nicht, aber es hat nichts mit Arrays zu tun, es ist nur die andere Schreibweise.
Es ist Zeit, "Array" zu definieren:
Array ist ein reservierter Speicherbereich, der genug Platz für eine bestimmte Anzahl von Variablen eines Typs bietet.
Arrays kann man aber im Programm auf 2 verschiedene Weisen definieren:
int feld[10]; // ein statischer Array
int *ding = (int *)malloc(10*sizeof(int)); // ein dynamischer array
Beide bieten Platz für 10 ints, beide befinden sich nun irgendwo im Speicher, deswegen kann man ihre Position durch die Adresse vom ersten, er... nullten Element angeben. Wie erfährt man diese Adresse? Ganz einfach: im ersten Fall heisst die "feld", im zweiten - "ding".
Ja, das heist, die Namen von den beiden Arrays alleine bedeuten int-pointer auf den nullten Element. Die beiden sind int-pointer, obwohl man im ersten Fall nicht so genau sieht. Für die beiden kannst du schreiben:
feld[2] = 3; // der 2. Element = 3
ding[1] = 5; // der 1. el = 1
aber auch:
*(feld+2)=3; // dasselbe!
*(ding+1)=5; // dasselbe!
Wie du siehst in der allgemeinen Benutzung (also einzelne Elemente setzen und abfragen) gibt es keinerlei unterschiede zwischen den Beiden. Ansonsten gibt es doch Unterschiede, nämlich: während "ding" eine richtige Variable ist, und im Speicher gelagert wird, ist "feld" fest definiert während kompilation. Da "feld" sich nicht im Speicher befindet, sondern nur im Code, kann man "feld" auch nicht verändern, man kann auch feld-Array nicht etwa vergrössern. &feld ergibt einen Compiler-Fehler, da kein Sinn hat - "feld" ist nicht im Speicher gelagert, hat daher keine Adresse, während &ding ist ok. (Wenn das jetzt verwirrend wirkt, mach dir keine Sorgen, einfach von den Worten "Ansonsten gibt es doch Unterschiede..." bis hierhin erstmals alles vergessen - es ist "advanced wissen".

Puuh... das war lang... ^_^
Frag weiter wenn du lust hast...
 
Thema:

C++ Pointer Teil 2 ---AHH !!!??!!!

ANGEBOTE & SPONSOREN

https://www.mofapower.de/

Statistik des Forums

Themen
213.180
Beiträge
1.579.174
Mitglieder
55.879
Neuestes Mitglied
stonetreck
Oben