Это случай синтаксиса C, который вы можете написать любым способом;однако он всегда анализируется как
Type (*pointer);
, то есть *
всегда привязан к декларатору, а не к спецификатору типа.Если бы вы написали
Type* pointer1, pointer2;
, это было бы проанализировано как
Type (*pointer1), pointer2;
, поэтому в качестве типа указателя будет объявлен только pointer1.
C следует за "объявлением, имитирующим использованиепарадигма;структура объявления должна максимально имитировать эквивалентное выражение, используемое в коде.Например, если у вас есть массив указателей на int с именем arr
, и вы хотите получить целочисленное значение, на которое указывает i-й элемент в массиве, вы должны добавить индекс в массив и разыменовать результат, который записанкак *arr[i]
(анализируется как *(arr[i])
).Типом выражения *arr[i]
является int
, поэтому объявление для arr
записывается как
int *arr[N];
Какой путь вправо ?Зависит от того, кого вы спрашиваете.Старые пуки C, такие как я, предпочитают T *p
, потому что они отражают то, что на самом деле происходит в грамматике.Многие программисты на C ++ предпочитают T* p
, потому что он подчеркивает тип p
, который кажется более естественным во многих обстоятельствах (написав мои собственные типы контейнеров, я вижу смысл, хотя он все еще кажется мне неправильным).
Если вы хотите объявить несколько указателей, вы можете либо объявить их все явно, например:
T *p1, *p2, *p3;
, либо создать typedef:
typedef T *tptr;
tptr p1, p2, p3;
хотя я лично не рекомендую это;сокрытие указателя чего-либо за typedef может укусить вас, если вы не будете осторожны.