Какой ваш любимый способ объявить указатель?
int* i;
или
int *i;
или
int * i;
или
int*i;
Пожалуйста, объясните почему.
см. также: http://www.stroustrup.com/bs_faq2.html#whitespace
c
coding-style
pointers
lesmana
источник
источник
int*i;
- Пробелы не растут на деревьях, вы знаете ...Ответы:
Если вы напишите:
Вы вводите в заблуждение, что все i, j и k являются указателями на
int
.Поэтому я утверждаю, что лучше приложить * к имени переменной.
источник
int * i;
не претендовать только потому, что на первый взгляд это выглядит как умножение.int*
рассматривается как тип иint* i, j
объявляет два указателя. Вопрос может считаться неполным - это зависит от языка, который вы используете, какие стили являются разумными. В CI следуйтеint *x
, в C # я делаю иначе.Я предпочитаю,
int* i
потому чтоi
имеет тип «указатель на int», и я чувствую, что это делает его единым с системой типов. Конечно, хорошо известное поведение проявляется при попытке определить несколько указателей в одной строке (а именно, звездочку нужно ставить перед каждым именем переменной для объявления указателя), но я просто не объявляю указатели таким образом. Кроме того, я думаю, что это серьезный дефект в языках C-стиля.источник
*i
имеет типint
.Для C, где у нас нет сильного внимания к типам, я предпочитаю:
int *i;
Потому что он имеет упор на
int
, а не указатель. Что этоint
?*i
это инт.источник
int i = 5
, чтобы получить значениеi
, вы используете имяi
. Точно так же, если у вас естьint *i; *i = 5
, то чтобы получить значение, вы используете*i
.Я предпочел в
int* i
течение многих лет. Однако есть веский аргумент,int *i
потому что при использовании предыдущего стиля вы все равно должны помнить правило множественного объявления:Поскольку вы должны помнить это правило, вы не получите ничего в явном виде, но я бы не сказал, что оно более сложное. Избегание нескольких объявлений в одной строке - это просто еще один способ сказать, что вы помните это правило. Разница между этими двумя стилями спорна.
Однако даже когда я его использую, кажется немного глупым притворяться, что синтаксис объявления C работает иначе, чем когда он ставит звездочку рядом с типом, а не с переменной, с которой он синтаксически связан.
Я не покупаю в том , что один подчеркивает тип указателя (для
i
) , а другой подчеркивает тип INT (для*i
), но это может быть , что после 15 лет использования С и С ++, это просто есть , когда я смотрю на него, без необходимость думать об этом »-« что-то, что большинство новичков, которые задают этот вопрос, еще не могут сделать.Кроме того, даже учитывая мои предпочтения, я не считаю неловким чтение / запись кода в другом стиле. Последовательность, бла-бла-бла.
Не нужно даже упоминать
int * i
.источник
Я предпочитаю первый. Это естественно, так как указатель является частью типа.
Поскольку я использую C #, он обрабатывает типы более интуитивно понятным способом, чем C, поэтому нет проблем с объявлением нескольких указателей в одном выражении:
источник
Я предпочитаю
int* i
(стиль C ++).Я избегаю объявлять несколько переменных в одном выражении из-за возникающей визуальной неоднозначности (
int* i, j
).См. Также Bjarne Stroustrup's C ++ Style and Technique FAQ для обоснования.
источник
Если вы хотите объявить несколько переменных, но не хотите повторять звездочку:
(Как вы можете видеть внутри шаблона структуры, я предпочитаю
int* i
стиль.)А вот более общее решение:
Этот работает с любым «проблемным типом», например, массивами и ссылками:
источник
typedef int* int_ptr
сделал бы свое дело. Конечно, я должен объявить новый typedef для разных типов указателей, но на практике, сколько это будет? Восемь максимум?Я бы пошел,
int* i;
так как первая часть обозначает тип переменной (указатель на int), а вторая часть обозначает имя (i
). Для меня не имеет смысла, что типint
и имя*i
. Кроме того,int * i;
для меня это выглядит как умножение.источник
В декларациях, которые я использую
int * i;
, вы читаете это какi is a pointer to an integer
.Указатель вносит вклад как в тип, так и в переменную, поэтому он должен быть посередине.
Это хорошая вещь, чтобы избежать объявления нескольких вещей в одной строке:
int * i, j;
источник
Я фактически использую все три соглашения в определенных обстоятельствах. На первый взгляд я выгляжу противоречивым, но ...
int *
когда идентификатор отсутствует, визуально подтвердить, что имя отсутствует.int* intptr
наtypedef
s и подобные объявления, чтобы визуально подтвердить, что это часть типа. Аналогично с объявлениями указателей на функции:(int* (*foo)(int))
int *identifier
иclass &identifier
на параметры функции для визуального подтверждения того, что параметр потенциально является так называемым параметром «out».const int * const * const
всякий раз, когда я использую квалификаторы cv .int * foo;
на местных декларациях.Я думаю, что я немного визуально ориентирован.
источник
В C нет типов указателей! Итак, «int *» ничего не значит. Звездочка всегда связана с элементом, написанным справа от него, она относится к элементу права на него. "* я" является int. И поскольку * i является int, из этого следует, что i является указателем на int. Это логика, и именно поэтому «int * i» является единственно возможным решением. Все остальное - иллюзия (которая в большинстве случаев автоматически исправляется компилятором). В C ++ и C # это что-то другое. Но для Си есть только одна библия: «Деннис М. Ричи: Язык программирования Си». Деннис (RIP!) Написал это: "int * i". Нет необходимости подвергать сомнению это.
источник
int*
тип указателяЯ использую,
int *i
потому что легче понять, что это указатель, хотя я не думаю, что это действительно важно.источник