Страницы

Поиск по вопросам

воскресенье, 26 января 2020 г.

К чему относится оператор разыменовывания в Си?

#cpp #c #указатели


В разных источниках встречаю разное написание

int *address_0f_x = &longitude;
int* address_0f_x = &longitude;
int * address_0f_x = &longitude;


Компилируются все варианты, мне нравится второй, но к чему всё-таки правильно относить *? 
    


Ответы

Ответ 1



К переменной. Только это не разыменование, а объявление указателя. Пишите, как хотите, только помните, что int *p1, *p2; объявление двух указателей, а int* p1, p2; указателя p1 и переменной p2 типа int.

Ответ 2



tl;dr; * при объявлении переменной не является оператором разыменования, а является частью составного имени типа; имеет смысл использовать исключительно вариант 3. int * address_0f_x = &longitude; Исторически в С была симметрия объявления переменных-указателей и их использования. Объявляя переменную как int *p можно было сказать, что операция *p дает int. Кроме того, такой синтаксис позволял экономить байты текста в исходниках за счет объявления нескольких переменных в одной строке. Однако с появлением С++ и добавлением в него костылей для обозначения ссылок такая симметрия исчезла. Объявляя переменную как int &p нельзя сказать что операция &p дает int. А необходимости экономии байтов на исходных текстах программ исчезла, соответственно объявление нескольких переменных в одной строке стало индикатором маргинального и потенциально дефективного кода. Таким образом, имеет смысл разделять объявление переменной на ее тип int * и название самой переменной p. Так как тип в общем случае не может быть записан вплотную к идентификатору переменной (например запись intp; будет не корректна), то по соображениям единообразия имеет смысл не делать исключения для составных типов и всегда отделять тип от наименования переменной. По аналогии, так как составляющие типа в общем случае не могут быть записаны вплотную друг к другу (например запись longlongunsignedint будет некорректна), то по соображениям единообразия имеет смысл не делать исключения для частей * & и && и всегда разделять составляющие типа. Ну а еще лучше по возможности использовать алиасы типов, а не составные типы.

Ответ 3



int* p; Тип все тот же int, а * лишь обьявляет, что переменная это не обьект, а указатель на тип. Так что выделяется память не для типа, а память, равному одному машинному слову(независимо от типа), где хранится адрес обьекта. Я бы отнес(мысленно, а не в записи) знак к переменной, хотя сам имею привычку писать по образцу второго варианта.

Комментариев нет:

Отправить комментарий