Перейти к содержанию
    

Вобщем вопрос в названии темы!

 

Вот например при разбирании чужого кода наткнулся на следующую строчку:

 

EpCnfg[EP].pUSB_DmaDesc->DmaBufferLegtn = 1;

 

В данном примере и в первом и во втором случае идет обращение к елементу структуры... Но в первом случае используется оператор "." а во втором "->" какая принципиальная разница между этими обращениями... если это сделано специально, то что хотел показать автор данного кода выбирая тот или иной оператор?

 

P.S. Код взят из примера USB CDC из стандартных примеров IAR ARM.

Изменено пользователем Lexy_one

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

"." применяются со ссылками, а стрелочки с указателями.

EpCnfg[EP] - это ссылка (как я понимаю EP это название структуры, что и есть ссылка),

 

pUSB_DmaDesc - это указатель, элемент структуры EP (указывает тоже на какую-то структуру или класс, который имеет в своём составе элемент переменную DmaBufferLegtn).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

"." применяются со ссылками, а стрелочки с указателями.

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

Указатель же (тот, после которого идет стрелка) - это просто переменная, содержащая адрес объекта, на который она указывает. При объявлении указателя место в памяти под объект не резервируется, его можно инициализировать позже оператором new. Часто это более удобно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Разницы в принципе ни какой. Только ссылка не инкрементируется, а указатель да. Что при передаче структуры по линии связи указатель делает большое удобство. И ссылками мы передаём данные в функции, а указатели принимают. Короче, стандарт))))

Изменено пользователем KARLSON

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В си нет ссылок. Можно передавать данные только либо по значению либо по указателю. Ссылки - это из с++.

typedef struct
{
    int a;
    int b;
} dual_t;

dual_t dual1 = {1,2};
dual_t dual2 = {-1,-2};

int summ(dual_t* dual) // принимает указатель на структуру
{
    return (dual->a + dual->b);   // обращаемся к полям структуры через указатель
}

int main (void)
{
    if (summ(&dual1) > summ(&dual2)) // передаём указатель
    {
        dual1.a = 0;   // обращаемся к полям структуры напрямую по имени (не через указатель)
        dual2.b = 0;
    }

    return (0);
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вобщем вопрос в названии темы!

Ответ в любой книжке по языку Си!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

EpCnfg[EP].pUSB_DmaDesc->DmaBufferLegtn = 1;

EpCnfg - массив структур.

EP - индекс массива структур EpCnfg

pUSB_DmaDesc - элемент структуры EpCnfg, указатель на др. структуру

DmaBufferLegtn элемент этой самой др. структуры.

..как-то так.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тоесть код 1 идентичен коду 2:

 

Код 1

int summ(dual_t* dual) // принимает указатель на структуру

{

return (dual->a + dual->b); // обращаемся к полям структуры через указатель

}

 

Код 2

int summ(dual_t* dual) // принимает указатель на структуру

{

return ((*dual).a + (*dual).b ); // обращаемся к полям структуры через указатель

}

 

Значит строка "dual->a" заменяет оператор использования указателя "(*dual).a", и используется, как я понял, просто для упрощения читабельности кода?

Изменено пользователем Lexy_one

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тоесть код 1 идентичен коду 2

Операция "->" - опосредованный выбор

Операция "." - прямой выбор

Операция "*" - опосредование

Понятно, что "опосредованный выбор" можно заменить двумя операциями "опосредование" и "прямой выбор". Правда при этом нужно учесть ещё и приоритеты (опосредование имеет более низкий приоритет по сравнению с выбором), т.е. расставить скобки в нужных местах...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тоесть код 1 идентичен коду 2:
Да

Значит строка "dual->a" заменяет оператор использования указателя "(*dual).a"
В С да, в С++ - не всегда (могут быть разные тонкости, если dual - класс)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В С да, в С++ - не всегда (могут быть разные тонкости, если dual - класс)

Да вопрос со стороны С... с С++ понятно...

 

Спасиба за ответы. Разобрался!

Изменено пользователем Lexy_one

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Операция "->" - опосредованный выбор
Это то, что называют синтаксическим сахаром. На самом деле, можно было бы обойтись и без введения этой дополнительной операции.

a->b

 (*a).b

одно и то же.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

"." применяются со ссылками, а стрелочки с указателями.

"." применяются к самим переменным, а стрелочки к указателям на них. Разумеется, переменная (как и ссылка на нее) должна быть структурой.

 

EpCnfg[EP] - это ссылка (как я понимаю EP это название структуры, что и есть ссылка),

Ты неправильно понимаешь, в Си нет ссылок, их ввели в С++ в основном для того, чтобы можно было передавать параметры в функцию как по значению, так и по ссылке.

 

Ответ в любой книжке по языку Си!

А разве за такие ответы здесь не положено в бан?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

А разве оператор-функция не может обойтись без ссылок?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...