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

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

11.02.2016, 15:47. Просмотров 5259. Ответов 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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.02.2016, 15:47
Ответы с готовыми решениями:

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

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

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

Передача параметров функции по значению, ссылке и указателю
Вычислить 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 ...

72
493 / 375 / 136
Регистрация: 27.01.2015
Сообщений: 1,588
11.02.2016, 15:49 2
Передача данных по значению и по ссылке
1
Котовчанин
940 / 480 / 200
Регистрация: 16.02.2010
Сообщений: 3,338
Записей в блоге: 37
11.02.2016, 15:50 3
gogaloh, так в чём вопрос?
0
19 / 10 / 0
Регистрация: 01.05.2015
Сообщений: 64
11.02.2016, 15:51 4

Не по теме:

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


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

Не по теме:

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

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

Kastaneda, +1)))))
0
:)
Эксперт С++
4764 / 3258 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
11.02.2016, 16:26 9
Цитата Сообщение от gogaloh Посмотреть сообщение
указатели всегда работают в паре с функциями или есть еще варианты их деятельности?
Указатель это такой же полноценный тип данных как int или double. Собственно и использоваться может аналогичным образом. А учитывая что программа так или иначе состоит из вызовов функций, то всё это работает не то что в паре, а в полнейшей групповухе.
0
Комп_Оратор)
Эксперт по математике/физике
8615 / 4333 / 584
Регистрация: 04.12.2011
Сообщений: 12,947
Записей в блоге: 14
11.02.2016, 17:39 10
Цитата Сообщение от gogaloh Посмотреть сообщение
Когда в функцию передаётся объект по ссылке, то передаётся фактически этот объект.
Это правда. Как правда и то, что передачу по указателю, как передачу по адресу называют иногда передачей по ссылке. Пока Вы не твёрды в этих землях не делайте этого. До поры считайте, что по ссылке Вы ничего не передали. Вы передали по указателю. И это тоже укоренившееся зло. На самом деле Вы передали указатель. То что потом функция его разыменовала ("разадресовала" - синоним и ещё одна удача новичков в терминологии) это её внутреннее дело. Вполне можно представить функцию которая не разименовывает указатель, а делает что-то другое. То есть, передавая указатель, Вы передаёте копию указателя и это тоже передача по "значению". Другое дело, что обращаясь по адресу, который хранится в указателе, Вы можете прочесть или модифицировать не только этот адрес, но и значение по этому адресу. Поэтому, существует порочная и повсеместная практика называть такую передачу, - "передача переменной по указателю" или ещё хуже - "передача переменной по ссылке". Хотя ссылки тут нет (терминологический спор до драки возможен). Да и переменной вполне может не быть, если указатель не инициализирован и указывает куда попало или хуже того, указывает внутрь переменной другого типа. То есть, наверняка можно сказать, только, что передан указатель.
1
20 / 27 / 1
Регистрация: 14.03.2015
Сообщений: 792
11.02.2016, 18:06  [ТС] 11
IGPIGP, Если Ваша цель была взорвать мой мозг, поздравляю Вас! Попробую завтра с утра еще раз прочесть.
0
Комп_Оратор)
Эксперт по математике/физике
8615 / 4333 / 584
Регистрация: 04.12.2011
Сообщений: 12,947
Записей в блоге: 14
11.02.2016, 18:31 12
Цитата Сообщение от gogaloh Посмотреть сообщение
Если Ваша цель была взорвать мой мозг, поздравляю Вас!
Уверяю, что такой цели не было, но это побочный эффект не редкий при изучении C++. Цель, - показать, что нет разницы между передачей переменной типа int и переменной типа int*. В обоих случаях передаются копии. В первом передаётся целое - копия целого, а во втором - указатель (адрес) целого, - копия указателя из места вызова. То что модифицируя значение по указателю Вы можете модифицировать значение переменной из области видимости места вызова, или ещё где-то, не делает такую передачу прямой передачей. Сначала написал, - передачей значения, но нельзя. Передача значения в программировании это передача как раз копии. Нет, это не я постарался заминировать зону для мозга).
Если ничего непонятно, - забудьте и всё. Просто поделайте примеры и попробуйте привыкнуть к обстановке.
0
20 / 27 / 1
Регистрация: 14.03.2015
Сообщений: 792
11.02.2016, 18:46  [ТС] 13
IGPIGP, Неужели в предыдущей жизни, я совершил в отношении Вас не простительный поступок?
0
Комп_Оратор)
Эксперт по математике/физике
8615 / 4333 / 584
Регистрация: 04.12.2011
Сообщений: 12,947
Записей в блоге: 14
11.02.2016, 18:55 14
gogaloh, если у Вас есть малейшее основание для такого предположения, то представьте. Или постарайтесь сосредоточиться на указателях.
gogaloh, если Вы только начли знакомиться с указателями, то почему не посмотреть простые примеры с указателями на тот же int в пределах одной области. В функции main например. Почему не посмотреть как по указателю обратиться к одиночной переменной или проитерировать по массиву.
Зачем начинаете с передачи указателя в функцию? Можно же и с указателей на полиморфные объекты начать.
Если сложно, - посмотрите указатели как таковые. А личного ничего нет. Не ищите.
0
nd2
3405 / 2786 / 1251
Регистрация: 29.01.2016
Сообщений: 9,423
11.02.2016, 19:21 15
Цитата Сообщение от gogaloh Посмотреть сообщение
Вызываем функцию помещаем в нее саму переменную, значение переменной НЕ меняется в main() функции.
Передаётся копия переменной, изменение копии в функции не отражаются на оригинале в main().
Цитата Сообщение от gogaloh Посмотреть сообщение
Вызываем функцию помещаем в нее адрес переменной, значение переменной меняется в main() функции.
Результат разыменования указателя - есть ссылка на объект (т.е., получаем сам объект, а не его копию), поэтому изменения объекта в функции сохранятся.

Добавлено через 4 минуты
В чем отличие ссылочных переменных от указателей?
0
Jesus loves me
Эксперт С++
5116 / 3128 / 353
Регистрация: 12.12.2009
Сообщений: 7,915
Записей в блоге: 2
11.02.2016, 19:41 16
Цитата Сообщение от 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
Комп_Оратор)
Эксперт по математике/физике
8615 / 4333 / 584
Регистрация: 04.12.2011
Сообщений: 12,947
Записей в блоге: 14
11.02.2016, 19:47 17
Цитата Сообщение от Kastaneda Посмотреть сообщение
тут мы видим, что int это ссылка на int.
имя P данной переменной int это ссылка на данную переменную. Это её первый "псевдоним"/"синоним". В области видимости, ссылки практически бессмысленны и почти не имеют отношения к формальному параметру-ссылке. Формальный параметр-ссылка это соглашение (магия ). Это не тип который ожидается и принимается, в отличие от всех других типов.
зы: TC это не нужно.
0
Эксперт CЭксперт С++
5047 / 2230 / 330
Регистрация: 20.02.2013
Сообщений: 5,600
Записей в блоге: 24
11.02.2016, 19:47 18
gogaloh, вот во мху енот.
0
Эксперт С++
8336 / 3891 / 844
Регистрация: 15.11.2014
Сообщений: 8,795
11.02.2016, 19:48 19
Цитата Сообщение от 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
Jesus loves me
Эксперт С++
5116 / 3128 / 353
Регистрация: 12.12.2009
Сообщений: 7,915
Записей в блоге: 2
11.02.2016, 19:56 20
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.02.2016, 19:56

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.