When you write
node* first_block = (node*)arr;
you do not change anything in memory, you get a pointer to a region in memory, the type of pointer determines how the region is processed with respect to pointer arithmetic.
first_block->next will be a pointer, which is determined by the characters in the array.
as a comparison they say that you have a char * pointer for the same array
(if arr is declared in the global scope, it will contain 0)
char* q = arr;
node* p = (node*)arr;
arr[1000]
+----------------------+
q -> | | | | |
| 0 | 0 | ... | 0 |
p -> | | | | |
+----------------------+
when you do
q = q + 1;
when you do
p = p + 1;
* q, , q , * p node char arr, node.