C++ de conversion de type avec des pointeurs
Je viens d'un milieu de C# et Java et je n'arrive pas à comprendre ce casting avec des pointeurs signifie en C++.
Par exemple:
int x = 1;
char c = *((char*)&x);
Que fait-il? Ce que c'est utile pour?
- En C++, vous devez éviter de jeter. Le Casting est une façon de dire au compilateur "non, non, vous pensez que c'est mal, mais je suis sûr que j'ai raison". En C++ si c'est toujours mieux de faire le compilateur droit tout le temps. Le Casting est une façon de supprimer les erreurs du compilateur. Donc, fondamentalement, c'est plus constructif à poser au sujet du casting pour un usage particulier, plutôt que de casting en général. Les deux exemples devraient être évités en C++ entièrement.
- Voulez-vous savoir sur le casting avec des pointeurs en général ou à partir de votre exemple, il peut sembler être la différence entre la coulée de
char *
etchar const *
? - J'ai édité le post, maintenant, il devrait être plus clair, je pense.
- Ni de vos exemples de compilation, de sorte qu'ils ne sont pas significatives.
- après la modifier le code ne peut pas compiler: doit être
char c = *((char*)x);
- Je veux savoir ce qui est pas dans la variable c par exemple, ce que c'est un moyen de fonte avec le symbole *. Je suis venue à partir d'un fond de c# et java et je ne sais pas si c'est seulement moi, mais j'utilise de la coulée dans ces langues pour la conversion de double, float, et ce genre de choses.
- vous avez au moins besoin de poster un exemple qui compile, mais même si vous n'avez que cela ne signifie pas qu'il est légal de C++. Parfois en C++, vous avez un pointeur vers un type, mais vraiment, vous savez que c'est un pointeur vers un autre type, si vous le lancez.
- J'ai édité et je pense que maintenant il doit compiler et d'expliquer ce qui est de la question plus clairement.
- Où avez-vous trouver le code qui projette avec *s de toute façon?
- Ce que vos exemples ne il prendre la valeur de l'entier 1, et prétendre que c'est un pointeur. Bien sûr, il est très peu probable que 1 représente un juridique, l'adresse de mémoire, de sorte que tout programme qui a utilisé ce "pointeur" est très probablement un crash assez rapidement.
Vous devez vous connecter pour publier un commentaire.
Dans les deux exemples que vous avez à faire des erreurs du code compile pas. Donc je vais supposer que vous essayez d'effectuer les opérations suivantes:
En fonction de votre architecture,
c
auront désormais soit la valeur de la moins ou de l'octet le plus significatif dex
. Dans cet exemple, ce serait soit de 0 ou de 1 (ce qui peut effectivement être utilisé pour détecter l'octet de commande).Votre deuxième exemple ne fonctionnera pas, car vous êtes en essayant d'ignorer la
const
résultant en une opération illégale/mauvais cast (ce qui est aussi appelé "const correctness").Edit: Concernant votre commentaire sur "ça veut dire quoi?":
Dans les expressions:
&somevariable
sera de retour l'adresse desomevariable
.*somevariable
assumera le contenu desomevariable
sont l'adresse de la valeur réelle, qui est ensuite retourné.Dans les déclarations:
datatype
est une variable normale/objet. C'est passé "par valeur".datatype&
est une référence. Cela fonctionne exactement comme les variables normales en Java/C# et est passé par référence.datatype*
est un pointeur. Cette juste contient l'adresse où la valeur réelle est situé (voir ci-dessus) et est essentiellement transmis par référence.Réelle jette travaillent à peu près similaire à Java/C#, mais les pointeurs sont ce qu'ils sont: Ils point à l'emplacement de la valeur réelle. Alors que l'on pourrait vous confondre, les pointeurs en C/C++ de travail à peu près comme les variables standard/références utilisées en Java/C#.
Regardez ceci:
Casting en C++ fonctionne exactement comme la coulée en Java, pas de pointeurs.
Cependant, ce que vous faites ici:
est de dire au compilateur que la valeur de
x
est l'adresse d'un personnage. Il est équivalent àIl y a très peu de fois vous avez besoin pour ce faire.
Il y a deux fondamentalement des concepts différents, en C++, qui sont parfois appelés "casting": l'Un est conversion, et on est réinterprétation.
Conversion crée un nouvel objet avec la "même valeur" comme un objet existant, mais d'un type différent. Voici quelques exemples:
Exemple 1: type de promotion
Exemple 2: Dérivés à base de conversion
D'autre part, réinterprétation nous permet de traiter une variable comme si elle était une autre. Sur le seul bon et utile pour ce qui est sérialisation, sous une forme ou une autre.
Exemple 3: La Sérialisation
La norme dit que c'est un comportement indéterminé d'accès à un objet par l'intermédiaire d'un pointeur qui n'est pas du bon type (également appelé "type beaucoup les jeux de mots"). Alors qu'il est OK pour stocker un pointeur d'objet, disons, d'un
void*
et puis le convertir en arrière et utiliser, il est pas OK pour traiter un flotteur comme s'il s'agissait d'un nombre entier, etc. Le seulement acceptable moyen d'accéder à un objet comme si c'était un autre est celui que j'ai démontré, à savoir le traitement d'un objet de typeT
comme si c'était un tableauchar[sizeof(T)]
— qui est, vous êtes autorisé à accéder au sous-jacente représentation binaire de chaque objet.Vous devriez éviter de c-type jette comme (char*) par tous les moyens. Si vous avez vraiment à faire un type de fonte ont un coup d'oeil à
dynamic_cast
,static_cast
etreinterpret_cast
.Mais comme déjà dit, vous aurez rarement besoin de coulée à tous.
Jetez un oeil ici pour fruther de l'information:
http://www.cplusplus.com/doc/tutorial/typecasting/
http://www.parashift.com/c++-faq/static-typing-and-cpp.html
http://www.parashift.com/c++-faq-lite/print-char-or-ptr-as-number.html
J'ai utilisé de nombreuses fois auparavant, qui s'attacha à l'accès MATÉRIEL à l'adresse indiquée, sur la coutume IO conseil d'administration. Ainsi, par exemple, pour écrire à PIC (programmable interrupt controller) pour réinitialiser certains drapeau (fictifs code):