// 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;
}