2011-07-22 1 views
7

Toutes mes excuses, je sais qu'il y a un million de questions sur les pointeurs, les tableaux, etc. Même si c'est aussi simple que ça, je n'arrive pas à trouver une réponse.Obtenir l'adresse d'un pointeur

J'ai un pointeur qui est initialisée pour pointer vers un morceau de mémoire, je comprends que je peux accéder à cette mémoire similaire à la façon dont je un tableau:

char *mMem=new char[5000]; 
cout<<mMem[5]<<endl; 

Ce qui est en fait:

char *mMem=new char[5000]; 
cout<<*(mMem+5)<<endl; 

ce que je ne comprends pas bien comment obtenir l'adresse d'un élément - Je suis conscient du fait que l'élément est pas tout à fait le mot considérer MMEM est pas un tableau - qui est si je comprends correct, ne peut pas être trop sûr cependant parce que il semble que chaque site utilise les mots qu'il veut quand il s'agit de pointeurs et de tableaux. Donc, si j'ai:

char *mMem=new char[5000]; 
cout<<mMem[5]<<endl; 
    or 
cout<<*(mMem+5)<<endl; 

pourquoi ne l'adresse de l'opérateur fonctionne pas correctement:

cout<<&mMem[5]<<endl; 

Au lieu d'obtenir l'adresse du 5ème élément, je reçois une impression sur le contenu du bloc de mémoire à partir de cet élément. Alors, pourquoi l'adresse de l'opérateur ne fonctionnait pas comme je m'y attendais et comment puis-je obtenir l'adresse d'un élément de la mémoire?

Répondre

14

&mMem[5]est l'adresse du 5ème élément. La raison pour laquelle vous obtenez une impression de la mémoire est parce que le type &mMem[5] est char*, mais les chaînes de l'ancien C sont également de char*, donc l'opérateur << pense simplement que vous voulez imprimer une chaîne à partir de là. Je voudrais essayer couler le pointeur sur une void* avant l'impression:

cout << static_cast<void*>(&mMem[5]) << endl; 

Par ailleurs, &mMem[5] et mMem+5 sont les mêmes.

4

Vous obtenez l'adresse de l'élément 5 comme prévu, mais la fonctionnalité d'impression cout pour un char * est d'imprimer le contenu de la chaîne à cet emplacement de mémoire, pas la valeur du pointeur.

Placez le pointeur sur un int: cout << (int)&mMem[5]; et vous devriez obtenir l'adresse imprimée.

Questions connexes