Typecasting int pointeur pour faire flotter le pointeur

J’essaie de faire ce qui suit

int a[8]={1,2,3,4,5,6,7,8}; printf("%f\n", *(float *)a); printf("%f\n", *((float *)a+1)); printf("%f\n", *((float *)a+2)); printf("%f\n", *((float *)a+3)); printf("%f\n", *((float *)a+4)); printf("%f\n", *((float *)a+5)); printf("%f\n", *((float *)a+6)); printf("%f\n", *((float *)a+7)); 

Je reçois

 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 

La raison pour laquelle j’essaie d’imprimer les éléments de cette manière est que je veux convertir le pointeur int du tableau en pointeur float et le transmettre en tant que paramètre d’une autre fonction qui ne prend que float * .

Il semble que cela ne fonctionne pas bien. Quelqu’un peut-il expliquer pourquoi cela ne fonctionne pas?

 int *ptr; function((float *)ptr); 

Si je le fais, la fonction ne lit pas les valeurs que le pointeur pointe correctement. Il ne fait que renvoyer 0.0000 .

Ce n’est pas correct int et float ne sont pas garantis d’avoir le même alignement.

Rappelez-vous: la conversion d’une valeur et la conversion d’un pointeur sont des scénarios différents. La conversion d’un pointeur modifie la manière de faire référence à la valeur de type , ce qui peut presque certainement entraîner un mauvais alignement dans la plupart des cas.

Conformément au document standard C11 , chapitre §6.3.2.3

Un pointeur sur un type d’object peut être converti en un pointeur sur un type d’object différent. Si le pointeur résultant n’est pas correctement aligné 68) pour le type référencé, le comportement est indéfini.

Dans votre cas, une solution de rechange peut être

 printf("%f\n", (float)*a); //cast the value, not the pointer 

Vous ne pouvez pas convertir un pointeur en int en un pointeur à float et vous attendre à convertir votre valeur en nombre correspondant dans une représentation en virgule flottante. La conversion d’une seule valeur fonctionne, mais la modification d’un type de pointeur ne modifie pas la représentation.

Si vous avez besoin d’un tableau de float s, déclarez un tableau de float s et convertissez un élément à la fois:

 float b[8]; for (int i = 0 ; i != 8 ; i++) { b[i] = a[i]; } func_expects_float(b, 8); 

La conversion d’un pointeur int en float ne convertit pas l’entier en nombre à virgule flottante. La conversion indique simplement à la machine d’utiliser le contenu de l’emplacement mémoire indiqué par le pointeur en tant que valeur à virgule flottante au lieu d’un nombre entier. Mais cela ne change pas la valeur de la représentation entière à la représentation à virgule flottante.

vous pourriez essayer:

 printf( "%f\n", 1.0f * a[0]); printf( "%f\n", 1.0f * a[1]); .... 

== ou ==

 printf( "%f\n", *(a+0) * 1.0f ); printf( "%f\n", *(a+1) * 1.0f ); ....