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

Возможные дубликаты:
Что имеет смысл - строка char * или char *? Объявления указателя в С++: размещение звездочки

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

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

someType* somePtr;

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

someType *somePtr;

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

Ответ 1

Это вопрос предпочтения и несколько священной войны, как и стиль фигурной скобки.

Стиль

someType* somePtr;

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

Стиль

someType *somePtr

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

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

Поместите его посередине (как someType * somePtr), чтобы избежать фиксации одной из них.

Ответ 2

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

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

Ответ 3

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

Некоторым людям нравится сохранять тип вместе:

int* p;

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

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

Со временем вы просто упустите это и согласитесь с обоими вариантами.

Ответ 4

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

int  *pValue;

читает "разыменование pValue - это int" тогда как программист на С++ думает в "типах", поэтому

int* pValue;

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

Ответ 5

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

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

Ответ 6

Каждый раз, когда я когда-либо видел,

TheType *myPointer

потому что вы объявляете POINTER типа TheType. Аналогичное объявление

TheType myVar

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

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

TheType myVar, *myPointer;