Страницы

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

среда, 4 декабря 2019 г.

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

#cpp #массивы #указатели #объявление


#include 
using 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]; То есть такой указатель используется обычно при работе с двумерными массивами. Например, #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

Ответ 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];

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

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