URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 6238
[ Назад ]

Исходное сообщение
"Стесняюсь спросить про указатели"

Отправлено VasKa , 07-Мрт-07 00:47 
Извините за чайниковский вопрос - есть ли разница в способе объявления указателя, к примеру:
char*  str;
или
char  *str;
Или оба способа написания корректны и дадут указатель str на char?

Содержание

Сообщения в этом обсуждении
"Стесняюсь спросить про указатели"
Отправлено pvl , 07-Мрт-07 01:46 
>char*  str;
>или
>char  *str;

оба обьявят str как указатель на char.

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


"Стесняюсь спросить про указатели"
Отправлено rmf , 07-Мрт-07 08:46 
я против войны:

char * str

:)


"Стесняюсь спросить про указатели"
Отправлено DeadLoco , 08-Мрт-07 14:47 
>я против войны:
>
>char * str
>
>:)

Синтаксис char* крайне чреват нездоровыми последствиями. В силу того, что видится вовсе не то, что распознает компилятор. Сравните:

    char*  var1,  var2;
    char  *var3,  var4;
    char  *var5, *var6;

typedef char* pchar;
    pchar  var7,  var8;


Воевать тут можно только по незнанию.


"Стесняюсь спросить про указатели"
Отправлено Michelnok , 08-Мрт-07 15:00 
>Воевать тут можно только по незнанию.

Ну, вообще-то обьявлять в одной строке переменные разных типов тоже не совсем кошерно...


"Стесняюсь спросить про указатели"
Отправлено DeadLoco , 08-Мрт-07 16:13 
>>Воевать тут можно только по незнанию.
>
>Ну, вообще-то обьявлять в одной строке переменные разных типов тоже не совсем
>кошерно...

А разве очевидно, что

    char* var1, var2;

это разные типы? Разве синтаксис определения в сях не имеет вид

    type  varname[[, varname]...];

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


"Стесняюсь спросить про указатели"
Отправлено Michelnok , 08-Мрт-07 16:19 

>А разве очевидно, что
>
>    char* var1, var2;
>
>это разные типы?

Нет. Но и

char *var1, var2;

тоже не есть хорошо. Гораздо лучше

char *var1;
char var2;


"Стесняюсь спросить про указатели"
Отправлено rmf , 08-Мрт-07 16:34 
>тоже не есть хорошо. Гораздо лучше
>
>char *var1;
>char var2;

Ну вот и пошла война (см. в постах выше)

А вот так?
По крайней мере логика в этом есть.

char* ptr1,ptr2,ptr3;
char  ch1,ch2,ch3;
int*  pint1,pint2;

ЗЫ: Мне пох. Сам иногда по разному пишу. -Wall нужно включать.


"Стесняюсь спросить про указатели"
Отправлено DeadLoco , 08-Мрт-07 19:51 
>А вот так?
>По крайней мере логика в этом есть.
>
>char* ptr1,ptr2,ptr3;
>char  ch1,ch2,ch3;
>int*  pint1,pint2;

В том то и дело, что в первой и третьей строке только ptr1 и pint1 будут указателями, а ptr2, ptr3 и pint2 будут символами и целым соответственно.

В данном случае мы имеем дело с несоответствием синтаксиса и семантики деклараций в сях.

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