Lexy_one 0 29 августа, 2011 Опубликовано 29 августа, 2011 (изменено) · Жалоба Вобщем вопрос в названии темы! Вот например при разбирании чужого кода наткнулся на следующую строчку: EpCnfg[EP].pUSB_DmaDesc->DmaBufferLegtn = 1; В данном примере и в первом и во втором случае идет обращение к елементу структуры... Но в первом случае используется оператор "." а во втором "->" какая принципиальная разница между этими обращениями... если это сделано специально, то что хотел показать автор данного кода выбирая тот или иной оператор? P.S. Код взят из примера USB CDC из стандартных примеров IAR ARM. Изменено 29 августа, 2011 пользователем Lexy_one Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KARLSON 1 29 августа, 2011 Опубликовано 29 августа, 2011 · Жалоба "." применяются со ссылками, а стрелочки с указателями. EpCnfg[EP] - это ссылка (как я понимаю EP это название структуры, что и есть ссылка), pUSB_DmaDesc - это указатель, элемент структуры EP (указывает тоже на какую-то структуру или класс, который имеет в своём составе элемент переменную DmaBufferLegtn). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
V_G 8 29 августа, 2011 Опубликовано 29 августа, 2011 · Жалоба "." применяются со ссылками, а стрелочки с указателями. В принципе так, только я не понимаю, что есть ссылка в языке Си. То, что Вы называете ссылкой - это имя класса или структуры. Когда мы объявляем этот класс или структуру по имени, в памяти резервируется место, потребное для размещения данного объекта. Указатель же (тот, после которого идет стрелка) - это просто переменная, содержащая адрес объекта, на который она указывает. При объявлении указателя место в памяти под объект не резервируется, его можно инициализировать позже оператором new. Часто это более удобно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KARLSON 1 29 августа, 2011 Опубликовано 29 августа, 2011 (изменено) · Жалоба Разницы в принципе ни какой. Только ссылка не инкрементируется, а указатель да. Что при передаче структуры по линии связи указатель делает большое удобство. И ссылками мы передаём данные в функции, а указатели принимают. Короче, стандарт)))) Изменено 29 августа, 2011 пользователем KARLSON Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 30 августа, 2011 Опубликовано 30 августа, 2011 · Жалоба В си нет ссылок. Можно передавать данные только либо по значению либо по указателю. Ссылки - это из с++. 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 16 30 августа, 2011 Опубликовано 30 августа, 2011 · Жалоба Вобщем вопрос в названии темы! Ответ в любой книжке по языку Си! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
skripach 6 30 августа, 2011 Опубликовано 30 августа, 2011 · Жалоба EpCnfg[EP].pUSB_DmaDesc->DmaBufferLegtn = 1; EpCnfg - массив структур. EP - индекс массива структур EpCnfg pUSB_DmaDesc - элемент структуры EpCnfg, указатель на др. структуру DmaBufferLegtn элемент этой самой др. структуры. ..как-то так. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lexy_one 0 30 августа, 2011 Опубликовано 30 августа, 2011 (изменено) · Жалоба Тоесть код 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", и используется, как я понял, просто для упрощения читабельности кода? Изменено 30 августа, 2011 пользователем Lexy_one Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 10 30 августа, 2011 Опубликовано 30 августа, 2011 · Жалоба Тоесть код 1 идентичен коду 2 Операция "->" - опосредованный выбор Операция "." - прямой выбор Операция "*" - опосредование Понятно, что "опосредованный выбор" можно заменить двумя операциями "опосредование" и "прямой выбор". Правда при этом нужно учесть ещё и приоритеты (опосредование имеет более низкий приоритет по сравнению с выбором), т.е. расставить скобки в нужных местах... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 30 августа, 2011 Опубликовано 30 августа, 2011 · Жалоба Тоесть код 1 идентичен коду 2:Да Значит строка "dual->a" заменяет оператор использования указателя "(*dual).a"В С да, в С++ - не всегда (могут быть разные тонкости, если dual - класс) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lexy_one 0 30 августа, 2011 Опубликовано 30 августа, 2011 (изменено) · Жалоба В С да, в С++ - не всегда (могут быть разные тонкости, если dual - класс) Да вопрос со стороны С... с С++ понятно... Спасиба за ответы. Разобрался! Изменено 30 августа, 2011 пользователем Lexy_one Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 16 30 августа, 2011 Опубликовано 30 августа, 2011 · Жалоба Операция "->" - опосредованный выбор Это то, что называют синтаксическим сахаром. На самом деле, можно было бы обойтись и без введения этой дополнительной операции. a->b (*a).b одно и то же. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
777777 0 30 августа, 2011 Опубликовано 30 августа, 2011 · Жалоба "." применяются со ссылками, а стрелочки с указателями. "." применяются к самим переменным, а стрелочки к указателям на них. Разумеется, переменная (как и ссылка на нее) должна быть структурой. EpCnfg[EP] - это ссылка (как я понимаю EP это название структуры, что и есть ссылка), Ты неправильно понимаешь, в Си нет ссылок, их ввели в С++ в основном для того, чтобы можно было передавать параметры в функцию как по значению, так и по ссылке. Ответ в любой книжке по языку Си! А разве за такие ответы здесь не положено в бан? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 58 30 августа, 2011 Опубликовано 30 августа, 2011 · Жалоба в Си нет ссылок, их ввели в С++ в основном для того, чтобы можно было передавать параметры в функцию как по значению, так и по ссылке. Скорее ссылки ввели в С++ для реализации операторов-функций, а то, что с помощью них стало возможна иная семантика передачи аргументов, то это побочный эффект. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
777777 0 30 августа, 2011 Опубликовано 30 августа, 2011 · Жалоба Скорее ссылки ввели в С++ для реализации операторов-функций, а то, что с помощью них стало возможна иная семантика передачи аргументов, то это побочный эффект. А разве оператор-функция не может обойтись без ссылок? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться