Какой ваш любимый способ объявить указатель?
int* i;
или
int *i;
или
int * i;
или
int*i;
Пожалуйста, объясните почему.
см. также: http://www.stroustrup.com/bs_faq2.html#whitespace
int*i;- Пробелы не растут на деревьях, вы знаете ...
Какой ваш любимый способ объявить указатель?
int* i;
или
int *i;
или
int * i;
или
int*i;
Пожалуйста, объясните почему.
см. также: http://www.stroustrup.com/bs_faq2.html#whitespace
int*i;- Пробелы не растут на деревьях, вы знаете ...
Ответы:
Если вы напишите:
int* i, j, k;
Вы вводите в заблуждение, что все 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потому что при использовании предыдущего стиля вы все равно должны помнить правило множественного объявления:
int* a, *b; // not int* a, b;
Поскольку вы должны помнить это правило, вы не получите ничего в явном виде, но я бы не сказал, что оно более сложное. Избегание нескольких объявлений в одной строке - это просто еще один способ сказать, что вы помните это правило. Разница между этими двумя стилями спорна.
Однако даже когда я его использую, кажется немного глупым притворяться, что синтаксис объявления C работает иначе, чем когда он ставит звездочку рядом с типом, а не с переменной, с которой он синтаксически связан.
Я не покупаю в том , что один подчеркивает тип указателя (для i) , а другой подчеркивает тип INT (для *i), но это может быть , что после 15 лет использования С и С ++, это просто есть , когда я смотрю на него, без необходимость думать об этом »-« что-то, что большинство новичков, которые задают этот вопрос, еще не могут сделать.
Кроме того, даже учитывая мои предпочтения, я не считаю неловким чтение / запись кода в другом стиле. Последовательность, бла-бла-бла.
Не нужно даже упоминать int * i.
Я предпочитаю int* i(стиль C ++).
Я избегаю объявлять несколько переменных в одном выражении из-за возникающей визуальной неоднозначности ( int* i, j).
См. Также Bjarne Stroustrup's C ++ Style and Technique FAQ для обоснования.
Если вы хотите объявить несколько переменных, но не хотите повторять звездочку:
template <typename T>
struct pointer_to
{
typedef T* type;
};
pointer_to<int>::type p1, p2, p3;
(Как вы можете видеть внутри шаблона структуры, я предпочитаю int* iстиль.)
А вот более общее решение:
template <typename T>
struct identity
{
typedef T type;
};
identity<int*>::type p1, p2, p3;
Этот работает с любым «проблемным типом», например, массивами и ссылками:
identity<int[10]>::type a1, a2, a3;
identity<int&>::type r1(*p1), r2(*p2), r3(*p3);
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на typedefs и подобные объявления, чтобы визуально подтвердить, что это часть типа. Аналогично с объявлениями указателей на функции:(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*тип указателя