LINUX.ORG.RU

История изменений

Исправление 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)