Подтвердить что ты не робот

Операторы звездочки и скобки С++, используемые вместе

Извините за дерьмовое название, но я не знаю, как лучше описать эту проблему.

В чем смысл:

int (*x)[];

и как его инициализировать?

Я знаю, что это не int *x[], поскольку:

int a,b;
int (*x)[] = {&a, &b};

не будет компилироваться.

Спасибо заранее.

4b9b3361

Ответ 1

Объявления типа имеют синтаксис типа выражения, поэтому вы анализируете их как вы будете иметь выражение:

      x       x is
     *x       a pointer
    (*x)[]    to an array of unknown dimensions
int (*x)[]    of int

Правило приоритета состоит в том, что операторы справа связывают более жесткие, чем те, которые слева, в каждом случае, оператор ближе к элементу связывается более жестко и, наконец, что круглые скобки могут использоваться для изменения этих привязки, поэтому:

int  *x[];    is an array of pointers,
int *(x[]);   as is this.
int (*x)[];   whereas here, the parentheses change the bindings.

Ответ 2

Используя cdecl, вы можете легко определить тип:

объявить x как указатель на массив int

Итак, вы можете инициализировать x адресом массива:

int a[]; // conceptual: error if compiled
x = &a;

Обратите внимание, что размер массива является частью его типа, поэтому вы не можете назначить адрес массива размером N указателю на массив размера M, где N!=M (это причина для ошибки выше: вам нужно знать размер массива, чтобы объявить его)

int b[5];
int c[6];
int (*y)[6];
y = &b; // error
y = &c; // OK

Ответ 3

int (*x)[], используя для указателя на пустой массив. Но инициализируйте пустой массив, который невозможен в С++. Только вы можете определить его. Вы должны использовать непустой массив:

int a[2] = {1, 2};
int (*x)[2] = &a;

Ответ 4

int (*x)[] означает, что x является указателем на массив int. Вы можете сделать следующее:

int a[] = {1, 2};
int (* b)[2] = &a;

Когда интерпретируется переменная типа массива, мы должны идти справа налево. например.

int *x[]

указывает, что x является массивом, элементы в массиве набираются как int * i.e. указатель на int. Таким образом, x представляет массив, элементы которого являются указателями int. Однако круглые скобки меняют приоритет оператора. Теперь * сначала интерпретируется, указав, что x - это указатель, тип которого int []. Таким образом, x в int (*x)[] является указателем на массив int, и вы должны его инициализировать соответствующим образом.

Ответ 5

Раньше у меня были проблемы с типом С, пока я не узнал, как он был создан.

В C тип описывается так, как вы бы использовали переменную этого типа.

Поэтому, когда вы видите:

int *x;

это означает, что выражение *x имеет тип int, поэтому x является переменной типа pointer-to-int.

И если вы видите:

int x[5];

это означает, что выражение x[3] имеет тип int, поэтому x - это переменная типа array-of-int.

Итак, чтобы перейти к вашему выражению:

int (*x)[];

это означает, что выражение *x имеет тип int[] (т.е. массив int неизвестного размера). Поэтому x - это переменная типа pointer-to-an-array-of-int.

Ответ 6

int (* x) [] Это означает, что x является указателем на массив int Инициализировать как:   int (* x) [];   int a [10];   x = & a;

int * x [] Это означает, что x представляет собой массив указателей на int   int * x [10];   int a [10];   x [0] = a;

По-моему, всегда используйте инициализированные переменные массива или используйте int ** x вместо * x [], а затем выделяйте память во время выполнения.