#cpp #массивы #указатели #объявление
#includeusing namespace std; int main() { int b[10]; int ( *a )[ 10 ]; // эта a = b; // error a[ 0 ] = new int; // error a = new int; // error } Пытаюсь методом подбора понять что это и как это используется.
Ответы
Ответ 1
Чтобы проще было понять запись 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]; То есть такой указатель используется обычно при работе с двумерными массивами. Например, #includeint 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 Ответ 2
Формально это - указатель на массив из 10 int. Так что присваивать нужно как a = &b; Если хотите использовать для присваивания элемента - то (*a)[0] = 12; // Присваивание b[0] = 12 Если же вы имеете в виду массив массивов по 10 элементов, то a[0][3] = 15; // Присваивание третьему элементу первого массива // по адресу a значение 15 - то же, что и b[3] = 15; Ну, а последнее... например, так: using arr = int[10]; a = new arr[1];
Комментариев нет:
Отправить комментарий