Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.85/47: Рейтинг темы: голосов - 47, средняя оценка - 4.85
20 / 27 / 1
Регистрация: 14.03.2015
Сообщений: 796

Передача аргумента в функцию по значению, по ссылке, по указателю: в чём концептуальная разница?

11.02.2016, 15:47. Показов 9866. Ответов 72
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго всем здравия, прошу прощения, что достал уже всех этой темой.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
using namespace std;
 
int my_attemp(int y)
{
    y = 9;
    cout << "     " << y << endl;
    return y;
}
void setvalue(int* x)              // Создаем функцию, которая будет работать с адресом
{
    *x = 1;                        // по какому-то адресу размещаем 1
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    int k = 0, z;
    setvalue(&k);                  // Вызываем функцию и помещаем в нее адрес переменной
    cout << k << endl;             // Величина переменной изменилась после вызова функции
    my_attemp(k);                  // Вызываем функцию и помещаем в нее переменную 
    cout << k << endl;             // Величина переменной НЕ изменилась после вызова функции
    z = my_attemp(k);
    cout << "    " << z << "    " << k << endl;
 
 
    system("pause");
    return 0;
}
Вызываем функцию помещаем в нее адрес переменной, значение переменной меняется в main() функции.
Вызываем функцию помещаем в нее саму переменную, значение переменной НЕ меняется в main() функции.
Пожалуйста не используйте в объяснении бранные эпитеты.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.02.2016, 15:47
Ответы с готовыми решениями:

Передача параметров в функцию по значению, по ссылке и по указателю
Доброе время суток товарищи программисты. Столкнулся с кучей ошибок в написании простой программы. Задача заключается в том чтобы написать:...

Передача параметров в функцию по значению, по ссылке или по указателю
Передача параметров в функцию по значению, по ссылке или по указателю. Чем отличаются эти 3 способа. И, если не сложно, привести...

Передача параметров по указателю, ссылке и значению
Задание: Вычислить Y(x) и S(x). (где x принадлежит диапазону ) Y(x) и S(x) реализовать в виде отдельных функций. Продемонстрировать ...

72
 Аватар для _Valera_
495 / 377 / 136
Регистрация: 27.01.2015
Сообщений: 1,588
11.02.2016, 15:49
Передача данных по значению и по ссылке
1
Котовчанин
942 / 482 / 200
Регистрация: 16.02.2010
Сообщений: 3,338
Записей в блоге: 35
11.02.2016, 15:50
gogaloh, так в чём вопрос?
0
 Аватар для Wanket
19 / 10 / 0
Регистрация: 01.05.2015
Сообщений: 64
11.02.2016, 15:51

Не по теме:

Цитата Сообщение от gogaloh Посмотреть сообщение
бранные эпитеты.
Эх, если бы не правила форума:D


А так да, все верно
0
3 / 3 / 8
Регистрация: 25.11.2015
Сообщений: 127
11.02.2016, 15:52
gogaloh, А чего вы ждали? здесь
C++
1
int my_attemp(int y)
передаете параметр по значению, внутри функции создается копия К, и 9 становится копия параметра, а не сам параметр.
0
20 / 27 / 1
Регистрация: 14.03.2015
Сообщений: 796
11.02.2016, 16:13  [ТС]
_Valera_, "Когда в функцию передаётся объект по ссылке, то передаётся фактически этот объект. Когда же мы передаём объект по значению, то в функцию передаётся его копия." С этим понятно, но для закрепления в сознании, ссылка на уважаемый сайт или учебник не была бы лишней, ну и примеры еще увидеть. До меня доходит с 10 попытки.
Понимаю, что злоупотребляю Вашей добротой, но скажите, указатели всегда работают в паре с функциями или есть еще варианты их деятельности?
(Эксклюзивное право задавать глупые вопросы принадлежит только мне, прошу не забывать)
0
11.02.2016, 16:18

Не по теме:

