Q:

Aritmética de ponteiros em C

Estou com dúvida em um jeito de saber o comprimento de um vetor sem usar sizeof:
int n = *(&arr + 1) - arr;

Sabe-se que: 
arr é do tipo int ( * ) e (&arr + 1) é do tipo int ( * )[size]. 
Qual a função do *?   
É para pegar o valor do endereço (&arr + 1) ou para fazer um cast de int ( * )[size] para int ( * )? 

A:

O operador * (asterisco ou estrela) sempre é usado para "derreferenciar" um endereço, ou seja, ele pega o valor que está naquele endereço, nada mais que isto, nada tem a ver com cast.  Pra falar a verdade nem sei do que se trata o resto da pergunta de tão confuso que está. 
Ali o operador & retorna uma referência (arr já é uma referência), você tem a referência da referência, quando faz o dereference fica só com uma referência.