2013-02-11 5 views
1

Salut, je me suis exercé avec le placement nouveau et l'utiliser pour créer des objets. Considérez ce qui suit:différence entre (void *) et &

class PNewTesting 
{ 
private: 
    string words; 

public: 
    PNewTesting(const string & w = "Placement new testing"); 
}; 

PNewTesting::PNewTesting(const string & w) 
{ 
    words = w; 
    cout << words << " constructed" << endl; 
} 


int main() 
{ 
    char * buffer = new char[BUF]; 

    PNewTesting *p1,*p2; 

    p1 = new (buffer)PNewTesting; 

    p2 = new PNewTesting("Placing object in heap"); 

    cout << "Memory addresses: " << endl; 
    cout << "buffer: " << (void *)buffer << endl; 
    cout << "object placed in buffer: " << p1 << endl; 
    cout << "object in heap: " << p2 << endl; 
} 

La partie est me source de confusion, est que quand j'écris cout << "buffer: " << &buffer << endl;, cela me donnerait une adresse différente de l'écriture cout << "buffer: " << (void *)buffer << endl;

La question est quelle est la différence entre &buffer et (void*)buffer, et pourquoi chacun d'entre eux me donne une adresse différente.

+2

Ceci est complètement indépendant du placement nouveau, btw. –

+0

Ah désolé, juste un débutant en C++ donc je ne m'en suis pas rendu compte. –

+0

C'est parfaitement bien.Mais maintenant vous savez :) –

Répondre

3

Votre question peut être essentially reduced to:

#include<iostream> 

int main() 
{ 
    int i = 10; 
    int *ptr = &i; 

    std::cout<<(void*)ptr<<"\n"; 
    std::cout<<(void*)&i<<"\n"; 
    std::cout<< &ptr<<"\n"; 
} 

Sortie:

0xbfa080b8 
0xbfa080b8 
0xbfa080bc 

ptr vous donne l'adresse de l'objet le pointeur pointe vers i.e. même que &i.
&ptr donne l'adresse de l'emplacement où le pointeur lui-même est stocké.

+0

+1 pour une réponse simple et parfaitement claire. – LihO

+0

Merci pour votre réponse. La chose que je ne comprends toujours pas est ce que (void *) & je fais? Tout ce que je sais c'est que ça me donne un type de vide, mais je ne suis pas trop sûr de l'objectif. –

+0

@AliAlamiri: Lancer l'adresse d'un pointeur entier n'a pas beaucoup de sens. La conversion de l'adresse du pointeur en char ('char *') est requise lorsque vous devez sortir l'adresse avec 'std :: cout', car à moins que vous le fassiez' operator << 'interprète cela comme une chaîne de caractères et tente d'imprimer la séquence de caractères au lieu d'une adresse. Notez que cette ambiguïté provient du fait que 'operator <<' fournit une [surcharge pour les pointeurs char] (http://www.cplusplus.com/reference/ostream/ostream/operator%3C%3C/) –

1

L'expression &buffer vous donnera l'adresse de buffer, qui est quelque part sur votre pile.

L 'EXPRESSION (void *)buffer vous donnera l'adresse contenue dans le tampon, comme un pointeur vide (dans ce cas, cela signifie que la cout affichera la valeur en tant que HexNumber représentant le pointeur, plutôt que d'essayer, par exemple, imprimer .. la valeur en tant que chaîne, qui serait ce que le code devrait normalement faire avec un char *

1

l'un de ces écrans l'adresse d'une variable, les autres affiche la valeur de la variable Tenez compte de ces:

int i = 7; 
std::cout << &i << "\n"; 
std::cout << i << "\n"; 

Le premier affiche l'adresse de la variable appelée i (probablement un grand nombre pair). L'autre affiche sa valeur (7).

De même:

char *buffer; 
std::cout << &buffer << "\n"; 
std::cout << (void*)buffer << "\n"; 

Les anciens affiche l'adresse de buffer. Ce dernier affiche sa valeur de cast.

1

La différence est simple. buffer est un pointeur sur char, donc (void*)buffer est l'emplacement en mémoire du tableau de caractères alloué (en tant que pointeur void). &buffer, d'autre part, est l'emplacement dans la mémoire de bufferlui-même.

Un diagramme peut aider; Ceci est symbolique de ce qui se passe et ne représente pas ce que la disposition de la mémoire réelle ressemblera!

Memory 
AB AB AB AB 00 00 00 08 <-- buffer = 00 00 00 08; the characters are stored starting at 0x08 
      ^
      |---------  &buffer is the memory location of buffer, and is 0x04 
30 31 32 32 AB AB AB AB 
^ 
|-------- char array starts at 0x08, and contains the string "1234" 
Questions connexes