Цитата Сообщение от gogaloh Посмотреть сообщение
До меня доходит с 10 попытки.
если не поможет - обращайся, еще сделаю :)
special for you :)
Цитата Сообщение от gogaloh Посмотреть сообщение
Когда в функцию передаётся объект по ссылке, то передаётся фактически этот объект. Когда же мы передаём объект по значению, то в функцию передаётся его копия
Цитата Сообщение от gogaloh Посмотреть сообщение
Когда в функцию передаётся объект по ссылке, то передаётся фактически этот объект. Когда же мы передаём объект по значению, то в функцию передаётся его копия
Цитата Сообщение от gogaloh Посмотреть сообщение
Когда в функцию передаётся объект по ссылке, то передаётся фактически этот объект. Когда же мы передаём объект по значению, то в функцию передаётся его копия
Цитата Сообщение от gogaloh Посмотреть сообщение
Когда в функцию передаётся объект по ссылке, то передаётся фактически этот объект. Когда же мы передаём объект по значению, то в функцию передаётся его копия
Цитата Сообщение от gogaloh Посмотреть сообщение
Когда в функцию передаётся объект по ссылке, то передаётся фактически этот объект. Когда же мы передаём объект по значению, то в функцию передаётся его копия
Цитата Сообщение от gogaloh Посмотреть сообщение
Когда в функцию передаётся объект по ссылке, то передаётся фактически этот объект. Когда же мы передаём объект по значению, то в функцию передаётся его копия
Цитата Сообщение от gogaloh Посмотреть сообщение
Когда в функцию передаётся объект по ссылке, то передаётся фактически этот объект. Когда же мы передаём объект по значению, то в функцию передаётся его копия
Цитата Сообщение от gogaloh Посмотреть сообщение
Когда в функцию передаётся объект по ссылке, то передаётся фактически этот объект. Когда же мы передаём объект по значению, то в функцию передаётся его копия
Цитата Сообщение от gogaloh Посмотреть сообщение
Когда в функцию передаётся объект по ссылке, то передаётся фактически этот объект. Когда же мы передаём объект по значению, то в функцию передаётся его копия
Цитата Сообщение от gogaloh Посмотреть сообщение
Когда в функцию передаётся объект по ссылке, то передаётся фактически этот объект. Когда же мы передаём объект по значению, то в функцию передаётся его копия

0
 Аватар для _Valera_
495 / 377 / 136
Регистрация: 27.01.2015
Сообщений: 1,588
11.02.2016, 16:20
Цитата Сообщение от gogaloh Посмотреть сообщение
или есть еще варианты их деятельности?
http://www.cplusplus.com/doc/tutorial/pointers/

Kastaneda, +1)))))
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
11.02.2016, 16:26
Цитата Сообщение от gogaloh Посмотреть сообщение
указатели всегда работают в паре с функциями или есть еще варианты их деятельности?
Указатель это такой же полноценный тип данных как int или double. Собственно и использоваться может аналогичным образом. А учитывая что программа так или иначе состоит из вызовов функций, то всё это работает не то что в паре, а в полнейшей групповухе.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
11.02.2016, 17:39
Цитата Сообщение от gogaloh Посмотреть сообщение
Когда в функцию передаётся объект по ссылке, то передаётся фактически этот объект.
Это правда. Как правда и то, что передачу по указателю, как передачу по адресу называют иногда передачей по ссылке. Пока Вы не твёрды в этих землях не делайте этого. До поры считайте, что по ссылке Вы ничего не передали. Вы передали по указателю. И это тоже укоренившееся зло. На самом деле Вы передали указатель. То что потом функция его разыменовала ("разадресовала" - синоним и ещё одна удача новичков в терминологии) это её внутреннее дело. Вполне можно представить функцию которая не разименовывает указатель, а делает что-то другое. То есть, передавая указатель, Вы передаёте копию указателя и это тоже передача по "значению". Другое дело, что обращаясь по адресу, который хранится в указателе, Вы можете прочесть или модифицировать не только этот адрес, но и значение по этому адресу. Поэтому, существует порочная и повсеместная практика называть такую передачу, - "передача переменной по указателю" или ещё хуже - "передача переменной по ссылке". Хотя ссылки тут нет (терминологический спор до драки возможен). Да и переменной вполне может не быть, если указатель не инициализирован и указывает куда попало или хуже того, указывает внутрь переменной другого типа. То есть, наверняка можно сказать, только, что передан указатель.
1
20 / 27 / 1
Регистрация: 14.03.2015
Сообщений: 796
11.02.2016, 18:06  [ТС]
IGPIGP, Если Ваша цель была взорвать мой мозг, поздравляю Вас! Попробую завтра с утра еще раз прочесть.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
11.02.2016, 18:31
Цитата Сообщение от gogaloh Посмотреть сообщение
Если Ваша цель была взорвать мой мозг, поздравляю Вас!
Уверяю, что такой цели не было, но это побочный эффект не редкий при изучении C++. Цель, - показать, что нет разницы между передачей переменной типа int и переменной типа int*. В обоих случаях передаются копии. В первом передаётся целое - копия целого, а во втором - указатель (адрес) целого, - копия указателя из места вызова. То что модифицируя значение по указателю Вы можете модифицировать значение переменной из области видимости места вызова, или ещё где-то, не делает такую передачу прямой передачей. Сначала написал, - передачей значения, но нельзя. Передача значения в программировании это передача как раз копии. Нет, это не я постарался заминировать зону для мозга).
Если ничего непонятно, - забудьте и всё. Просто поделайте примеры и попробуйте привыкнуть к обстановке.
0
20 / 27 / 1
Регистрация: 14.03.2015
Сообщений: 796
11.02.2016, 18:46  [ТС]
IGPIGP, Неужели в предыдущей жизни, я совершил в отношении Вас не простительный поступок?
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
11.02.2016, 18:55
gogaloh, если у Вас есть малейшее основание для такого предположения, то представьте. Или постарайтесь сосредоточиться на указателях.
gogaloh, если Вы только начли знакомиться с указателями, то почему не посмотреть простые примеры с указателями на тот же int в пределах одной области. В функции main например. Почему не посмотреть как по указателю обратиться к одиночной переменной или проитерировать по массиву.
Зачем начинаете с передачи указателя в функцию? Можно же и с указателей на полиморфные объекты начать.
Если сложно, - посмотрите указатели как таковые. А личного ничего нет. Не ищите.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
11.02.2016, 19:21
Цитата Сообщение от gogaloh Посмотреть сообщение
Вызываем функцию помещаем в нее саму переменную, значение переменной НЕ меняется в main() функции.
Передаётся копия переменной, изменение копии в функции не отражаются на оригинале в main().
Цитата Сообщение от gogaloh Посмотреть сообщение
Вызываем функцию помещаем в нее адрес переменной, значение переменной меняется в main() функции.
Результат разыменования указателя - есть ссылка на объект (т.е., получаем сам объект, а не его копию), поэтому изменения объекта в функции сохранятся.

