Я заметил, что некоторые люди используют следующие обозначения для объявления переменных-указателей.
(a) char* p;
вместо того
(b) char *p;
Я использую (б). Что является рациональным за обозначением (а)? Обозначение (b) имеет для меня больше смысла, потому что указатель на символ не является самим типом. Вместо этого тип является символом, а переменная может быть указателем на символ.
char* c;
Похоже, что существует тип char * и переменная c этого типа. Но на самом деле это тип char, а * c (ячейка памяти, указанная c) относится к этому типу (char). Если вы объявляете сразу несколько переменных, это различие становится очевидным.
char* c, *d;
Это выглядит странно. И c, и d - это указатели одного типа, указывающие на символ. При этом следующий выглядит естественнее.
char *c, *d;
Спасибо.
c++
c
pointers
coding-style
Кида
источник
источник
char *t
, что я не выгляжу должным образом, поэтому я могу это сделатьchar * t;
. Однако я тоже часто виделchar* t;
.char
и (a) показывает, что p является apointer to a char
Ответы:
Бьярне Страуструп сказал:
Источник: http://www.stroustrup.com/bs_faq2.html#whitespace
Я бы порекомендовал последний стиль, потому что в ситуации, когда вы объявляете несколько указателей в одной строке (ваш 4-й пример), звездочка с переменной будет тем, к чему вы привыкли.
источник
int *p
есть: приp
разыменовании я получаюint
. Тогда,
имеет смысл несколько объявлений, разделенных символом:int *p, *q, r
(при разыменованииp
илиq
я получаюint
, приr
ссылке я получаюint
). Также имеет смысл синтаксис указателя на функцию:int (*f)()
(когдаf
разыменован и вызван, я получаюint
). И это имеет смысл:int *p, (*f)()
.int*
. Для меняint *p, (*f)()
это не имеет особого смысла, но я могу видеть, как это будет с некоторыми людьми в некоторых ситуациях.void*
(и вообще не работает для ссылок на C ++).Лично я предпочитаю размещать
*
вместе с остальными типамиchar* p; // p is a pointer to a char.
Люди будут спорить, «но затем
char* p, q;
вводят в заблуждение», на что я говорю: «Так что не делай этого».источник
cout << *p;
. Так почему бы не поставить звездочку передp
объявлением*p
:? На мой взгляд, это было бы менее запутанно.Нет разницы, как писать. Но если вы хотите объявить два и более указателя в одной строке, лучше использовать вариант (б), потому что ясно, чего вы хотите. Смотри ниже:
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.
источник
typedef
не лучший способ "конечно". Некоторые люди могут предпочесть это, но это проблематично, если с вашим кодом работает несколько человек. Если бы я не привыкPCHAR
, я мог бы написать что-нибудь вродеPCHAR *p;
, что было бы,char**
а не то, что я собирался. В общем, если вы хотитеchar**
, вам придется написатьPCHAR*
или определить новый тип, и тогда он просто станет глупым.Компромисс
char * p;
K&R использует
char *p;
Это зависит от вас, если вы не следуете стандарту кодирования - в этом случае вы должны следовать тому, что делают все остальные.
источник
char* p;
. это вопрос стиля, а не условностей или правил. для меня более логично, что p имеет типchar*
, поэтому, очевидно, * должен быть с типом.clang-format
равно используют .Это все вопрос предпочтений, лично в проектах, в которых я вижу символ char *, я обычно объявляю несколько указателей в отдельных строках. Нет настоящего «правильного» способа сделать это, и все зависит от предпочтений. Некоторые говорят, что легче читать (а), в то время как другие говорят, что (б) легче объявить больше переменных одного типа в одной строке.
Я считаю, что (b) встречается чаще, и в некоторых случаях я видел
char * a;
или что-то вроде этого. Опять же предпочтение. Я буду использовать все, что вам удобно, или то, что проект, над которым я работаю, использует (если я не напишу это сам, в этом случае я использую (а))
источник