Измените
printf("%d",*matrice[i*dimColonne+j]);
на просто
printf("%d", matrice[i][j]);
, если все, что вас беспокоит, - это распечатать правильное значение.В конце концов, именно так вы его и назначили.
Если вы делаете это как упражнение, чтобы понять, как работает подписка на массив, то вам нужно запомнить несколько вещей.
Во-первых, кроме случаев, когда это операнд sizeof
или унарные &
операторы, или строковый литерал, используемый для инициализации другого массива в объявлении, выражение типа «массив N-элементов из T
» будет заменено («decay to») выражениемвведите «указатель на T
», и его значением будет адрес первого элемента массива.Выражение matrice
является выражением массива типа "20-элементный массив из 30-элементного массива int
";в большинстве случаев он будет преобразован в выражение типа «указатель на массив из 30 элементов int
» или int (*)[30]
.Аналогично, выражение matrice[i]
является выражением типа «массив из 30 элементов int
», и в большинстве случаев оно будет преобразовано в выражение типа «указатель на int
» или int *
.
Вот удобная таблица, чтобы запомнить все это:
Declaration: T a[N];
Expression Type Decays to
---------- ---- ---------
a T [N] T *
&a T (*)[N]
*a T
a[i] T
Declaration: T a[M][N];
Expression Type Decays to
---------- ---- ---------
a T [M][N] T (*)[N]
&a T (*)[M][N]
*a T [N] T *
a[i] T [N] T *
&a[i] T (*)[N]
*a[i] T
a[i][j] T
Во-вторых, операция подписки a[i]
определяется как *(a + i)
;то есть вы вычисляете адрес на основе i
количества элементов ( NOT BYTES ) из базового адреса вашего массива и разыменовываете результат.Например, если a
является массивом int
, то *(a + i)
даст вам значение i
'th integer после a
.Если an является массивом struct foo
, то *(a + i)
даст вам значение i
'th struct после a
.Арифметика указателя всегда учитывает размер базового типа, поэтому вам не нужно беспокоиться о количестве байтов в смещении.
Та же логика применима к многомерным массивам, вы просто применяете правило рекурсивно для каждого измерения:
a[i][j] == *(a[i] + j) == *(*(a + i) + j)
a[i][j][k] == *(a[i][j]+ k) == *(*(a[i] + j) + k) == *(*(*(a + i) + j) + k)
Обратите внимание, что почти никогда не нужно делать эти разыменованиявручную;компилятор знает, как выглядит доступ к массиву, и может соответствующим образом оптимизировать код.При правильных обстоятельствах выписывание разыменований вручную может привести к более медленному коду, чем при использовании оператора индекса.
Вы можете индексировать в двумерный массив, как если бы это был одномерный массив, например:
a[i*rows + j] = val;
, но я бы не стал (типы выражений несовпадать чисто).Обратите внимание, что вы умножаете i
на количество строк , а не столбцов.