Компилятор обрабатывает статически размещенные массивы иначе, чем float ptr.Вы можете увидеть это в gcc, скомпилировав с флагом -S.Вот код для первого и второго операторов printf:
printf("adrs: &one.s = 0x%x, &one.e = 0x%x\n", &one.s, &one.e);
movl $.LC0, %eax
leaq -16(%rbp), %rdx
leaq -16(%rbp), %rcx
movq %rcx, %rsi
movq %rax, %rdi
movl $0, %eax
call printf
printf("vals: one.s = 0x%x, one.e = 0x%x\n",one.s,one.e);
movq -16(%rbp), %rcx
movl $.LC1, %eax
leaq -16(%rbp), %rdx
movq %rcx, %rsi
movq %rax, %rdi
movl $0, %eax
call printf
Вы можете видеть, что есть две инструкции «загрузить эффективный адрес» для первого вызова (& one.s и & one.e), но толькоодна такая команда для второго вызова printf.Команда "leaq -16 (% rbp),% rdx" перемещает адрес% rbp-16 (на 2 байта меньше, чем хранилище адресов в регистре% rbp) в регистр% rdx, где он затем используется printfКоманда для заполнения вывода для one.e.В первой версии эта команда повторяется для загрузки того же адреса в% rcx.
Во второй версии регистр% rcx заполняется командой "movq -16 (% rbp),% rcx",В отличие от «leaq», «movq» - это инструкция для поиска в памяти значения по указанному адресу (% rbp-16).