Разница между int * array и int array [] в параметре функции

Я видел, что значения массива будут меняться, если параметр функции "int arr []" или "int * arr". Где разница?

int array []:

void myFunction(int arr[], int size) {

    for (int i = 0; i < size; ++i)
        arr[i] = 1;
}

int * array:

void myFunction(int * arr, int size) {

    for (int i = 0; i < size; ++i)
        arr[i] = 1;
}

Обе функции изменяют значения массива.

int main(){

     int array[3];

     array[0] = 0;
     array[1] = 0;
     array[2] = 0;

     myFunction(array, 3);

     return 0;

 }

Ответ 1

Нет никакой разницы. Оба типа функций (после настройки) - это "функция, использующая указатель на int и int, возвращающий void". Это просто синтаксический приступ С++: внешний [] в функциональном параметре не ссылочного типа является синонимом *.

Ответ 2

Различные способы выражения одной и той же вещи. Вы просто передаете массив в функции указателем.

Ответ 3

когда вы передаете массив в функции, он неявно передает его указателем. потому что, если в массиве передается много элементов по копированию значений, это огромные накладные расходы. даже если он выглядит по-другому.

вы не можете использовать обе функции одновременно. если вы выполнили ошибку времени компиляции

 error: redefinition of 'void myFunction(int*, int)'
 it is already defined.

Ответ 4

Нет никакой разницы. На самом деле объявление массива возвращает allawys указатель. Только, когда вы указываете в объявлении, что переменная является массивом (т.е. С []), нет необходимости указывать, что это будет указатель, потому что это делается неявно. Но если вы не укажете это, вы должны объявить его как указатель, если вы повлияли на него как на переменную таблицы, так и на результат "new []". Использование указателей таблицы имеет интерес только для динамического выделения, когда размер массива неизвестен во время разработки.