C несколько однострочных объявлений

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

int x, y, z;

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

int* x, y, z;

Все ли они являются указателями int?


person ruralcoder    schedule 14.07.2010    source источник
comment
Отредактированный вопрос, так как он не имеет ничего общего с Objective C   -  person Nikolai Ruhe    schedule 14.07.2010
comment
Я знаю, что где-то здесь есть дубликат этого вопроса (я определенно читал это раньше)   -  person Mark Elliot    schedule 14.07.2010


Ответы (4)


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

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

int* x, y, z;

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

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

int *x, *y, *z;

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

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

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

person John Bode    schedule 14.07.2010
comment
Действительно полный ответ на основной вопрос о том, является ли * типом или переменной. - person ruralcoder; 14.07.2010

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

int x, y, z;

Все они int.

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

int* x, y, z;

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

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

int *x, *y, *z;
person Pablo Santa Cruz    schedule 14.07.2010
comment
Это одна из причин, по которой интервал int* foo; действительно ошибочен. В примере этого вопроса это выглядит так, как будто все 3 переменные имеют тип int*. Я бы сказал, что этот интервал почти так же оскорбителен, как a+b * c. - person R.. GitHub STOP HELPING ICE; 14.07.2010

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

int * x, * y, * z;
person Macmade    schedule 14.07.2010

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

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

person hyde    schedule 07.04.2013