В коде:
static int a[3] = {1, 2, 3};
Тип для является не указателем, а массивом типа int. Однако он автоматически преобразуется в указатель, например в стандарте C:
За исключением случаев, когда это операнд оператора sizeof или унарный оператор &, или строковый литерал, используемый для инициализации массива, выражение с типом «массив типа» преобразуется в выражение с типом « указатель на тип, который указывает на начальный элемент объекта массива и не является lvalue.
Так что если a является массивом, то = {1, 2, 3} это его инициализация, а не какой-то отдельный массив. Я не знаю, указано ли это где-то точно, но в этом смысле оно используется во всем стандарте.
Редактировать , чтобы устранить путаницу у некоторых читателей: согласно цитируемому стандарту, если вы напишите:
int arr[4] = { };
arr[0] = 1; //arr here has here type int*
size_t sz = sizeof(arr); //here it is not type int*, sizeof is exception