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 *.

Независимо от выбранного вами соглашения, просто старайтесь быть последовательным.