Это присваивание адреса первого байта массива {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.