Страницы

Поиск по вопросам

понедельник, 8 октября 2018 г.

Что означает данная запись

#include using namespace std;
int main() { int b[10]; int ( *a )[ 10 ]; // эта a = b; // error a[ 0 ] = new int; // error a = new int; // error
}
Пытаюсь методом подбора понять что это и как это используется


Ответ

Чтобы проще было понять запись
int ( *a )[ 10 ];
можно ввести определение алиаса для массива
typedef int T[10];
T *a;
то есть объекты, которые может адресовать указатель, представляют собой целочисленные массивы из десяти элементов.
Если вы хотите, например, чтобы этот указатель адресовал такой массив, вы можете написать
typedef int T[10];
T b;
T *a; a = &b;
Тогда выражение *a или a[0] представляет собой массив b
Например, вы можете написать
typedef int T[10];
T b;
T *a; a = &b;
for ( int i = 0; i < 10; i++ ) a[0][i] = i;
Если хотите динамически выделить массив, то вам следует записать
typedef int T[10];
T *a; a = new T[1];
Это эквивалентно следующему фрагменту кода
int ( *a )[10];
a = new int[1][10];
То есть такой указатель используется обычно при работе с двумерными массивами. Например,
#include
int main() { const size_t M = 2; const size_t N = 10;
int b[M][N] = { { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }, { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 } };
for ( int ( *a )[N] = b; a != b + M; ++a ) { for ( int x : *a ) std::cout << x << ' '; std::cout << std::endl; } }
Вывод на консоль
0 1 2 3 4 5 6 7 8 9 9 8 7 6 5 4 3 2 1 0

Комментариев нет:

Отправить комментарий