2015-05-16 5 views
2

Я пытаюсь сделать следующееПриведение типов INT указатель плавать указатель

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)); 

Я получаю

0.000000 
0.000000 
0.000000 
0.000000 
0.000000 
0.000000 
0.000000 
0.000000 

Причина, почему я пытаюсь напечатать элементы таким образом, потому что, Я хочу передать int указатель на массив указателю float и передать его как параметр для другой функции, которая принимает только float *.

Кажется, что это не работает. Может кто-нибудь объяснить, почему это не работает?

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

Если я делаю это функция не читает значения указатель указывает на правильно .. только возвращение 0.0000.

+0

Какова ваша ожидаемая стоимость? – BLUEPIXY

+1

Почему вы это делаете? –

ответ

4

Неправильное использование. int и float не гарантируется одинакового выравнивания.

Помните: отличное значение и литье указателя - это разные сценарии. Кастинг указатель изменяет пути для обозначения типа значения , который может почти наверняка результат в неправильном выравнивания в большинство случаев.

В соответствии с C11 стандартного документа, глава §6.3.2.3

Указатель на тип объекта может быть преобразован в указатель на другой тип объекта. Если полученный указатель неправильно выровнен 68) для ссылочного типа, поведение не определено.

В вашем случае обходным может быть

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

Вопрос задан для C, а не C++ –

+0

@infiniteloop Если мне не срочно нужно записаться к офтальмологу, я не вижу упоминания CPP в своем ответе, и я считаю, что мне не нужно заказать посещение. разъяснение, пожалуйста? –

+1

Искренние извинения @ Сурав. Я не обратил на это внимания. –

1

Вы не можете бросить указатель на int к указателю float, и ожидать, чтобы получить значение преобразуется в соответствующее число в представлении с плавающей запятой. Выполнение одного значения работает, но приведение в действие путем изменения типа указателя не изменяет представление.

Если вам нужен массив float с, объявить массив float с, и бросил один элемент в то время:

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

Кастинг Int указатель на поплавок не преобразует целое число к число с плавающей запятой. Кастинг просто говорит машине использовать содержимое ячейки памяти, на которое указывает указатель, как значение с плавающей запятой, а не целое значение. Но это не меняет значение из целочисленного представления в представление с плавающей запятой.

0

вы можете попробовать:

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

== или ==

printf("%f\n", *(a+0) * 1.0f); 
printf("%f\n", *(a+1) * 1.0f); 
.... 
Смежные вопросы