|
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
|
|||||||||||||||||||||||||||||||
Передача аргументов в функции08.06.2012, 22:18. Показов 16567. Ответов 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 | |
Сообщение было отмечено как решение
Решение
В пункте А) ты передаешь адрес переменной, а так как ф-ия получает адрес она может использовать операцию разыменования для доступа к значению передаваемой переменной. А дальше её использует.
В пункте Б) ты передаешь по ссылке, а это значит что ты будешь работать напрямую с переменной. В пункте В) ты передаешь по значению, а это значит что ты будешь работать с копией передаваемого аргумента, после выхода из ф-ю значение переменной останется прежним, а когда по ссылке по изменится.
3
|
|
|
|
|
| 08.06.2012, 22:58 | |
|
Ну как я понимаю в любом случае будут создаваться копии...
Вопрос в том только копии чего? адреса(указателя или ссыки) или самой переменной. в первом случае можно изменить значение переменной(значение по адресу) из нутри ф-ции, а во втором нет. По указателю и по ссылке есть смысл передавать в двух случаях: 1. Что бы изменить (возвратить) больше чем одно значение переменной. 2. Для повышения эффективности( например при передаче const T& параметров) но я как понимаю это имеет смысл когда ссылка размером меньше чем сам объект
1
|
|
|
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
|
|||||||
| 08.06.2012, 23:00 [ТС] | |||||||
|
Andrey.K, спасибо, конечно, но я вроде написал:
Avazart, Добавлено через 1 минуту
0
|
|||||||
|
|
|||||||||
| 08.06.2012, 23:11 | |||||||||
1
|
|||||||||
|
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
|
|||
| 08.06.2012, 23:12 [ТС] | |||
|
Avazart, блин... Придется попутно спросить, не дошел еще до этого
![]() В смысле с какими типами.Добавлено через 54 секунды
0
|
|||
|
|
||||||
| 08.06.2012, 23:14 | ||||||
|
Тоже что и
1
|
||||||
|
348 / 269 / 128
Регистрация: 14.11.2010
Сообщений: 482
|
|||||||
| 08.06.2012, 23:15 | |||||||
1
|
|||||||
|
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
|
||||
| 08.06.2012, 23:22 [ТС] | ||||
|
Avazart,
Andrey.K, Вы привели такой пример?
0
|
||||
|
|
|||||||||||
| 08.06.2012, 23:34 | |||||||||||
|
Пример с шаблоном - хотя это уже другая тема!!!
1
|
|||||||||||
|
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
|
||
| 08.06.2012, 23:50 [ТС] | ||
|
Avazart,
Так все-таки, что Вы там имели в виду про копию и локальную ссылку? Я так это понял: при задействовании функции внутри нее условно создается локальная ссылка на переменную, с которой работает данная функция. Вы про это?
0
|
||
|
|
|||||||||||
| 09.06.2012, 00:03 | |||||||||||
|
Про это, но почему "условная" ?
Добавлено через 7 минут "Копии указателей"
1
|
|||||||||||
|
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
|
||
| 09.06.2012, 12:38 [ТС] | ||
|
Avazart, все-таки не могу понять почему после вызова функции
0
|
||
|
|
||||||
| 09.06.2012, 14:05 | ||||||
|
Мы получили копии переменных содержащих адреса а и b(т.е копии указателей на а и b) а затем меняли не значения переменных а сами адреса.
Например такое бы проканало
0
|
||||||
|
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
|
||
| 09.06.2012, 18:26 [ТС] | ||
|
Avazart,
В самой же функции замена произошла. pa получила адрес pb и наоброт. А после выполнения функции этой замены нет. Почему?
0
|
||
|
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
|
||
| 09.06.2012, 19:10 [ТС] | ||
|
Avazart, хм. Ладно. А как тогда поменять там адреса оригиналов(пользуясь указателями)?
0
|
||
|
|
|||||||||||
| 09.06.2012, 19:52 | |||||||||||
1
|
|||||||||||
|
10 / 10 / 2
Регистрация: 26.02.2012
Сообщений: 36
|
|
| 09.06.2012, 20:05 | |
|
Все очень просто .))
если ты создаешь указатель допустим int* PtrInt - то он указывает на адрес ячейки в памяти.(причем указывая тип int ты объясняешь указателю какой объем ячейка занимает) Используя PtrInt - ты меняешь адресс на который указывает данный указатель. Используя *PtrInt - ты изменяешь сами данные в этой ячейке. По ссылке. <&> очень удобная штука если не охота заморачиваться - мол функция должна что то выдавать и бла-бла-бла .)) В твоем примере видно как это обыгрывается. В функцию выдается адрес ячейки.(Узнать адресс любой ячейки можно через добавочную &) так вот отдавая в функцию адрес - ты уже внутри работаешь с той же частью памяти, а не создаешь дополнительную копию, загромождая память(как в твоем 3 примере, хотя и эта переменная будет удалена по окончанию функции). Главное их отличие: Указатель - указывает первоначально на адрес ячейки (без снежинки). Ссылка - указывает на данные в ячейки (без &). Так же забыл сказать. Указатели в основном используются для динамических переменных, а ссылки для статических. p.s. Динамические - забирают память в процессе работы программы, а статические при его загрузке.
2
|
|
| 09.06.2012, 20:05 | |
|
Помогаю со студенческими работами здесь
20
Передача аргументов функции Передача аргументов функции и параметры Передача аргументов в функции по ссылке Рекурсивная функция и передача аргументов функции Передача аргументов командной строки функции main() Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
|
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога
Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
|
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
|
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования.
Часть библиотеки BedvitCOM
Использованы. . .
|
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога
SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
|