1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
|
|||||||||||||||||||||||||||||||
1 | |||||||||||||||||||||||||||||||
Передача аргументов в функции08.06.2012, 22:18. Показов 15741. Ответов 24
Метки нет (Все метки)
Ребят, никогда раньше не задумывался каким же образом передаются аргументы. Сейчас же дошел до передачи аргументов через указатель и ссылку. И вот зашел в небольшой тупик.
Вот 3 простейших примера передачи аргументов: а) через указатель:
Хочется же узнать что конкретно происходит (не на словах, а кодом), когда функция получает аргумент во всех 3 случаях. Я понимаю это так: а)
1) правильно ли я это сделал? 2) насчет "разжевок" под "б" и "в". Все-таки немного не понимаю, почему в случае "б" от n берется адрес, а в случае "в" - значение? Это определяет тип переменной? int& и int соответственно? Хм, они выступают в качестве операторов, что ли? Я просто как думал: есть у нас что-то, что мы собираемся послать в качестве аргумента в функцию. И это что-то при посылке и при попадании в качестве аргумента в функцию не меняется. Т.е. в данном случае что-то это n. У этой переменной есть значение - мы его и посылаем... Правда у этой переменной есть и адрес =/ Ммм, короче опять залез в кашу, которая ни для кого не каша... Помогите, пожалуйста. Передайте своей логики, плиз, ибо в книгах просто все очевидно: передаем значение в функцию. Если аргумент функции имеет тип ссылки - принимаем адрес, если указатель - принимаем адрес, если просто тип - принимаем значение. Все просто. Но мне бы хотелось как-то иначе бы это понять. Надеюсь на поддержку
0
|
08.06.2012, 22:18 | |
Ответы с готовыми решениями:
24
Передача аргументов функции Передача аргументов функции Функции и передача аргументов Передача аргументов функции |
348 / 269 / 128
Регистрация: 14.11.2010
Сообщений: 482
|
|
08.06.2012, 22:33 | 2 |
Сообщение было отмечено как решение
Решение
В пункте А) ты передаешь адрес переменной, а так как ф-ия получает адрес она может использовать операцию разыменования для доступа к значению передаваемой переменной. А дальше её использует.
В пункте Б) ты передаешь по ссылке, а это значит что ты будешь работать напрямую с переменной. В пункте В) ты передаешь по значению, а это значит что ты будешь работать с копией передаваемого аргумента, после выхода из ф-ю значение переменной останется прежним, а когда по ссылке по изменится.
3
|
08.06.2012, 22:58 | 3 |
Ну как я понимаю в любом случае будут создаваться копии...
Вопрос в том только копии чего? адреса(указателя или ссыки) или самой переменной. в первом случае можно изменить значение переменной(значение по адресу) из нутри ф-ции, а во втором нет. По указателю и по ссылке есть смысл передавать в двух случаях: 1. Что бы изменить (возвратить) больше чем одно значение переменной. 2. Для повышения эффективности( например при передаче const T& параметров) но я как понимаю это имеет смысл когда ссылка размером меньше чем сам объект
1
|
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
|
|
08.06.2012, 23:00 [ТС] | 4 |
Andrey.K, спасибо, конечно, но я вроде написал:
? Avazart, Мм... А можно примерчик какой-нибудь? С подобным не сталкивался, но если действительно есть такое, то тогда да - смысл использовать указатель/ссылки действительно имеется. Добавлено через 1 минуту Хм... Копии? Т.е. типа в любом случае создается условная ссылка?
0
|
08.06.2012, 23:11 | 5 | |||||
1
|
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
|
|
08.06.2012, 23:12 [ТС] | 6 |
Avazart, блин... Придется попутно спросить, не дошел еще до этого
Если по-простому то что это такое? Некий абстрактный класс, которому без разницы с чем работать? В смысле с какими типами. Добавлено через 54 секунды Согласен. Только вот как-то... В случае "б" - получается локальная ссылка на ссылку?
0
|
08.06.2012, 23:14 | 7 | |||||
Тоже что и
1
|
348 / 269 / 128
Регистрация: 14.11.2010
Сообщений: 482
|
||||||
08.06.2012, 23:15 | 8 | |||||
1
|
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
|
|
08.06.2012, 23:22 [ТС] | 10 |
Avazart,
Значит я Вас не понял. Вы что имели тут в виду? Andrey.K, Не догнал Вы привели такой пример?
0
|
08.06.2012, 23:34 | 11 | |||||
Пример с шаблоном - хотя это уже другая тема!!!
Код
Текущая кодовая страница: 1251 12 abcdefg Для продолжения нажмите любую клавишу . . .
1
|
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
|
|
08.06.2012, 23:50 [ТС] | 12 |
Avazart,
Согласен. Так все-таки, что Вы там имели в виду про копию и локальную ссылку? Я так это понял: при задействовании функции внутри нее условно создается локальная ссылка на переменную, с которой работает данная функция. Вы про это?
0
|
09.06.2012, 00:03 | 13 | |||||
Про это, но почему "условная" ?
Добавлено через 7 минут "Копии указателей"
Код
Текущая кодовая страница: 1251 a= 5 b= 7 a= 5 b= 7 Для продолжения нажмите любую клавишу . . .
1
|
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
|
|
09.06.2012, 12:38 [ТС] | 14 |
Avazart, все-таки не могу понять почему после вызова функции
не меняются значения... Ведь в самой функции мы адреса, на которые указывают указатели, местами поменяли... Или это и есть "локальная замена"? А почему так?
0
|
09.06.2012, 14:05 | 15 | |||||
Мы получили копии переменных содержащих адреса а и b(т.е копии указателей на а и b) а затем меняли не значения переменных а сами адреса.
Например такое бы проканало
0
|
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
|
|
09.06.2012, 18:26 [ТС] | 16 |
Avazart,
Да это понятно. Вот вопрос как раз в том почему после выполнения данной функции адреса не поменялись? В самой же функции замена произошла. pa получила адрес pb и наоброт. А после выполнения функции этой замены нет. Почему?
0
|
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
|
|
09.06.2012, 19:10 [ТС] | 18 |
Avazart, хм. Ладно. А как тогда поменять там адреса оригиналов(пользуясь указателями)?
- здесь мы играемся со значениями. А как вот чисто адрес поменять?
0
|
09.06.2012, 19:52 | 19 | |||||
Код
Текущая кодовая страница: 1251 a= 5 b= 7 *pa= 5 *pb= 7 a= 5 b= 7 *pa= 7 *pb= 5 Для продолжения нажмите любую клавишу . . .
1
|
10 / 10 / 2
Регистрация: 26.02.2012
Сообщений: 36
|
|
09.06.2012, 20:05 | 20 |
Все очень просто .))
если ты создаешь указатель допустим int* PtrInt - то он указывает на адрес ячейки в памяти.(причем указывая тип int ты объясняешь указателю какой объем ячейка занимает) Используя PtrInt - ты меняешь адресс на который указывает данный указатель. Используя *PtrInt - ты изменяешь сами данные в этой ячейке. По ссылке. <&> очень удобная штука если не охота заморачиваться - мол функция должна что то выдавать и бла-бла-бла .)) В твоем примере видно как это обыгрывается. В функцию выдается адрес ячейки.(Узнать адресс любой ячейки можно через добавочную &) так вот отдавая в функцию адрес - ты уже внутри работаешь с той же частью памяти, а не создаешь дополнительную копию, загромождая память(как в твоем 3 примере, хотя и эта переменная будет удалена по окончанию функции). Главное их отличие: Указатель - указывает первоначально на адрес ячейки (без снежинки). Ссылка - указывает на данные в ячейки (без &). Так же забыл сказать. Указатели в основном используются для динамических переменных, а ссылки для статических. p.s. Динамические - забирают память в процессе работы программы, а статические при его загрузке.
2
|
09.06.2012, 20:05 | |
09.06.2012, 20:05 | |
Помогаю со студенческими работами здесь
20
Передача аргументов функции и параметры Передача аргументов в функции по ссылке Рекурсивная функция и передача аргументов функции Передача аргументов командной строки функции main() Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |