Чем отличается обявление int* a от int *a в Си?
Ни чем не отличается. Пробельные символы допустимо ставить в любом месте, где они не разрывают ключевое слово, идентификатор или константу. Все варианты ниже полностью эквивалентны:int*a;
int* a;
int *a;
int * a;
Но есть некоторая тонкость. Если посмотреть на синтаксис объявления нескольких переменных:int * a, * b, c, * d, e; // a, b и d - указатели, c и e - числа
то будет видно, что "звездочка" является скорее модификатором переменной, чем модификатором типа. Чтобы подчеркнуть этот факт, рекомендуется всегда писать "звездочку" около переменной. Такая привычка позволяет избежать глупых ошибок:int *a, *b; // нормально
int* a, b;  // Ошибка: b кажется указателем, но на самом деле - число.А синтаксис у C простой.
В С как и большинстве языков, пробелы в коде можно игнорировать. Они являются просто одним из разделителей лексем. Притом некоторые лексемы разделяются и без разделителей.