2017-06-03 2 views
0

Pourquoi une conversion implicite ne se produit-elle pas lors de la création d'un pointeur flottant sur un entier, par exemple lorsque vous affectez à une variable flottante une valeur entière?Conversions et pointeurs implicites?

Répondre

1

Parce qu'un pointeur, eh bien, il doit pointer quelque part. Parce que c'est ce qu'est un pointeur. Lorsque vous avez un

int *p; 

Et vous déréférencer, comme, par exemple:

foo(*p); 

vous vous attendez à déréférencer le pointeur et finissent avec un int.

Maintenant, si vous commencez avec un float:

float *q; 

Et disons, pour l'amour de la discussion, vous pouvez le faire:

int *p=q; 

Alors, où exactement ce que vous attendez ce pointeur à pointer, maintenant? Il ne peut pas pointer vers q pointant vers. Parce que la seule chose là-bas est un float.

Donc, vous devez le faire vous-même, manuellement:

int n= (int)*q; 
int *p= &n; 

Et, bien sûr, vous devez vous assurer que n reste portée tant que le pointeur se p déréférencé. Et, si *q est modifié à une valeur différente, cela n'affectera pas ce que p pointe vers. Mais ce sont des questions différentes ...

2

Je pense qu'il est facile de raisonner à ce sujet par l'allégorie. Pensez à un pointeur comme une feuille de papier avec l'adresse d'une maison écrite dessus. Le type de données est le nom de la personne qui réside dans ladite maison. Maintenant, lancer un pointeur, c'est comme prendre ce bout de papier, en gardant l'adresse pareil (pour la plupart), mais en changeant le nom de la personne qui vit soi-disant dans la maison. Juste parce que nous avons changé le nom sur le papier d'Alice à Bob, cela ne veut pas dire qu'Alice deviendra par magie Bob. Le papier n'influence pas la maison. C'est pourquoi l'utilisation d'un tel pointeur a un comportement indéfini. Le code pense qu'il s'adresse à Bob, alors qu'en fait c'est Alice.

+2

Nice. J'y penserais probablement comme des nombres représentant différents types de choses, par exemple les numéros de téléphone et les adresses MAC. – juanchopanza