Правильный способ объявления переменных указателя в C/С++

Я заметил, что некоторые люди используют следующие обозначения для объявления переменных указателя.

(a) char* p;

вместо

(b) char *p;

Я использую (b). Каково рациональное обозначение (а)? Обозначение (б) имеет больше смысла для меня, потому что указатель на символ не является самим типом. Вместо этого тип является символом, а переменная может быть указателем на символ.

char* c;

Похоже, существует тип char *, а переменная c этого типа. Но на самом деле тип char и * c (расположение памяти, указанное c), имеет этот тип (char). Если вы объявляете сразу несколько переменных, это различие становится очевидным.

char* c, *d;

Это выглядит странно. Оба c и d - такие же указатели, которые указывают на символ. В этом, поскольку следующий выглядит более естественным.

char *c, *d;

Спасибо.

Ответ 1

Бьярне Страуструп сказал:

Выбор между "int * p;" и "int * p;" не о правильном и неправильном, а о стиле и акценте. C подчеркнутые выражения; декларации часто считались не более чем необходимым злом. С другой стороны, С++ имеет большой упор на типы.

"Типичный программист С" пишет "int * p;" и объясняет это "* p - это то, что является синтаксисом подчеркивания int, и может указывать на грамматику декларации C (и С++), чтобы аргументировать правильность стиля. В самом деле, * связывается с именем p в грамматике.

" Типичный программист на С++" пишет "int * p;" и объясняет, что "p - это указатель на тип подчеркивания int". Действительно, тип p является int *. Я явно предпочитаю этот акцент и считаю его важным для использования более продвинутых частей С++.

Источник: http://www.stroustrup.com/bs_faq2.html#whitespace

Я бы рекомендовал последний стиль, потому что в ситуации, когда вы объявляете несколько указателей в одной строке (ваш четвертый пример), наличие звездочки с переменной будет тем, к чему вы привыкли.

Ответ 2

Я лично предпочитаю размещать * с остальной частью типа

char* p;  // p is a pointer to a char.

Люди будут спорить "но тогда char* p, q; становится вводящим в заблуждение", на что я говорю "так не делайте этого".

Ответ 3

Нет никакой разницы, как писать. Но если вы хотите объявить два или более указателей в одной строке, лучше использовать (b) вариант, потому что ясно, что вы хотите. Посмотрите ниже:

int *a;
int* b;      // All is OK. `a` is pointer to int ant `b` is pointer to int
char *c, *d; // We declare two pointers to char. And we clearly see it.
char* e, f;  // We declare pointer `e` and variable `f` of char type.
             // Maybe here it is mistake, maybe not. 
// Better way of course is use typedef:
typedef char* PCHAR;
PCHAR g, h;  // Now `g` and `h` both are pointers.
// If we used define construction for PCHAR we'd get into problem too.

Ответ 4

Компромисс

char * p;

K & R использует

char *p;

Это зависит от вас, если вы не следуете стандарту кодирования - в этом случае вы должны следить за тем, что делают все остальные.

Ответ 5

Все, что касается предпочтений, лично по проектам, которые я вижу в char *, я склонен объявлять несколько указателей на отдельных строках. Там нет реального "правильного" способа сделать это, и все это сводится к предпочтению. Некоторые говорят, что читать легче (а), в то время как другие говорят, что (б) легче объявить больше переменных одного и того же типа в одной строке.

Я нахожу (b) более распространенным, и в некоторых случаях я видел

char * a;

или что-то вроде этого. Опять же предпочтение. Независимо от того, что вам удобно или независимо от того, в каком проекте я работаю, я буду использовать (если я не напишу его сам, в каком случае я использую (a))