Операторы звездочки и скобки С++, используемые вместе
Извините за дерьмовое название, но я не знаю, как лучше описать эту проблему.
В чем смысл:
int (*x)[];
и как его инициализировать?
Я знаю, что это не int *x[]
, поскольку:
int a,b;
int (*x)[] = {&a, &b};
не будет компилироваться.
Спасибо заранее.
Ответы
Ответ 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 [], а затем выделяйте память во время выполнения.