Подтвердить что ты не робот

Разница между char * var; и char * var;?

Просто интересно, есть ли разница между:

char* var;
char *var;

или это просто вопрос предпочтения (интервал)?

4b9b3361

Ответ 1

В этом случае нет никакой разницы. Однако вы должны предпочесть 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? Язык разрешит это как идентичный другому прототипу, но наша цель - читаемость, а это означает передачу именно того, что мы имеем в виду для людей, а не только для компилятора.

Ответ 2

Нет никакой разницы, просто вопрос предпочтения, как вы сами сказали