синтаксис объявления указателя в c(c++)

Модератор: Модераторы разделов

Аватара пользователя
кып
Сообщения: 77
ОС: Xubuntu

синтаксис объявления указателя в c(c++)

Сообщение кып »

Здравствуйте всем.

Озаботился я изучением программирования на с/с++ и возник у меня такой философский вопрос:

Как же все-таки идеологически правильно объявлять указатели?

Код: Выделить всё

int * p;
int* p;
int *p;

Насколько я понимаю все три объявления синтаксически правильны.
Хотелось бы определится какое из них наиболее правильное.

Я склоняюсь к третьему варианту, поскольку он на мой взгляд более однозначен и позволяет в большей степени избегать ошибок вроде этой:
Хотели объявить два указателя на int, а объявили один указатель и одну переменную типа int.

Код: Выделить всё

int* p1, p2;

вместо

Код: Выделить всё

int *p1, *p2;
Спасибо сказали:
Аватара пользователя
RasenHerz
Сообщения: 1341
ОС: Arch Linux amd64

Re: синтаксис объявления указателя в c(c++)

Сообщение RasenHerz »

не знаю, как идеологически правильно, но я делаю так: в прототипах функций - foo(int*, int*), просто переменные - int *a, *b; приведение к типу - (int*).
Спасибо сказали:
Аватара пользователя
destr
Сообщения: 128
ОС: Debian

Re: синтаксис объявления указателя в c(c++)

Сообщение destr »

О! Это по моему вечный спор:) Да, пример int* a, b; всегда приводится в таких спорах, но с другой стороны нехорошо объявлять в одной строке несколько переменных, кроме наверное i, j, k:) Так что вопрос филосовский. Я объявляю int *a;

Вот информация для размышления:)
http://www.sofmos.com/lyosha/Articles/CNotes_Asterisk.html
Спасибо сказали:
Аватара пользователя
кып
Сообщения: 77
ОС: Xubuntu

Re: синтаксис объявления указателя в c(c++)

Сообщение кып »

А, ну все понятно. (с) "Служебный роман"

Тема оказалась холиварная.

Т.е. вывод напрашивается такой:
Пишем как привыкли
или
Пишем как принято в конкретном месте(code convention)

Спасибо.
Спасибо сказали:
Аватара пользователя
deninok
Сообщения: 585
Статус: Программист С++
ОС: Debian GNU/Linux

Re: синтаксис объявления указателя в c(c++)

Сообщение deninok »

[holywar]
Я считаю, что правильно писать так:

Объяснение простое: звёздочка (как признак указателя) относится не к i, а к int. Ведь это отдельный тип: "указатель на..." Вот и читаем справа налево: i является "указателем на int".
[holywar]

А вообще, данный вопрос лично мне представляется столь незначительным, что, как верно заметил уважаемый кып, писать нужно как регламентировано правилами в конкретной ситуации.
Спасибо сказали:
Аватара пользователя
AestheteAnimus
Сообщения: 135
ОС: FreeBSD 8.0-RELEASE amd64

Re: синтаксис объявления указателя в c(c++)

Сообщение AestheteAnimus »

кып писал(а):
25.01.2009 19:24
Как же все-таки идеологически правильно объявлять указатели?

Как уже отметили, никакой разницы. Я почти у верен, что у любого из здесь присутствующих найдутся все указанные способы объявления и читабельность от этого не теряется.

Тем не менее, сошлавшись на "Веревку", можно рекоммендовать такой способ.

При таком объявлении (по крайней мере, мне) становится ясна разница межу такими объявлениями:

Код: Выделить всё

int *a;
const int *b;
int const *c;
int *const d;
const int *const e;
Спасибо сказали:
Аватара пользователя
Folderx
Сообщения: 296
ОС: fedora, mandriva

Re: синтаксис объявления указателя в c(c++)

Сообщение Folderx »

Код: Выделить всё

int a, b, c, *d, *e[10], **f(int *, int *);

естественно так не только читабельнее, но ещё и удобнее при их переносе из одного кода в другой

то же самое в изобретательном виде, вместо одной понятной строки три понятных строки

Код: Выделить всё

int a, b, c;
int* d, e[10];
int** f(int *, int *);


причём первый вариант я могу разделить так

Код: Выделить всё

int **f(int *, int *);
int a, b, c, *pa;
int *e[10];

и переменные группировать как угодно по смыслу
Спасибо сказали:
Аватара пользователя
Rootlexx
Бывший модератор
Сообщения: 4467
Статус: GNU generation
ОС: Debian GNU/Linux

Re: синтаксис объявления указателя в c(c++)

Сообщение Rootlexx »

deninok писал(а):
26.01.2009 08:54
Объяснение простое: звёздочка (как признак указателя) относится не к i, а к int. Ведь это отдельный тип: "указатель на..."

Лично я пользуюсь:

Код: Выделить всё

int *p_value;

Звёздочка относится не к int, а как раз к p_value. Иначе такая строка:

Код: Выделить всё

int* p_val0, p_val1;

— означала бы объявление двух указателей, хотя на самом деле p_val1 будет обычным числом типа int.
Спасибо сказали: