Как в заголовках тем. Когда я пишу: void fun(int *tab){}
это то же самое, что писать void fun(int tab[]){}
?
Да.
void fun(int *tab){}
void fun(int tab[]){}
void fun(int tab[10]){} //whatever the size is
все равно для компилятора. Массив с размером или отсутствием распадается на указатель при передаче в качестве аргумента функции.
На практике избегайте использования последнего, поскольку это может привести к тому, что размер известен функции, а на самом деле это не так.
Да, это так, и нет, вторая версия не позволит вам определить размер массива внутри функции. Он все еще распадается на указатель. :)
std::array
или std::vector
или что-то еще.
Да, это одно и то же... Когда вы объявляете массив, скажите int tab [] в своей программе.. и если вы хотите передать этот массив какой-либо другой функции, то вы фактически передаете местоположение базового адреса этого массива, т.е. & Tab [0], который указывается указателем, который вы используете как аргумент в функции, int * tab... Это фактически вызов по ссылке..
[]
...