Когда вы инициализируете массив, каждый инициализатор устанавливает элемент массива независимо от того, сколько байтов занимает каждый элемент.
На вашем компьютере, вероятно, используется порядок байтов с прямым порядком байтов.Это означает, что array
выглядит в памяти следующим образом:
-----------------------------------------------------------------
| 1 | 0 | 0 | 0 | 2 | 0 | 0 | 0 | 3 | 0 | 0 | 0 | 4 | 0 | 0 | 0 | ...
-----------------------------------------------------------------
| [0] | [1] | [2] | [3] | ...
Каждое значение типа uint32_t
имеет длину 4 байта, а младший байт занимает первое место.
Когда вы делаете (char*)array
который преобразует array
(преобразованный в указатель) в char *
, поэтому любая арифметика указателя на char *
увеличивает адрес на величину char
, которая равна 1.
(char*)array + 8
указывает здесь:
(char*)array + 8 ------------------
v
-----------------------------------------------------------------
| 1 | 0 | 0 | 0 | 2 | 0 | 0 | 0 | 3 | 0 | 0 | 0 | 4 | 0 | 0 | 0 | ...
-----------------------------------------------------------------
| [0] | [1] | [2] | [3] | ...
Этот указатель затем преобразуется в uint32_t *
и разыменовывается, поэтому он читает значение 3.