История изменений
Исправление firkax, (текущая версия) :
new int[n][m]
выделяет блок памяти размером sizeof(int)*m*n
байт и возвращает указатель на него, скастованный в тип int(*)[m]
, который записывается в переменную a
. Блок памяти логически (в исходнике) представлен как n строк по m элементов каждая, расположенных одна за другой непрерывно в памяти.
Тип int(*)[m]
означает вот что:
a
- указатель на начало блока памяти
a[0]
- всё тот же указатель на начало блока памяти, но скастованный в int*
a[j]
- указатель на начало j-ой строчки (она начинается через j*m*sizeof(int)
байт от начала), скастованный в int*
a[j][i]
- значение элемента, начинающегося от начала блока через такое количество байт: (j*m+i)*sizeof(int)
Поведение «разыменовываем указатель но получаем в итоге всё равно указатель на ту же память, а не значение в ней» - это особенность типа «указатель на массив» (когда звёздочка в круглых скобках а потом чтото в квадратных, либо просто несколько пар квадратных, первая пара эквивалентна всё той же звёздочке в скобках). Каждое такое разыменование уменьшает количество квадратных скобок в спецификации типа, а когда квадратных скобок не остаётся - происходит настоящее разыменование.
Исправление firkax, :
new int[n][m]
выделяет блок памяти размером sizeof(int)*m*n
байт и возвращает указатель на него, скастованный в тип int(*)[m]
, который записывается в переменную a
. Блок памяти логически (в исходнике) представлен как n строк по m элементов каждая, расположенных одна за другой непрерывно в памяти.
Тип int(*)[m]
означает вот что:
a
- указатель на начало блока памяти
a[0]
- всё тот же указатель на начало блока памяти, но скастованный в int*
a[j]
- указатель на начало j-ой строчки (она начинается через j*m*sizeof(int)
байт от начала), скастованный в int*
a[j][i]
- значение элемента, начинающегося от начала блока через такое количество байт: (j*m+i)*sizeof(int)
Поведение «разыменовываем указатель но получаем в итоге всё равно указатель на ту же память, а не значение в ней» - это особенность типа «указатель на массив» (когда звёздочка в круглых скобках а потом чтото в квадратных). Каждое такое разыменование уменьшает количество квадратных скобок в спецификации типа, а когда квадратных скобок не остаётся - происходит настоящее разыменование.
Исправление firkax, :
new int[n][m]
выделяет блок памяти размером sizeof(int)*m*n
байт и возвращает указатель на него, скастованный в тип int(*)[m]
, который записывается в переменную a
. Блок памяти логически (в исходнике) представлен как n строк по m элементов каждая, расположенных одна за другой непрерывно в памяти.
Тип int(*)[m]
означает вот что:
a
- указатель на начало блока памяти
a[0]
- всё тот же указатель на начало блока памяти, но скастованный в int*
a[j]
- указатель на начало j-ой строчки (она начинается через j*m*sizeof(int)
байт от начала), скастованный в int*
a[j][i]
- значение элемента, начинающегося от начала блока через такое количество байт: (j*m+i)*sizeof(int)
Поведение «разыменовываем указать но получаем в итоге всё равно указатель на ту же память, а не значение в ней» - это особенность типа «указатель на массив» (когда звёздочка в круглых скобках а потом чтото в квадратных). Каждое такое разыменование уменьшает количество квадратных скобок в спецификации типа, а когда квадратных скобок не остаётся - происходит настоящее разыменование.
Исправление firkax, :
new int[n][m]
выделяет блок памяти размером sizeof(int)*m*n
байт и возвращает указатель на него, скастованный в тип int(*)[m]
, который записывается в переменную a
. Блок памяти логически (в исходнике) представлен как n строк по m элементов каждая, расположенных одна за другой непрерывно в памяти.
Тип int(*)[m]
означает вот что:
a
- указатель на начало блока памяти
a[0]
- всё тот же указатель на начало блока памяти, но скастованный в int*
a[j]
- указатель на начало j-ой строчки (она начинается через j*m*sizeof(int)
байт от начала), скастованный в int*
a[j][i]
- значение элемента, начинающегося от начала блока через такое количество байт: (j*m+i)*sizeof(int)
Поведение «разыменовываем указать но получаем в итоге всё равно указатель на ту же память, а не значение в ней» - это особенность типа «указатель на массив» (когда звёздочка в круглых скобках а потом чтото в квадратных).
Исправление firkax, :
new int[n][m]
выделяет блок памяти размером sizeof(int)*m*n
байт и возвращает указатель на него, скастованный в тип int(*)[m]
, который записывается в переменную a
. Блок памяти логически (в исходнике) представлен как n строк по m элементов каждая, расположенных одна за другой непрерывно в памяти.
Тип int(*)[m]
означает вот что:
a
- указатель на начало блока памяти
a[0]
- всё тот же указатель на начало блока памяти, но скастованный в int*
a[j]
- указатель на начало j-ой строчки (она начинается через j*m*sizeof(int)
байт от начала), скастованный в int*
a[j][i]
- значение элемента, начинающегося от начала блока через такое количество байт: (j*m+i)*sizeof(int)
Исходная версия firkax, :
new int[n][m]
выделяет блок памяти размером sizeof(int)*m*n
байт и возвращает указатель на него, скастованный в тип int(*)[m]
, который записывается в переменную a
. Блок памяти логически (в исходнике) представлен как n строк по m элементов каждая, расположенных одна за другой непрерывно в памяти.
Тип int(*)[m]
означает вот что:
a
- указатель на начало блока памяти
a[0]
- всё тот же указатель на начало блока памяти, но скастованный в int*
a[j]
- указатель на начало j-ой строчки (она начинается через j*m*sizeof(int)
байт от начала), скастованный в int*
a[j][i]
- значение элемента, начинающегося от начала блока через такое количество байт: (j*m+i)*sizeof(int)