Технически говоря, стандарт C гарантирует, что sizeof (char) == 1, а остальное зависит от реализации. Но на современных архитектурах x86 (например, на чипах Intel / AMD) это вполне предсказуемо.
Возможно, вы слышали, что процессоры описываются как 16-разрядные, 32-разрядные, 64-разрядные и т. Д. Обычно это означает, что процессор использует N-разрядные числа для целых чисел. Поскольку указатели хранят адреса памяти, а адреса памяти являются целыми числами, это фактически говорит вам, сколько битов будет использоваться для указателей. sizeof обычно измеряется в байтах, поэтому код, скомпилированный для 32-разрядных процессоров, сообщит, что размер указателей равен 4 (32 бита / 8 бит на байт), а код для 64-разрядных процессоров сообщит, что размер указателей равен 8 (64 бита / 8 бит на байт). Отсюда и ограничение в 4 ГБ ОЗУ для 32-разрядных процессоров - если каждый адрес памяти соответствует байту, для адресации большего объема памяти нужны целые числа больше 32-разрядных.