Просто интересно, есть ли разница между:
char* var;
char *var;
или это просто вопрос предпочтения (интервал)?
Просто интересно, есть ли разница между:
char* var;
char *var;
или это просто вопрос предпочтения (интервал)?
В этом случае нет никакой разницы. Однако вы должны предпочесть char *var;
.
Это связано с тем, что *
более тесно связан с именем переменной и не является частью базового типа. Например, если вы это сделаете:
char* a, b;
У вас есть a
, указатель на char
и b
, a char
. Это смущает! Поскольку символ *
ближе к ключевому слову char
, мы ожидаем, что типы обеих переменных будут указателями на char
, но *
фактически ассоциируется только с a
. (Это похоже на char a[10], b;
, как указано teppic в комментариях, спецификатор [10]
также ассоциируется только с a
, и поэтому только a
будет массивом.)
Правильное объявление:
char *a, *b;
Помещение спецификатора *
ближе к переменной означает, что вам легко увидеть, что происходит, когда вы намереваетесь, чтобы одна переменная была указателем, а другая нет:
char *a, b;
В этом случае очевидно, что b
не предназначался для указателя. В исходном примере (char* a, b;
) мы не знаем, предназначался ли программист для b
указателем. Чтобы заимствовать у Дугласа Крокфорда, все, что мы знаем, это то, что программист некомпетентен.
Некоторым людям нравится помещать пробел до и после *
:
char * a, * b;
Это становится жертвой той же проблемы, проиллюстрированной выше: если b
не является указателем, то объявление (char * a, b;
) также может привести к неопределенности в отношении намерения программиста. Поэтому я предлагаю не помещать пробел между *
и именем переменной 1.
В любом случае, char* var;
следует рассматривать как плохой стиль. Он грамматически исправляется в соответствии со спецификацией языка, но приводит к нечитаемому коду, потому что он указывает, что спецификатор *
является частью типа, разделяемого всеми переменными в том же объявлении, когда это не так. (Это похоже на запись сложной функции на одной строке - она работает, но это плохая идея. Бывают случаи, когда читаемость и ремонтопригодность заменяют личные стилистические предпочтения, и это один из них.)
1 Лично я предпочитаю помещать пробел после *
только при работе с возвращаемыми значениями функции:
char * foo();
Это недвусмысленно: это функция, которая возвращает указатель на char
.
char *foo();
Значит ли программист функция, возвращающая указатель на char
, или он хотел создать указатель на функцию, которая возвращает char
? Язык разрешит это как идентичный другому прототипу, но наша цель - читаемость, а это означает передачу именно того, что мы имеем в виду для людей, а не только для компилятора.
Нет никакой разницы, просто вопрос предпочтения, как вы сами сказали