WCM Forum

WCM Forum (http://www.wcm.at/forum/index.php)
-   Programmierung (http://www.wcm.at/forum/forumdisplay.php?f=17)
-   -   Unterschied zwischen Pointer und Zeiger in C++? (http://www.wcm.at/forum/showthread.php?t=52547)

Hamster Riot 08.04.2002 19:27

Unterschied zwischen Pointer und Zeiger in C++?
 
Hallo Leute!

Vor ein paar Tage habe ich begonnen c++ zu programmiern und bin dabei über pointer und zeiger gestolpert. Leider kann ich nicht herausfinden, was der Unterschied ist. Was macht das Zeichen * bzw. das Zeichen &??

Könnt ihr mir auch Literatur empfehlen, wo etwas nachlesen bzw. neues Lernen kann. (sollte bei null anfangen).

Danke! Ciao Hamster Riot

Andre@s 08.04.2002 20:06

C++ für Dummies. Kein Mist, verwende ich selbst gerade, ist brauchbar, und auch lesbar geschrieben.

Wenn du auf der MS-Schiene bist, bist bei Microsoft Press auch gut aufgehoben (Visual C++ Schritt für Schritt), oder auch hier Visual C für Dummies.

Aber über C/C++ gibt´s ja ewig viele Bücher, kannst aus dem Vollen schöpfen, sozusagen.

it00x30 08.04.2002 20:11

ein pointer ist ein zeiger

ein variablenname mit einem * davor ist ein pointer auf diese variable
zb ist int *test ein zeiger auf eine integer variable (du kannst dir auch vorstellen es handelt sich um den typ "int *" -> also ein integerpointer

das & bewirkt, dass aus einem pointer wieder der wert der variablen wird:
wenn du zum beispiel eine pointervariable int *test hast und damit rechnen willst musst du mit "&test" arbeiten, da du sonst die adresse anstatt dem integerwert bekommen würdest

ein kleiner buchtipp am rande: practical c++ programming aus dem o'reilly verlag - das beste das ich kenne - auch und gerade für anfänger geeignet

Andre@s 08.04.2002 20:22

Ja, ist sehr gut (habs bei mir im Kasten stehen - noch zur Zeit), aber nicht für jeden geeignet, da in Englisch..... Mein Englisch ist zwar halbwegs passabel, aber beim Lernen lese ich doch lieber Ausdrücke, die ich nicht extra im Wörterbuch (falls überhaupt vorhanden) suchen muß. Und diese Ausdrücke können bei Programmiersprachen sehr umfangreich, und auch sehr mißverständlich sein, so daß dies nicht gerade förderlich wäre.

Ich programmiere mittlerweile (nach jahrelanger Berufserfahrung) in einigen Programmiersprachen, und habe auch etliche englische Manuals durchgeackert, aber beim Selbststudium (und das ist es gerade bei C bei mir), ist mir Deutsch einfach lieber.

Flink 08.04.2002 23:34

Das Standardwerk für C++-Programmierung ist das Buch von Bjarne Stroustrup .

kikakater 09.04.2002 02:01

@Hamster Riot wie alle anderen:

* bedeutet bei der Variablendefinition, daß eine Zeiger- - auch Pointer- - Variable genannt angelegt wird, die auf den Datentyp zeigt der vor dem '*' Zeichen steht.

Das Beispiel dazu lautet wie folgt:

Also kurz mal durchblasen:

int integer_variable;

eine Zeigervariable auf ein Integerdatum definiert man allerdings so:

int * zeiger_auf_eine_integer_variable;

bzw.

int * pointer_auf_eine_integer_variable;

Pointer ist lediglich der englische Ausdruck für das Wort 'Zeiger' im Deutschen.

Was eine Zeigervariable macht ist einfach:

Man speichert in ihr eine Adresse des Computerspeichers, sonst nichts !

An dieser Adresse - auf die so eine Zeigervariable verweist - stehen dann (eine Abfolge von) Daten, oder EIN Datum. Wie eben - beispielsweise - ein Wert vom Typ int.

Die Verwendung von * und & im Programmcode und nicht bei der Definiton von Zeigern bedeutet nachfolgend das:

*zeigervariable liefert den Wert der Daten / des Datums, auf das die Adreßvariable 'zeigervariable' verweist.

&integervariable liefert die Adresse der Variable 'integervariable'.

int x,*zeiger_auf_x;

x=2;

zeiger_auf_x= &x;

*zeiger_auf_x= 3;

printf("%d\n",x); /* in x steht bereits 3 obwohl x nur indirekt - eben über einen Zeiger (=Zeigervariable) - verändert worden ist */

Bei Übergabeparametern bedeutet das Zeichen '&' (=Ampersand) die Deklaration einer sogenannten Referenz. Eine Referenz bedeutet einen Zeiger zu übergeben und in genau eben in dieser selben Funktion, in der diese 'Referenz' als einer der Übergabeparameter deklariert wurde, diesen Referenzübergabeparameter so zu verwenden wie in der aufrufenden Funktion.

Ein nachfolgendes Beispiel:

void double_it (int &variable)
{
variable *= 2;
}

void main (void)
{
int zentimeterlaenge;

zentimeterlaenge= 100;

printf("Länge in Zentimetern: %d\n",zentimeterlaenge);

double_it(zentimeterlaenge);

printf("doppelte Länge in Zentimetern: %d\n",zentimeterlaenge);
}

D.h. das Ampersand '&' bedeutet bei der Verwendung innerhalb einer Funktion 'Adresse von' und beim Deklarieren eines Übergabeparameters 'Variable von außerhalb übernommen'.

Das Zeichen '*' bedeutet beim Definieren von Variablen 'Zeiger auf ...' ( ... Datentyp ) und beim Verwenden in einer Funktion innerhalb von C-Befehlskonstrukten 'Wert an der Adresse ... xy ...'.

Das xy ist dann der Inhalt einer Adreß- (=Zeiger-) Variable.

mfg Kikakater

Flink 09.04.2002 09:18

Und bei Klassen in C++ ist es so, daß '*' und '&' vom Programmierer selbst programmiert werden können. Das macht einem das Leben schwer, wenn man nicht genau weiß, auf welche Art diese Operatoren überladen worden sind. Man glaubt, es sei ein Pointer auf eine Klasse, doch womöglich liefert der *-Operator über Typecasting den Inhalt einer selbst verwalteten Speicheradresse. :eek:

kikakater 09.04.2002 16:00

Null problemo dazu denn:

int **_16bit_variable;

*_16bit_variable liefert - und das ist nativer C-Code - schließlich und endlich auch eine Adresse, weil hier ein Zeiger auf einen Zeiger auf einen Integerspeicherplatz (2 Byte Datentyp) definiert worden ist mit int **_16bit_variable; ZeigeraufZeigervariablename.

Entscheidend bei so einer Überladerei ist das Holzhackenprogrammieren außen vor zu lassen. * liefert immer einen Wert, Zeiger auf Zeiger liefern halt eine Adresse logischerweise, insofern legitimerweise.

Und & ist ebenso einzusetzen, abseits der törichten Verwendung als etwas anderes als als Adressenlieferantoperator. Zweimal als, schon schön das Leben ;) Davor sogar bereits gar einmal. Tja, in klaren Worten: & liefert eine Adresse, wer sich skalare Werte liefern lässt durch das Überladen handelt damit fahrlässig. Das heißt man sollte tunlichst auf die mathematische Funktionalität von C/C++ nicht verzichten um Tricks umzusetzen.

Solche Ratschläge finden sich auch in Büchern zu C++ um derartige Brachial- nicht Anfänger- Fehler nicht zu begehen.

* bedeutet 'Wert von'
& bedeutet 'Adresse von'

mfg
Kikakater


Alle Zeitangaben in WEZ +2. Es ist jetzt 16:40 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 2009 FSL Verlag