Указатели - это переменные, в которых хранятся ячейки памяти. Таким образом, все указатели имеют один и тот же диапазон значений (целые числа от 0 до максимального места памяти поддержки).
Теперь указатели поддерживают операцию, называемую разыменованием: доступ к объекту, хранящемуся на этом адресе памяти. Если у вас есть адрес памяти, и вы хотите получить доступ к этому объекту, вам нужно знать вещи как размер объекта (в байтах) и много вещей, связанных с тем, как фактически интерпретировать значения там. Все это известно по типу.Итак, у нас есть указатели разных типов, и мы можем конвертировать между ними, поскольку все они имеют одну и ту же область значений.
Это означает, что, изменяя тип указателя, вы можете иметь другую интерпретацию одного и того же объекта.
Вернемся к вашему вопросу. Функция записи, которую вы указали, должна записываться в байтовый поток по байтам (имеет отношение ко многим причинам, например, тот факт, что байт является наименьшей единицей хранения, поэтому вы можете писать что угодно, записывая свои байты). Теперь у вас есть 4 байта int, к которому вы хотите получить байтовый байт. Как вы это делаете? Просто получив указатель на него, преобразуйте его в тип размера байта (char) и получите доступ к 4 байтам, используя арифметику указателя (в основном доступ к 4 последовательным ячейкам памяти) - вот почему вам также нужно отправить размер типа. В качестве меры предосторожности запрашиваемый тип первого аргумента - const char*
, чтобы гарантировать, что он не изменит данные.
Теперь, в вашем случае, литье (преобразование указателя) было сделано явным.
Кастинг 'uint32_t' на' char' через указатель, вероятно, вызовет разное поведение на маленьких конечных и больших энтианских машинах. – JHBonarius