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

400
18 февраля 2017, 06:24
#include <iostream>
using namespace std;

int main()
{
    int b[10];
    int ( *a )[ 10 ];       // эта
    a = b;                  // error
    a[ 0 ] = new int;       // error
    a = new int;            // error
}

Пытаюсь методом подбора понять что это и как это используется.

Answer 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 <iostream>
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 
Answer 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];
READ ALSO
Конвертировать PTYPE в Double [требует правки]

Конвертировать PTYPE в Double [требует правки]

Написал код, однако он выводит такую ошибку:

523
Исключения при работе с итераторами

Исключения при работе с итераторами

Решаю следующую задачу: есть некоторый файл, структура которого представляет собой набор блоковКаждый блок имеет заголовок и тело

373
VIPS library Qt

VIPS library Qt

Пытаюсь собрать проект с VIPS LibПодключил следующие

312
Обработка изображения с помощью OpenCV

Обработка изображения с помощью OpenCV

Стоит задача распознавания капчи с некоторого ресурса

388