int **A;
означает, что это указатель на указатель.Это часто используется для представления двумерного массива.В вашей программе -
int *A; A = new int[10] ;
for (int j=0; j<20; j++)
A[j] = new int[20] ; // A[j] means dereferencing to the location itself. So, it should hold `int`
// as stated but not `int*` that is returned by new operator.
A
- это указатель, который указывает 10 областей памяти, которые могут содержать int
.И когда вы говорите, A[j]
, вы на самом деле разыменовываете местоположение.Таким образом, он содержит int
, а не int*
.Кроме того, существует переполнение, поскольку количество местоположений A
указывает на 10 , но не 20 мест памяти.
Редактировать 1: ОП отредактировал программу.Это не то же самое, что было раньше.
Теперь с программой все в порядке, за исключением возврата ресурсов обратно в бесплатное хранилище.
int **A;
A = new int*[10] ;
A
- указатель на указатель.Таким образом, a должен содержать адрес указателя или массив, который может содержать адрес указателей.Так,
A = new int*[10] ;
A
содержит начальный адрес массива указателей, размер которого 10
.Теперь это все еще не так.
for (int j=0; j<20; j++)
A[j] = new int[20] ; // Because `A[j]` is invalid from 10-19. There is no such index where A[j] can dereference to. So, j should run from 0 to 10 instead.
С этим исправлено -
A[j] = new int[20] ;
Теперь каждый указатель указывает на 20 int мест.Итак, в массиве 10 * 20 элементов.
Эта диаграмма размерного массива 2 * 3 должна дать вам представление.Кроме того, вы должны рассмотреть ответ @Nawaz на освобождение массива, поскольку ресурсы управляются программистом.
![2*3 Array Lay Out](https://i.stack.imgur.com/Esy7e.png)