&arr
создает указатель на массив - он имеет тип int (*)[3]
и указывает на массив arr
.
*&arr
разыменовывает этот указатель - это сам массив. Теперь, что происходит сейчас, зависит от того, что вы будете делать с этим. Если вы используете *&arr
в качестве субъекта операторов sizeof
или &
, то он дает размер или адрес массива соответственно:
printf("%zu\n", sizeof *&arr); /* Prints 3 * sizeof(int) */
Однако, если вы используете его в любом другом контексте, то он оценивается как указатель на его первый элемент:
int *x = *&arr;
printf("%d\n", *x); /* Prints 1 */
Другими словами: *&arr
ведет себя так же, как и arr
, как и следовало ожидать.