Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Точки и Стрелочки :)
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Lexy_one
Вобщем вопрос в названии темы!

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

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

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

P.S. Код взят из примера USB CDC из стандартных примеров IAR ARM.
KARLSON
"." применяются со ссылками, а стрелочки с указателями.
EpCnfg[EP] - это ссылка (как я понимаю EP это название структуры, что и есть ссылка),

pUSB_DmaDesc - это указатель, элемент структуры EP (указывает тоже на какую-то структуру или класс, который имеет в своём составе элемент переменную DmaBufferLegtn).
V_G
Цитата(KARLSON @ Aug 30 2011, 01:58) *
"." применяются со ссылками, а стрелочки с указателями.

В принципе так, только я не понимаю, что есть ссылка в языке Си. То, что Вы называете ссылкой - это имя класса или структуры. Когда мы объявляем этот класс или структуру по имени, в памяти резервируется место, потребное для размещения данного объекта.
Указатель же (тот, после которого идет стрелка) - это просто переменная, содержащая адрес объекта, на который она указывает. При объявлении указателя место в памяти под объект не резервируется, его можно инициализировать позже оператором new. Часто это более удобно.
KARLSON
Разницы в принципе ни какой. Только ссылка не инкрементируется, а указатель да. Что при передаче структуры по линии связи указатель делает большое удобство. И ссылками мы передаём данные в функции, а указатели принимают. Короче, стандарт))))
demiurg_spb
В си нет ссылок. Можно передавать данные только либо по значению либо по указателю. Ссылки - это из с++.
Код
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);
}
andrew_b
Цитата(Lexy_one @ Aug 29 2011, 18:50) *
Вобщем вопрос в названии темы!

Ответ в любой книжке по языку Си!
skripach
Цитата
EpCnfg[EP].pUSB_DmaDesc->DmaBufferLegtn = 1;

EpCnfg - массив структур.
EP - индекс массива структур EpCnfg
pUSB_DmaDesc - элемент структуры EpCnfg, указатель на др. структуру
DmaBufferLegtn элемент этой самой др. структуры.
..как-то так.
Lexy_one
Тоесть код 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 @ Aug 30 2011, 11:23) *
Тоесть код 1 идентичен коду 2

Операция "->" - опосредованный выбор
Операция "." - прямой выбор
Операция "*" - опосредование
Понятно, что "опосредованный выбор" можно заменить двумя операциями "опосредование" и "прямой выбор". Правда при этом нужно учесть ещё и приоритеты (опосредование имеет более низкий приоритет по сравнению с выбором), т.е. расставить скобки в нужных местах...
XVR
Цитата(Lexy_one @ Aug 30 2011, 11:23) *
Тоесть код 1 идентичен коду 2:
Да
Цитата
Значит строка "dual->a" заменяет оператор использования указателя "(*dual).a"
В С да, в С++ - не всегда (могут быть разные тонкости, если dual - класс)
Lexy_one
Цитата(XVR @ Aug 30 2011, 10:50) *
В С да, в С++ - не всегда (могут быть разные тонкости, если dual - класс)

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

Спасиба за ответы. Разобрался!
andrew_b
Цитата(Палыч @ Aug 30 2011, 11:41) *
Операция "->" - опосредованный выбор
Это то, что называют синтаксическим сахаром. На самом деле, можно было бы обойтись и без введения этой дополнительной операции.
Код
a->b

Код
(*a).b

одно и то же.
777777
Цитата(KARLSON @ Aug 29 2011, 18:58) *
"." применяются со ссылками, а стрелочки с указателями.

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

Цитата(KARLSON @ Aug 29 2011, 18:58) *
EpCnfg[EP] - это ссылка (как я понимаю EP это название структуры, что и есть ссылка),

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

Цитата(andrew_b @ Aug 30 2011, 10:41) *
Ответ в любой книжке по языку Си!

А разве за такие ответы здесь не положено в бан?
dxp
Цитата(777777 @ Aug 30 2011, 16:13) *
в Си нет ссылок, их ввели в С++ в основном для того, чтобы можно было передавать параметры в функцию как по значению, так и по ссылке.

Скорее ссылки ввели в С++ для реализации операторов-функций, а то, что с помощью них стало возможна иная семантика передачи аргументов, то это побочный эффект.
777777
Цитата(dxp @ Aug 30 2011, 17:08) *
Скорее ссылки ввели в С++ для реализации операторов-функций, а то, что с помощью них стало возможна иная семантика передачи аргументов, то это побочный эффект.

А разве оператор-функция не может обойтись без ссылок?
HARMHARM
Цитата(777777 @ Aug 30 2011, 18:06) *
А разве оператор-функция не может обойтись без ссылок?

Как минимум, операторы, содержащие '=' не могут.
andrew_b
Цитата(777777 @ Aug 30 2011, 13:13) *
А разве за такие ответы здесь не положено в бан?

Нет, не положено. Для того, чтобы получить ответ на элементарные вопросы, существуют учебники, а не форум. Автор темы даже не потрудился заглянуть в книжку.
Lexy_one
Цитата(andrew_b @ Aug 31 2011, 07:30) *
Нет, не положено. Для того, чтобы получить ответ на элементарные вопросы, существуют учебники, а не форум. Автор темы даже не потрудился заглянуть в книжку.


Вопрос был не "что такое ->", а где правильно применять "->" или "."
Просто при использовании указателей на структуры я привык использовать "(*a).b".
777777
Цитата(andrew_b @ Aug 31 2011, 08:30) *
Нет, не положено. Для того, чтобы получить ответ на элементарные вопросы, существуют учебники, а не форум. Автор темы даже не потрудился заглянуть в книжку.

Элементарность вопросов зависит от вопрошающего. Тем более что это форум для начинающих.

Цитата(Lexy_one @ Aug 31 2011, 10:44) *
Просто при использовании указателей на структуры я привык использовать "(*a).b".

Это еще зачем? Читабельность улучшает? sm.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.