Инициализация указателя на массив без оператора &? - PullRequest
0 голосов
/ 29 апреля 2018

В следующем указателе на массив,

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

какие последствия и последствия я могу иметь, если я не использую оператор & и делаю так ...

int x[5] = {1};
int (*a)[5] = x; //No & operator

Может кто-нибудь объяснить с хорошим примером ..

1 Ответ

0 голосов
/ 29 апреля 2018

Ну, тип был бы неправильным.

в вашем примере x будет иметь значение int *, указатель на первый элемент x. &x, с другой стороны, оценивается как int (*)[5], указатель на весь массив.

Сложно привести пример того, как это происходит на практике, поскольку массив начинается с первого элемента по определению . Но это все еще неправильно на уровне языка. Указатели не могут быть преобразованы неявно, за одним исключением void *. Итак, во втором примере компилятор должен предупредить вас (если это не так, добавьте несколько флагов, например, для gcc используйте -std=c11 -Wall -Wextra - или получите лучший компилятор).

Если вместо этого вы напишите следующее:

int x[5] = {1};
int (*a)[5] = (int (*)[5])x;

это будет работать и должно компилироваться без предупреждений. Тем не менее, это не правильный способ сделать это. Хотя в этом конкретном случае приведение должно всегда работать должным образом, в общем случае следует избегать приведения указателей в C. Приведение указателя является потенциальной ошибкой, поэтому делайте это только тогда, когда это абсолютно необходимо, а затем дважды проверьте полученный код не нарушает строгое псевдонимы (посмотрите ...).

Здесь нет необходимости в приведении - напишите &x и все в порядке.

...