// array 1 2 3 4 5 0 0 0 0 0
int m[10] = { 1, 2, 3, 4, 5};
m[i] => *(m + i)
int m[10] = {1, 2, 3, 4, 5};
int *p = &m[0]; // адрес начала массива
int *q = &m[9]; // адрес последнего элемента массива
(p + k) - сдвиг на k ячеек типа int вправо(p - k) - сдвиг на k ячеек типа int влево(q - p) - количество ячеек между указателямиp[k] - эквивалентно *(p + k) int m[10] = {};
for (int *p = m; p < m+9; ++p)
{
*p = (p - m) + 1;
}
// массив заполнен числами от 1 до 10
int max_element (int *m, int size) {
int max = *m;
for (int i = 1; i < size; ++i) {
if (m[i] > max) {
max = m[i];
}
}
return max
}
int m2d[2][3] = { {1, 2, 3}, {4, 5, 6} };
for (size_t i = 0; i != 2; ++i ) {
for (size_t j = 0; j !=3; ++j) {
cout << m2d[i][j] << ' ';
}
cout << endl;
}
new [].
int * m1d = new int [100];
m - указатель на двумерный массив типа int.m[i][j] имеет тип int (точнее int &).m[i][j] <=> *(m[i] + j), т.е. тип m[i] - int *m[i] <=> * (m + i), т.е. тип m - int **.m[i] ?
i.m
Неэффективная схема

int ** create_array2d(size_t a, size_t b) {
int ** m = new int * [a];
for (size_t i = 0; i != a; ++i) {
m[i] = new int [b];
}
return m;
}
void free_array2d (int ** m, size_t a) {
for (size_t i = 0; i != a; ++i) {
delete [] m[i];
}
delete [];
}
Эффективная схема

int ** create_array2d (size_t a, size_t b) {
int ** m = new int * [a];
m[0] = new int[a * b];
for (size_t i = 1; i != a; ++i) {
m[i] = m[i - 1] + b;
}
return m;
}
void free_array2d (int ** m) {
delete [] m[0];
delete [] m;
}