22.10.2013, 22:04. Просмотров 429. Ответов 1
Здравствуйте, я никак не пойму... вот например для того чтобы инициализировать указатель на двумерный статический массив, указатель должен знать размер одного, назовём его, блока данных, состоящего из элементов, содержащие значения. Например:
C++ |
1
2
3
| int arr[3][5];
int **ptarr=arr; // так не правильно, будет ошибка, так как указатель ptarr не знает, что в одном блоке 5 значений int
int (*ptarr)[5]=arr; // так правильно, так как создаётся указатель на массив из 5 значений int |
|
и с указателем
ptarr можно будет делать всё, как и с массивом
arr
А вот в динамическом двумерном массиве наоборот инициализация указателя только как в строке 2. Например:
C++ |
1
2
3
4
5
| int **arr=new int*[3];
for(i=0; i<3; i++)
arr[i]=new int[5];
int **ptarr=arr; // проглатывает на ура
int (*ptarr)[5]=arr; // пишет ошибку что из int** не может преобразовать в int(*)[5] |
|
Откуда в этом случае указатель
ptarr узнаёт о размере одного блока
arr, понятно, что в строке 1 выделяется память под массив указателей, но и статический массив – это ведь по сути константный указатель (
хотя где-то я читал, что это не так, и он приводится к указателю, только при обращении к нему). Вообще в чём отличие тогда статического от динамического массива кроме их определения и что они хранятся в разной памяти?