C несколько однострочных объявлений - PullRequest
28 голосов
/ 14 июля 2010

Что происходит, когда я объявляю несколько переменных в одной строке? например,

int x, y, z;

Все являются целыми. Вопрос в том, каковы y и z в следующем утверждении?

int* x, y, z;

Все ли они int-указатели?

Ответы [ 4 ]

60 голосов
/ 14 июля 2010

Только x - указатель на int; y и z - обычные целые числа.

Это один из аспектов синтаксиса объявления C, который запутывает некоторых людей. C использует концепцию декларатора , которая вводит имя объявленной вещи вместе с дополнительной информацией о типе, не предоставляемой спецификатором типа . В декларации

int* x, y, z;

деклараторами являются *x, y и z (это случай синтаксиса C, когда вы можете написать int* x или int *x, и этот вопрос является одной из нескольких причин, почему я рекомендую использовать второй стиль). Целочисленность x, y и z определяется спецификатором типа int, а указатель x определяется декларатором *x (IOW, выражение *x имеет тип int).

Если вы хотите, чтобы все три объекта были указателями, у вас есть два варианта. Вы можете явно объявить их как указатели:

int *x, *y, *z;

или вы можете создать typedef для указателя типа int:

typedef int *iptr;
iptr x, y, z;

Просто помните, что при объявлении указателя * является частью имени переменной, а не типа.

8 голосов
/ 14 июля 2010

В вашем первом предложении:

int x, y, z;

Они все int с.

Однако во втором:

int* x, y, z;

Только x является указателем на int. y и z простые int с.

Если вы хотите, чтобы все они были указателями на int s, вам нужно сделать:

int *x, *y, *z;
7 голосов
/ 14 июля 2010

Только x является указателем на int. Y и Z будут просто int. Если вы хотите три указателя:

int * x, * y, * z;
3 голосов
/ 07 апреля 2013

Важно знать, что в C декларация имитирует использование.Унарный оператор * является ассоциативным справа в C. Так, например, в int *x x имеет указатель типа на int (или int-star), а в int x x имеет тип int.

Как уже упоминали другие, в int* x, y, z; компилятор C объявляет x как целую звезду, а y и z как целое число.

...