Объявление указателей; звездочку слева или справа от пространства между типом и именем?
Возможные дубликаты:
Что имеет смысл - строка 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;