Добавлено через 4 минуты
В чем отличие ссылочных переменных от указателей?
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
11.02.2016, 19:41
Цитата Сообщение от nd2 Посмотреть сообщение
Результат разыменования указателя - есть ссылка на объект
hoggy с очень высокого уровня абстракции это все преподносит. Результат разыменования указателя есть объект, а не ссылка на объект. Нужно это понять. Его пример (где выводится, что это ссылка) не корректен, потому что decltype так работает, нужно это тоже понимать. Вот контрпример
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <type_traits>
 
int main()
{
    std::cout << "Hello, world!\n";
    
    std::cout <<"чем является результат разыменовывания указателя?\n";
    
    int p;
    if(  std::is_reference<decltype((p))>::value )
        std::cout <<"о боже! ссылка!\n";
    
}
тут мы видим, что int это ссылка на int. Бред? Да! Он сам знает как это работает, просто морочит голову Нужно с осторожностью "проглатывать" такую информацию.
2
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
11.02.2016, 19:47
Цитата Сообщение от Kastaneda Посмотреть сообщение
тут мы видим, что int это ссылка на int.
имя P данной переменной int это ссылка на данную переменную. Это её первый "псевдоним"/"синоним". В области видимости, ссылки практически бессмысленны и почти не имеют отношения к формальному параметру-ссылке. Формальный параметр-ссылка это соглашение (магия ). Это не тип который ожидается и принимается, в отличие от всех других типов.
зы: TC это не нужно.
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
11.02.2016, 19:47
gogaloh, вот во мху енот.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
11.02.2016, 19:48
Цитата Сообщение от Kastaneda Посмотреть сообщение
Бред?
http://rextester.com/JBWW79003


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <type_traits>
 
 
 
int main()
{
    std::cout << "Hello, world!\n";
    
    std::cout <<"чем является результат разыменовывания указателя?\n";
    
    int p;
    if(  std::is_reference<decltype(p)>::value )
        std::cout <<"о боже! типом-по-значению!\n";
    else
        std::cout <<"хихик ^_^\n";
}
2
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
11.02.2016, 19:56
hoggy, ты своим кодом вывел меня из строя где-то на минуту, ничего странного там не видишь?

Добавлено через 1 минуту
Цитата Сообщение от IGPIGP Посмотреть сообщение
имя P данной переменной int это ссылка на данную переменную.
не надо додумывать, имя переменной - это имя переменной, ссылка - это ссылка
C++
1
2
3
4
5
6
7
8
9
10
int main()
{
    std::cout << "Hello, world!\n";
    
    std::cout <<"чем является результат разыменовывания указателя?\n";
    
    int p;
    if(  !std::is_reference<decltype(p)>::value )
        std::cout <<"о боже! типом-по-значению!\n";
}
а разный вывод - это особенность decltype
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.02.2016, 19:56
Помогаю со студенческими работами здесь

Передача параметров функции по значению, ссылке и указателю
Вычислить F=f(a)-5f^3(sin(b/2))+1/f(1+c^4), де f(x)=3x^2-2x^2+7, при a=5.08, b=-0.65, c=3.87 Добавлено через 45 минут #include...

Передача аргумента в функцию а не по указателю
Доброе время суток помогите разобраться как сделать задача: Написать функцию, которая удаляет начальные пробелы из строки,...

Передача в функцию по ссылке или указателю
Гуру C++, как предпочтительнее делать?:) void f1(int &amp;a) { a = 5; } void f2(int * a) {

Передача аргументов в функцию по ссылке и указателю
Чем отличается передача по ссылке от передачи по указателю аргументов в функцию?

Передача по указателю и по ссылке
Всем привет! Есть функция, в которую передается ссылка: void Compare(int &amp;p) { int * str = p;// здесь ошибка нельзя...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru