Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Pointer frage ...

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
25.05.2005, 17:27 Uhr
Xident



Hi!

Da dies mein erster Post/Thread ist und ich noch eher neu auf dieser Site bin, hab ich vorher gründlich die Suchfunktion genutzt um Themen die auf mein Problem zielen herausgesucht und bin leider doch nicht klüger geworden.

Nun, ums kurz zu machen:

Ich verstehe etwas nicht, überhaupt nicht - habe die letzten 2 Tage darüber hin und herüberlegt und versucht es mir irgendwie zu erklären, leider ohne Erfolg. Darum bitte ich euch um hilfe, bzw. um Erklärung (und ja... ich hab circa 4 Bücher gewälzt und es hat auch leider nie dieses Problem angestoßen...)

Es geht um folgendes:

Auf der Speicheradresse (absolut) 0x5a0L ist eine Adresse auf eine Liste gespeichert. Diese wiederum besteht aus zwei Longwerten (ich gehe davon aus das Long hierbei 4 Byte groß ist ... ist halt für ne 32Bit CPU).

Im ganzen sieht der Code (den ich gefunden habe) so aus:

C++:
#include <stdio.h>
#include <string.h>

typedef struct
{
    union {
        char ascii[4];
        long val;
    } tag;
    long val;
} COOKIE;

int main(void)
{
    COOKIE *c = *((COOKIE **) 0x5a0L);
    char temp[5];
    strncpy(temp,c[0].tag.ascii,4);
    temp[4]='\0';
    
    printf("%s",temp);
    return 0;
}



****
Ist eigentlich eine ganz einfache Sache, wie man sieht. Es geht mir auch nur um diesen einen Ausdruck den ich nicht verstehe:

C++:
COOKIE *c = *((COOKIE **) 0x5a0L);


Ich verstehe nicht warum ich das * vor die in Klammer gesetzte indirektion setzen muß. Für mich bedeutet schon dieses ((COOKIE**) 0x5a0L)
das ich zweimal eine indirektion ausführe. Das * (also das vor ((COOKIE **) 0x5a0L) ) bedeute für mich (und deshalb verstehe ich es nicht) das ich den ersten Wert aus der Liste bereits auslese, obwohl ich ja eigentlich COOKIE *c = die adresse dieser mitteilen möchte.

Oder hat das ganze Thema was mit casting zu tun?

Nur um es wirklich noch mal klar zu stellen, wenn ich meine Speicherstellen anschaue:


C++:
Adresse        |    Wert
$5a0L         | $100000 (beispiel ... aber hier steht ja die liste )
....        
$100000L    | "ABCD"
$100004L    | 2135442.L



Ich möchte also *c auf die adresse von $100000L setzen, diese steht fest in der Adresse $5a0L. Und wie bereits gesagt verstehe ich es nicht warum ich ein -> * <- vor ((COOKIE **) 0x5a0L) setzen muss, da ich der meinung bin, das ich damit bereits schon den Wert "ABCD" auslese und damit dann auch gleich *c initialisiere und nicht $100000L..

Vielen dank schon mal im voraus und bitte helft mir, es ist mir wirklich wichtig!


Bearbeitung von Windalf:

Bitte Codetags verwenden!!!!


Dieser Post wurde am 25.05.2005 um 17:29 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
25.05.2005, 17:37 Uhr
Reyx
IT-fetischistischer Wurstsalat mit rostigem Berghorn
(Operator)


* ist in dem Fall der Dereferenzierungsoperator, dass heißt, dass du nicht die Adresse bekommst, sondern die Variable, auf die der Pointer zeigt; Meintest du das?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
25.05.2005, 17:50 Uhr
Xident



Also im großen und ganzen ist das für mich (das oben geschilderte Problem) das ich nicht verstehe warum ich das * vor ((COOKIE **) 0x5A0L) setzen muß, da ich mir denke das ((COOKIE **) ->**<- schon derefernziert auf die die Adresse der Liste.

Also entspricht für mich

C++:
COOKIE *c = *((COOKIE **) 0x5a0L);


vom prinzip her dem hier:

C++:
int i=5;
int *p1=&i;
int *p=*p1;  <---- Das hier... und das ist ja nicht möglich..


Dieser Post wurde am 25.05.2005 um 17:57 Uhr von Xident editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
25.05.2005, 17:57 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)



C++:
int *p=*p1;


das geht nicht... in dem einem fall ist das * die definition für einen pointer in dem anderen fall ist es das dereferenzieren des pointers p1...


C++:
((COOKIE **) ->**<-


das ist ein cast nach einen doppelpinter vom typ COOKIE
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
25.05.2005, 18:04 Uhr
Xident



Okay hab ich soweit verstanden, das ich nach dem doppeltem ** es nach dem typ COOKIE caste. Aber warum muß ich der Variable *c vom Typ Cookie das mit


C++:
COOKIE *c= *((COOKIE **) 0x5a0l);

mitteilen und warum geht nicht einfach:

COOKIE *c=((COOKIE **) 0x5a0L);



Mir scheint ich habe einen Denkfehler und ich weiß nicht woran es liegt.

für mich bedeutet das >richtige< Beispiel das ich schon den ersten wert auslese und *c diese mitteile als Adresse.

Das zweite hat für mich den logischeren (anscheinend nicht so logischen) ansatz, weil ich hier die Adresse übergebe und nicht aus dieser auslese und dann übergebe.

Help? ! ... könnt heulen...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
25.05.2005, 18:52 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


naja zweite methode gibt dir keinen pointer zurück sondern einen ein "2d-pointer", beim ersten wird diese eine dimension weg dereferenziert wodurch du dann einen normalen pointer aufs (erste) element an der angegeben adresse erhälst
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
25.05.2005, 18:53 Uhr
Spacelord
Hoffnungsloser Fall


Hi,
was da an der Adresse 0x5a0L steht ist vom Datentyp COOKIE**,also ein Zeiger auf einen Zeiger der auf eine COOKIE Struktur zeigt.

Mit

C++:
COOKIE *c= *((COOKIE **) 0x5a0l);



dereferenzierst du den Zeiger auf einen Zeiger,liest also den Inhalt der Adresse und dieser Inhalt ist vom Typ Zeiger auf eine COOKIE Struktur.



MfG Spacelord


Bearbeitung von Spacelord:

Von dem ganzen Zeiger auf Zeiger Gelaber wird einem ja ganz schwummerig....


--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.

Dieser Post wurde am 25.05.2005 um 18:56 Uhr von Spacelord editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
25.05.2005, 19:36 Uhr
Xident



Sehe ich das richtig das ich das * vor dem ((cookie **) schlagmichtod) brauche um wirklich erst die dereferenzierung auszuführen ?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
25.05.2005, 19:46 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Also ich versuchs nochmal in kurz


C++:
COOKIE *c= *((COOKIE **) 0x5a0l);



1) c ist ein pointer des Types COOKIE...
2) (COOKIE**) castet die Hexadresse zu einem Pointer auf einen Pointer des Types COOKIE...

3) wenn du das ganze jetzt dereferenzierst bekommst du den COOKIE-pointer auf den der doppelpointer vom Typ COOKIE gezeigt hat.... dieser pointer den du jetzt c genannt hast liegt also selber im speicher an der oben angegeben HEXadresse...



Das ist wie bei Life of Brian. Und von ihre Väter Väter Väter.... Guck dir den Film nochmal an dann verstehst du auch das Pointerprinzip
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 25.05.2005 um 19:47 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
25.05.2005, 20:03 Uhr
Spacelord
Hoffnungsloser Fall


Ja natürlich.Warum sollte der Zeiger sich selbst dereferenzieren?
Die **´s hinter dem Cookie beziehen sich auf den Datentyp. Das * davor ist der Dereferenzierungsoperator.Das sind 2 völlig unterschiedliche Bedeutungen.


C++:
int i=123;
int *p = &i;  // p zeigt auf  i
cout<<p<<endl; // ne Speicheradresse
cout<<&i<<endl;// das gleiche
cout<<*p<<endl;// der Inhalt von p,also i
*p=321; //den Inhalt von p ändern,also i
cout<<i<<endl;
p=(int*)123;  //p selbst ändern
*p=1;// den Inhalt von p ändern,gibt warscheinlich ne Access Violation ;)




MfG Spacelord

EDIT: Jetzt war ich aber krass zu spät dran
@Windalf: Das Leben des Brian ist Kultur aber im Zusammenhang mit Pointern habe ich den noch nicht gesehen
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.

Dieser Post wurde am 25.05.2005 um 20:08 Uhr von Spacelord editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: