реклама на сайте
подробности

 
 
> Точки и Стрелочки :), Где правильно применять "." а где "->" при обращени
Lexy_one
сообщение Aug 29 2011, 14:50
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 90
Регистрация: 28-07-09
Из: Чернигов
Пользователь №: 51 621



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

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

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

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

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

Сообщение отредактировал Lexy_one - Aug 29 2011, 14:50
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 14)
KARLSON
сообщение Aug 29 2011, 14:58
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 604
Регистрация: 5-05-06
Из: Нижегородская обл.
Пользователь №: 16 819



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

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


--------------------
Кризис - это не отсутствие денег, а отсутствие идей! Учитесь и никаких кризисов не будет.
Go to the top of the page
 
+Quote Post
V_G
сообщение Aug 29 2011, 15:31
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955



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

В принципе так, только я не понимаю, что есть ссылка в языке Си. То, что Вы называете ссылкой - это имя класса или структуры. Когда мы объявляем этот класс или структуру по имени, в памяти резервируется место, потребное для размещения данного объекта.
Указатель же (тот, после которого идет стрелка) - это просто переменная, содержащая адрес объекта, на который она указывает. При объявлении указателя место в памяти под объект не резервируется, его можно инициализировать позже оператором new. Часто это более удобно.
Go to the top of the page
 
+Quote Post
KARLSON
сообщение Aug 29 2011, 15:39
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 604
Регистрация: 5-05-06
Из: Нижегородская обл.
Пользователь №: 16 819



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

Сообщение отредактировал KARLSON - Aug 29 2011, 15:43


--------------------
Кризис - это не отсутствие денег, а отсутствие идей! Учитесь и никаких кризисов не будет.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Aug 30 2011, 05:32
Сообщение #5


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



В си нет ссылок. Можно передавать данные только либо по значению либо по указателю. Ссылки - это из с++.
Код
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);
}


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
andrew_b
сообщение Aug 30 2011, 06:41
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757



Цитата(Lexy_one @ Aug 29 2011, 18:50) *
Вобщем вопрос в названии темы!

Ответ в любой книжке по языку Си!
Go to the top of the page
 
+Quote Post
skripach
сообщение Aug 30 2011, 07:16
Сообщение #7


■ ■ ■ ■
*****

Группа: Свой
Сообщений: 1 100
Регистрация: 9-08-06
Пользователь №: 19 443



Цитата
EpCnfg[EP].pUSB_DmaDesc->DmaBufferLegtn = 1;

EpCnfg - массив структур.
EP - индекс массива структур EpCnfg
pUSB_DmaDesc - элемент структуры EpCnfg, указатель на др. структуру
DmaBufferLegtn элемент этой самой др. структуры.
..как-то так.


--------------------
Делай что должен и будь что будет.
Go to the top of the page
 
+Quote Post
Lexy_one
сообщение Aug 30 2011, 07:23
Сообщение #8


Частый гость
**

Группа: Участник
Сообщений: 90
Регистрация: 28-07-09
Из: Чернигов
Пользователь №: 51 621



Тоесть код 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, 07:25
Go to the top of the page
 
+Quote Post
Палыч
сообщение Aug 30 2011, 07:41
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Lexy_one @ Aug 30 2011, 11:23) *
Тоесть код 1 идентичен коду 2

Операция "->" - опосредованный выбор
Операция "." - прямой выбор
Операция "*" - опосредование
Понятно, что "опосредованный выбор" можно заменить двумя операциями "опосредование" и "прямой выбор". Правда при этом нужно учесть ещё и приоритеты (опосредование имеет более низкий приоритет по сравнению с выбором), т.е. расставить скобки в нужных местах...
Go to the top of the page
 
+Quote Post
XVR
сообщение Aug 30 2011, 07:50
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(Lexy_one @ Aug 30 2011, 11:23) *
Тоесть код 1 идентичен коду 2:
Да
Цитата
Значит строка "dual->a" заменяет оператор использования указателя "(*dual).a"
В С да, в С++ - не всегда (могут быть разные тонкости, если dual - класс)
Go to the top of the page
 
+Quote Post
Lexy_one
сообщение Aug 30 2011, 08:23
Сообщение #11


Частый гость
**

Группа: Участник
Сообщений: 90
Регистрация: 28-07-09
Из: Чернигов
Пользователь №: 51 621



Цитата(XVR @ Aug 30 2011, 10:50) *
В С да, в С++ - не всегда (могут быть разные тонкости, если dual - класс)

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

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

Сообщение отредактировал Lexy_one - Aug 30 2011, 08:24
Go to the top of the page
 
+Quote Post
andrew_b
сообщение Aug 30 2011, 08:32
Сообщение #12


Профессионал
*****

Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757



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

Код
(*a).b

одно и то же.
Go to the top of the page
 
+Quote Post
777777
сообщение Aug 30 2011, 09:13
Сообщение #13


Профессионал
*****

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



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

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

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

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

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

А разве за такие ответы здесь не положено в бан?
Go to the top of the page
 
+Quote Post
dxp
сообщение Aug 30 2011, 13:08
Сообщение #14


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



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

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


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
777777
сообщение Aug 30 2011, 15:06
Сообщение #15


Профессионал
*****

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



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

А разве оператор-функция не может обойтись без ссылок?
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 26th July 2025 - 00:15
Рейтинг@Mail.ru


Страница сгенерированна за 0.01681 секунд с 7
ELECTRONIX ©2004-2016