@avion123678

Поведение указателей в Cи?

Здравствуйте, что означает выражение float* arr = {0, 0, 0, 0}; Это присваивание адреса первого байта массива {0, 0, 0, 0} указателю float? Если да, то что происходит с элементами в массиве, они становятся элементами типа float?
И что будет в i, после данных действий?
float* arr = {0, 0, 0, 0};
int i = *((int*)arr);
  • Вопрос задан
  • 160 просмотров
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Это присваивание адреса первого байта массива {0, 0, 0, 0} указателю float?

Нет. Так можно было бы инициализировать массив. Но если так инициализировать указатель, то это присваивание самому указателю значения 0.

что будет в i, после данных действий?

сегфолт при попытке разыменования указателя.

Начиная с с99 можно сделать так:
float* arr = (float []){0, 0, 0, 0};
и это означает создание в текущем контексте (на стеке, если эта строчка внутри функции, или в глобальных данных, если вне) массива из 4 элементов типа флоат, инициализация их нулями и присваивание указателю arr адреса этого массива.
В этом случае int i = *((int*)arr); проинтерпретирует память первого элемента массива как целое число и присвоит его значение i. По стандарту ieee754 нулевое значение типа float представляется в памяти как 4 нулевых байта, соответственно в i будет записан 0.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@towin
arr будет указывать на первый байт первого элемента массива float чисел.
Если мы этот указатель float* преобразовываем в указатель int*, то мы начинаем работать с данными как c int. Что будет в i - двоичное представление числа float, но прочитанного как int, то есть практически мусор. Никакого округления до целого числа производиться не будет.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы