Размещение звездочки в объявлениях указателей - PullRequest
78 голосов
/ 08 октября 2008

Я недавно решил, что мне нужно, наконец, выучить C / C ++, и есть одна вещь, которую я не совсем понимаю в отношении указателей или, точнее, их определения.

Как насчет этих примеров:

  1. int* test;
  2. int *test;
  3. int * test;
  4. int* test,test2;
  5. int *test,test2;
  6. int * test,test2;

Теперь, насколько я понимаю, все первые три случая делают одно и то же: Test - это не int, а указатель на один.

Второй набор примеров немного сложнее. В случае 4 и test, и test2 будут указателями на int, тогда как в случае 5 только test является указателем, тогда как test2 - это "реальное" int. Что насчет случая 6? То же, что и в случае 5?

Ответы [ 14 ]

0 голосов
/ 28 сентября 2017

Я бы сказал, что первоначальное соглашение состояло в том, чтобы поставить звезду на стороне имени указателя (правая сторона объявления

  • в языке программирования c Денниса М. Ричи: звезды находятся на правой стороне декларации.

  • , посмотрев на исходный код Linux на https://github.com/torvalds/linux/blob/master/init/main.c мы видим, что звезда тоже на правой стороне.

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

0 голосов
/ 01 января 2016

Смысл в C в том, что вы объявляете переменные так, как вы их используете. Например

char *a[100];

говорит, что *a[42] будет char. И a[42] указатель на символ. И, таким образом, a является массивом указателей на символы.

Это потому, что авторы оригинального компилятора хотели использовать один и тот же парсер для выражений и объявлений. (Не очень разумная причина для выбора дизайна языка)

0 голосов
/ 18 ноября 2009

Случаи 1, 2 и 3 одинаковы, они объявляют указатели на переменные типа int. Случаи 3, 4 и 5 одинаковы, так как они объявляют один указатель на и одну переменную int соответственно. Если вы хотите объявить два указателя в одной строке (чего не следует делать), вам нужно поставить звездочку перед каждым именем переменной:

int *test, *test2;

Не существует определенного правильного способа, который говорит, куда идет звездочка. int* test выглядит лучше, потому что нам легче представить, что добавление * в конец типа означает «указатель на» этот тип. Однако int *test имеет больше смысла, потому что вы можете работать с ним, как знак минус в математике:

-(-x) = x

аналогично

*(*test) = test

Это всегда помогало мне. К сожалению, результатом всего этого является то, что иногда я использую int* test, а иногда int *test.

0 голосов
/ 08 октября 2008

Хорошее практическое правило, многие люди, кажется, понимают эти понятия следующим образом: В C ++ много семантического значения получают путем левой привязки ключевых слов или идентификаторов.

Взять например:

int const bla;

Константа относится к слову "int". То же самое относится и к звездочкам указателей, они применяются к ключевому слову слева от них. А фактическое имя переменной? Да, это заявлено тем, что от него осталось.

...