Внутри shuffle
вы создаете массив с именем newArray
в стеке (что означает, что он будет освобожден после завершения функции).
Затем вы помещаете каждый предмет из shuffle_array
в newArray
в обратном направлении.
Затем вы создаете указатель shuffle_array
, локальная переменная (что означает, что изменения в ней не отражаются вне функции), указывают на первый элемент newArray
. Это ничего не меняет за пределами shuffle
, потому что shuffle_array
является локальной переменной.
После возврата функции ничего не произошло за пределами функции. Это потому, что вы просто изменяете локальные данные с помощью shuffle
.
Чтобы перетасовать массив (или перевернуть его, или сделать с ним что-нибудь), вы должны изменить его напрямую, а не изменять копию. Так и должно быть
int tmp = shuffle_array[i];
shuffle_array[i] = shuffle_array[j];
shuffle_array[j] = tmp;
Так что вы меняете два значения элементов массива, на которых находитесь. Даже если shuffle_array
является временной переменной, она указывает на блок памяти в main
, поэтому изменение этой памяти видно даже после возврата из функции.
Вы можете визуализировать это так:
in main
:
array - - - -
\
\
1, 2, 3, 4, 5, ..., 52 };
когда shuffle
вызывается:
array - - - -
\
\
1, 2, 3, 4, 5, ..., 52
/
/
/
shuffle_array
newArray - - -
\
52, ..., 5, 4, 3, 2, 1
Тогда, когда вы делаете
shuffle_array = newArray;
Похоже,
array - - - -
\
\
1, 2, 3, 4, 5, ..., 52
shuffle_array -
\
newArray - - - |
\ /
52, ..., 5, 4, 3, 2, 1
Затем shuffle
возвращается, и все возвращается к
array - - - -
\
\
1, 2, 3, 4, 5, ..., 52