Функция сдвигать влево 2D-массив в C

Я пишу функцию внутри своей программы, чтобы сдвинуть все числа в массиве, который был передан функции. Пример:

1 2 3 4 5 6 

становится

 2 3 4 5 6 1 

Мой код:

 void LeftShift(int array[][N])/*Get the array from main*/ { int r, c, temp; for(r = 0; r < M; r++) { //Start at row 0 and add one each time for(c = 0; c  0) { array[r][c] = array[r][c-1]; //Number is moved over one if its not the first column } else if(c == 0 && r > 0) { //If its first column but not first row array[r][c] = array[r-1][N-1];//Move number up one row and too last column } else { temp = array[r][c];//If its first column and first row store value in temp } } } array[M-1][N-1] = temp;//Put temp value at end of array } 

Когда я печатаю это, все, что я получаю, это первое число из исходного массива в каждом месте массива. M определяется в верхней части как 6, а N определяется как 5. После этого выполняется вызов функции, которая выводит новый массив, и все, что я получаю, является первым значением 30 раз в массиве.

2-D массивы смежны в памяти, поэтому вы можете перебирать их, как если бы это был массив с 1-D:

 void left_rotate(int array[][N]) { int *flat = (int *)array; int temp = flat[0]; for ( size_t i = 1; i < M*N; ++i ) flat[i-1] = flat[i]; flat[M*N-1] = temp; } 

Цикл for также можно было бы заменить одним движением блока:

 memmove(&flat[0], &flat[1], (M*N-1) * sizeof *flat); 
 array[r][c] = array[r][c-1]; 

должно быть

 array[r][c-1] = array[r][c]; 

Аналогично для сдвига строк.

Вы можете бросить массив, указав указатель за последним посещенным вами местом и перемещая элементы, как в этом примере:

 #define nrows 4 #define ncols 4 int array[nrows][ncols] = { { 1, 2, 3, 4, }, { 5, 6, 7, 8, }, { 9, 10, 11, 12, }, { 13, 14, 15, 16, }, }; int main() { int row, col; int saved_int; int *p = &saved_int; /* rotate elements */ for(row = 0; row < nrows; row++) for (col = 0; col < ncols; col++) { *p = array[row][col]; p = &array[row][col]; } /* for */ *p = saved_int; /* print matrix */ for (row = 0; row < nrows; row++) { for (col = 0; col < ncols; col++) printf( "%s%d", (col ? "\t" : ""), array[row][col]); printf("\n"); } /* for */ return 0; } /* main */