Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.06.2011, 13:03   #1
soirkar
Пользователь
 
Регистрация: 21.06.2011
Сообщений: 13
По умолчанию амперсанд &

Объясните, пожалуйста, что он делает, как и когда его использовать. На данном куске кода.
Код:
void del(goods *&head, goods *&tail, goods *p) 
{
	if(p->next != NULL) p->next->last=p->last;
	else tail=p->last;
	if(p->last != NULL) p->last->next=p->next;
	else head=p->next;
	delete p;
}
.....
else if (action == 6)
{
int d,size;
puts("\tВведите номер товара, который хотите удалить из базы данныха...\n\n");
scanf("%d",&d);
p=head;
for (int i=0; i<(d-1) && p != NULL; i++)
{
p=p->next;
}

del(head,tail,p);
}
Если его убрать, то работать не будет, почему?
soirkar вне форума Ответить с цитированием
Старый 23.06.2011, 13:09   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

потому что это оператор взятия адреса переменной.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 23.06.2011, 13:31   #3
soirkar
Пользователь
 
Регистрация: 21.06.2011
Сообщений: 13
По умолчанию

То есть амперсанд - ссылка на объект. Чтобы объект мог изменяться внутри другой функции? Можно подробнее, пожалуйста.
soirkar вне форума Ответить с цитированием
Старый 23.06.2011, 13:40   #4
An1ka
C++,DirectX/OpenGL
Форумчанин
 
Регистрация: 09.01.2011
Сообщений: 422
По умолчанию

Цитата:
Сообщение от soirkar Посмотреть сообщение
То есть амперсанд - ссылка на объект. Чтобы объект мог изменяться внутри другой функции? Можно подробнее, пожалуйста.
Это операция взятия адреса.
Код:
int c;
int *p = &c;
Вот пример простой с присвоением указателю p адреса c.
An1ka вне форума Ответить с цитированием
Старый 23.06.2011, 14:41   #5
soirkar
Пользователь
 
Регистрация: 21.06.2011
Сообщений: 13
По умолчанию

Что будет если его убрать из кода?
Очень круто, что это операция взятия адреса, а как она работает на моем куске кода?
soirkar вне форума Ответить с цитированием
Старый 23.06.2011, 15:03   #6
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

А в какой именно кусок кода вас интересует? У & в C++ три предназначения:
1. Когда & - бинарный оператор. В этом случае он представляет побитовое И над двумя числами.
2. Когда & - унарный оператор. В данном случае он представляет операцию взятия адреса переменной.
3. Когда & - в декларации типа. В этом же случае, он определяет, что тип - ссылочный.

По сути два последних случая представляют одно и то же, только когда & как унарный оператор, то происходит явное взятие адреса переменной программистом, когда & в декларации типа, то происходит неявное взятия адреса переменной.
В вашем куске кода она работает также как и во всех остальных кусках кода.
scanf'у нужно знать куда записать считанную переменную, потому вы передаёте ему адрес этой переменной.
А del должен изменить значение указателей, потому он принимает всё это дело по ссылке. Можно было переписать del так:
Код:
void del(goods** head, goods** tail, goods** p) {
..
}

...
del(&head, &tail, &p);
То бишь тогда бы вы явно передавали адрес переменных.
Короче говоря - адрес переменной нужен для того, чтобы её можно было изменить тем функциям, которые не имеют прямого доступа к ней (как del не имеет доступа к переменным ф-ции main).
netrino вне форума Ответить с цитированием
Старый 23.06.2011, 15:39   #7
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Вопрос, как я понял заключается в том, почему в функции del параметр объявлен как goods *&. Нужно это для того, чтобы при выходе из функции head и tail получили новые значения. То есть ты передаешь в функцию адрес указателя, а не его копию, что было бы при таком объявлении goods *
EUGY вне форума Ответить с цитированием
Старый 23.06.2011, 16:47   #8
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

Код:
goods *&
это ссылка на указатель.
profi вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Одинарный амперсанд и ушко. the_deer_one Общие вопросы C/C++ 3 11.03.2011 23:27
JavaScript амперсанд Namolem Помощь студентам 0 13.02.2010 11:33
TForm & TImage & PNG & Прозрачность delphi_beginner Общие вопросы Delphi 7 19.09.2009 08:46
Просто не понимаю б чём проблема!!!!!!!(char* && index) artush1984 Общие вопросы C/C++ 12 30.05.2009 03:30
Оператор амперсанд "&" или число внутри текста dotvz Microsoft Office Excel 2 02.04.2008 14:33