C - инициализация указателей, позиция звездочки
Как правильно расположить звездочку? Зачем?
1) type* var;
2) type *var;
Ответы
Ответ 1
Это не имеет значения, если вы объявляете только один указатель. Обычно это записывается, как во втором примере (в коде, который я обычно читаю/записываю), но для компилятора он тот же.
Проблема может возникнуть, если вы объявляете более одного указателя. Например, это не объявление двух указателей, вместо этого он объявляет один указатель и один тип типа var.
type* var1, var2;
Вам нужно сделать следующее:
type* var1, *var2;
Я предпочитаю всегда использовать * для var.
Ответ 2
Указатель - это тип, и я думаю, что имеет смысл сгруппировать информацию о типе:
int* foo;
Это может привести к путанице, если несколько переменных определены в одной строке:
int* foo, bar; // foo will be int*, bar will be int
Решение этой проблемы - никогда не объявлять несколько переменных в одной строке. Во всяком случае, то, что защищает Code Complete.
Ответ 3
Оба работают. Я бы сказал, что # 1 является более понятным в целом, но вводит в заблуждение в C и может привести к ошибкам, например:
type* var1, var2;
// This actually means:
type *var1;
type var2;
Итак, я бы сказал, что # 2 более идиоматичен в C и поэтому рекомендуется, особенно если вы не единственный программист, работающий над кодом (если, конечно, вы все не согласны с стилем).
Ответ 4
Как отмечали другие, обе работают нормально, а у неправильного - преимущество синтаксической экономики.
Как я смотрю на это, объявление состоит из типа, за которым следует переменная.
<type> <variable>;
int ii;
int* pii;
Итак, если вы уберете переменную , то останется тип. Это int и int * выше. Компилятор рассматривает int * как тип внутри (который является указателем на int).
C, к сожалению, не поддерживает этот синтаксис без проблем. При объявлении нескольких переменных одного типа вы должны иметь возможность сделать это:
<type> <variable>, <variable>, <variable>;
который вы не можете использовать с типом указателя:
int* ii1, ii2, ii3;
объявляет ii1 типа int *, а остальная часть типа int. Чтобы этого избежать, я делаю привычкой декларировать только одну переменную в строке.
Ответ 5
Я слышал, что он утверждал, что технически * является модификатором переменной,
и об этом свидетельствует необходимость использования * несколько раз в переменной переменной
декларации
например. int * p, * q, * r;
Однако мне нравится думать об этом как о модификаторе базового типа, потому что
это то, что появляется в прототипах.
например. void func (int *);
.PMCD.
PS. Я знаю, что я не помог вашей проблеме:)
Ответ 6
Второй режим правильный. Другой режим не так понятен для начинающего программиста.
Форма int * variable обычно обескуражена
Ответ 7
Нет единственного "самого правильного места".
Обычно это место, в котором используется остальная часть кода.
Если вы пишете свой собственный код с самого начала и можете выбрать свое собственное соглашение: выберите свое собственное соглашение и придерживайтесь его.
Если вы выберете что-то другое, кроме type * var
, вы встретите "неудобные" ситуации:
/* write these with another style */
int * var;
int const * var;
int * restrict var;
<суб > PS. Это не имеет значения, но я обычно использую type *var;
Ответ 8
Это скорее предпочтение кодера.
Для меня я объявляю указатели:
int * var1, var2;
Где var1
- указатель, а var2
- нет. Если вы хотите объявить несколько указателей в строке:
int * var1, * var2;
И, конечно же, использование других способов действительно.
Ответ 9
Семантика декларации подразумевает семантику выражения (в частности, приоритет оператора), и я считаю, что более сложные объявления легче читать с использованием второго стиля.
Вы можете думать о
int *foo;
объявление типа выражения *foo
(т.е. оператора косвенности, примененного к foo
), как int
вместо foo
объявляется типом int *
.
Независимо от выбранного вами соглашения, просто старайтесь быть последовательным.