Объявление указателей; звездочка слева или справа от пробела между типом и именем? [дубликат]


Возможные Дубликаты:
что имеет больше смысла-char * string или char * string? объявления указателя в C++: размещение звездочки

Я видел смешанные версии этого в большом количестве кода. (Это относится к C и C++, кстати.) Люди, похоже, объявляют указатели одним из двух способов, и я понятия не имею, какой из них правильный, если это даже имеет значение.

первый способ это поставить звездочка рядом с именем типа, например:

someType* somePtr;

второй способ-поставить звездочку рядом с именем переменной, вот так:

someType *somePtr;

Это уже давно сводит меня с ума. Есть ли стандартный способ объявления указателя? Имеет ли вообще значение, как объявляются указатели? Я использовал оба объявления раньше, и я знаю, что компилятору все равно, каким образом это происходит. Однако тот факт, что я видел указатели, объявленные двумя разными способами заставляет меня поверить, что за этим стоит какая-то причина. Мне любопытно, если какой-либо метод является более читаемым или логичным в некотором роде, что мне не хватает.

6 87

6 ответов:

это вопрос предпочтения, и что-то вроде священной войны, так же, как стиль скобки.

стиль

someType* somePtr;

подчеркивает тип переменной указателя. Это говорит, по существу, " тип somePtr это указатель на -someType".

стиль

someType *somePtr

подчеркивает тип указанных данных. Он говорит, по существу, " тип данных, на которые указывает somePtr и someType".

они оба означают одно и то же, но это зависит от того, является ли ментальная модель данного программиста при создании указателя "сфокусированной", так сказать, на указанных данных или переменной указателя.

положить его в середине (как someType * somePtr) пытается избежать совершения любого из них.

Это не важно. Кто-то сейчас придет и закроет вопрос как дурак, а кто-то еще покажет как int* a путь ломается, если вы объявляете несколько переменных в одних и тех же объявлениях в то время как int *a способ лучше отражает синтаксическую структуру кода, и другой парень покажет, что Страуструп предпочитает int* a путь.

много мнений, но нет "правильного" пути здесь.

это не имеет значения, это личные предпочтения.

некоторые люди любят держать типа:

int* p;

другие люди говорят, что он должен идти рядом с переменной из-за следующего:

int *p, x;//declare 1 int pointer and 1 int
int *p, *x;//declare 2 int pointers.

со временем вы просто забудете об этом и примете оба варианта.

разница возникла из-за того, что C++ добавил более сильную систему типов поверх C. программист C обычно думает в терминах "значений", поэтому

int  *pValue;

читает " разыменование pValue является int" в то время как программист на C++ думает в "типах" так

int* pValue;

читает " тип pValue является указателем на int" Компилятор, конечно, не видит никакой разницы. Однако вы обнаружите, что именно программист C настаивает на "семантике значений" при программировании на C++.

Я думаю, что поставив звездочку рядом с именем переменной яснее.

вы можете ошибочно объявить someType* one, two; думая, что они оба указатели, но только переменная one указатель; two это просто someType. Объявления someType *one, *two позволяет избежать этой проблемы.

каждый способ, который я когда-либо видел

TheType *myPointer

потому что вы объявляете указатель типа TheType. Подобное объявление

TheType myVar

будет объявлять переменную экземпляра типа TheType.

также вы можете четко сделать это и легко читаемо

TheType myVar, *myPointer;