Ten kod generalnie jest niepoprawny. Powinno być:
int** ar;
ar = (int **)malloc(size * sizeof(int*));
for (i = 0; i < size;i++)
{
ar[i] = (int *)malloc(size * sizeof(int));
}
(przyjzryj się co jest wewnątrz sizeof)
Co do pytania:
to jest C? W takim razie
int ar[size][size];
Ofc nie jest to dokładnie to samo - jest różnica między pamięcią alokowaną dynamicznie i alokowaną na stosie. Nie możesz posługiwać się pamięcią dynamiczną bez użycia wskaźników, więc nigdy nie będziesz w stanie zamienić podanego przez ciebie kodu tak zeby nie uzywac wskaznikow.