Чтобы передать массив в функцию, просто укажите имя массива 1 :
arrangef( a );
...
arrangeb( a );
a[n]
задает один элемент массива, и он проходит после последнего элемента в массиве, поэтому вы передаете выражение неправильного типа (функции arrange*
ожидают int *
, вы передаете int
) и он находится за пределами массива, поэтому значение неизвестно.
За исключением случаев, когда он является операндом операторов sizeof
или унарных &
или является строковым литералом, используемым для инициализации массива символов в объявлении, N-элемент выражение типа "N" массив T
"преобразуется (" распадается ") в выражение типа" указатель на T
", а значением выражения является адрес первого элемента массива.
Итак, когда вы звоните
arrangef( a );
выражение a
неявно преобразуется из "n
-элемента массива int
" в "указатель на int
", а значением выражения является адрес a[0]
, так что arrangef
фактически получает значение указателя.
В объявлении параметров функции T a[N]
и T a[]
"настроены" на T *a
- все три объявляют a
как указатель на T
.
Поскольку все, что получает функция - это адрес первого элемента массива, вы также должны либо передать число элементов в качестве отдельного параметра, либо один элемент должен будет содержать значение Sentinel, которое отмечает конец данных. (например, терминатор 0 в строках). В вашем случае вам нужно передать размер отдельно:
void arrangef( int *a, size_t n ) // or int a[]
{
for ( int i = 0; i < n; i++ ) // don't loop past the last element in the array
{
for ( int j = i; j < n; j++ )
{
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
}
}
arrangeb
будет выглядеть одинаково, только с другим порядком.
for( i = 0; ; i++ )
будет зацикливаться "навсегда" - он будет зацикливаться за концом вашего массива и в конечном итоге в памяти, которой вы не владеете, что приведет к ошибке времени выполнения. i
также в конечном итоге будет переполнен, и поведение при целочисленном переполнении со знаком не будет четко определено. По сути, эта петля взорвется .
На самом деле, вы должны передать любое выражение типа массива, которое преобразуется в тип указателя, но сейчас мы просто будем придерживаться имени.