2010-07-29 3 views
2

j'ai le code suivantquestion sur reinterpret_cast

#include <iostream> 
using namespace std; 
int main(){ 

    int i; 
    char *p="this is a string"; 
    i=reinterpret_cast<int>(p); 
    cout<<i<<"\n": 



    return 0; 
} 

sortie est: s'il vous plaît expliquer reinterpret_cast

Répondre

1

reinterpret_cast<> ici convertira sans vérifier le pointeur p à un int mais vous ne pouvez pas faire une hypothèse que ce int représenterait. La seule chose que vous pouvez faire, c'est de ramener ce pointeur à ce qu'il était.

Sur une note plus pratique, il est probable que votre compilateur mettre l'adresse p points dans la valeur int, mais la taille int peut ne pas correspondre à une taille du pointeur de système, vous devriez donc probablement utiliser quelque chose comme uintptr_t pour qu'au lieu de int.

Vous pouvez utiliser quelque chose comme Boost lexical_cast<> qui essaierait de convertir une représentation sous forme de chaîne d'un nombre entier en nombre entier réel, mais je ne suis pas sûr que c'était votre objectif ici.

+1

Il lance un pointeur char à un int, pas un caractère à un int. De toute façon, c'est indéfini. –

+0

@Axel: Vous avez absolument raison. Fixé. Merci. – ereOn

+3

Sauf que cette réponse est toujours fausse. Si nous ne pouvions pas utiliser 'reinterpret_cast' dans ce cas, que pourrions-nous utiliser d'autre? Lancer quelque chose de non apparenté comme 'char *' à 'int' est exactement ce que' reinterpret_cast' est pour__.Bien sûr, le résultat pourrait, selon la norme, être n'importe quoi et dépend fortement de la plate-forme. Mais quand vous en avez besoin, vous 'reinterpret_cast' est ce que la norme fournit. – sbi

2

Voir here.

Qu'est-ce qui n'est pas clair? Soyez précis s'il vous plait. Recherchez également avant de demander, il y a de nombreuses questions à ce sujet sur SO.

1

Il n'y a pas grand-chose à expliquer. Le résultat de reinterpret_cast est spécifique à la plate-forme. Ce que vous êtes sorties de test est probablement soit l'adresse de la constante de chaîne ou tout ce qui reste de celle-ci quand il est forcé dans un int.

4

reinterpret_cast provoque la prise en compte des données que vous diffusez comme étant de type différent, sans qu'aucune conversion ne soit effectuée. Selon la norme, la seule chose qui est définie comportement après un reinterpret_cast est à reinterpret_cast revenir au type d'origine.

Cela semble un peu inutile, mais l'une des raisons pour lesquelles vous voudrez peut-être l'utiliser est, par exemple, d'utiliser certaines bibliothèques C (par exemple pthreads) en C++. Un grand nombre de bibliothèques C qui impliquent des rappels transmettent un paramètre de type void* au rappel. En C++, la bonne façon de traiter cela est de prendre un pointeur vers ce que vous voulez utiliser comme paramètre, reinterpret_cast vers void* en le passant dans la bibliothèque C, puis reinterpret_cast vers quoi il se trouve dans le rappel .

Bien qu'il ne soit pas guranteed à comportement défini par la norme, sur la plupart des plates-formes/compilateurs, quel reinterpret_cast fait est simplement considérer les données à un autre type, en utilisant la même configuration binaire. Par exemple, si vous avez un double d 32 bits dont le modèle de bit est 01101010 00111100 01101010 01000001 et que vous écrivez int i = reinterpret_cast<int>(d), alors i sera un entier dont le modèle de bit 01101010 00111100 01101010 01000001, même si cela représentera une valeur numérique totalement différente de celle d'un entier. il a fait comme un double. Et évidemment, cela peut vous causer des ennuis rapidement si les types impliqués ne sont pas de la même taille.