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

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

11.02.2016, 15:47. Показов 10964. Ответов 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
76 / 76 / 32
Регистрация: 14.04.2014
Сообщений: 408
11.02.2016, 20:01
Студворк — интернет-сервис помощи студентам
Мне было проще понимать снизу вверх. Тоесть сначала, как происходит дело в железе, а потом уже на абстракции.
Так вот, копирование будет всегда, что так
C++
1
f(i);
, что так
C++
1
f(&i);
, суть в том, что в первом случае копируем размер i, а во втором всегда 32 или 64 бита в зависимости сами знаете от чего о_О
с точки зрения памяти: для int i;- все равно как его передавать,
для
C++
1
struct BadInt{int i[9999];}
-нет

Отлично, передали, как менять? при передачи по значению выделяется память на стеке, туда копируется переменная, и работа идет с этой памятью. При передаче по адресу память на стеке выделяется под адрес, и общенеи идет уже к памяти объекта, расположенного по этому адресу. в этом плане работа ссылки и указателя идентичны, они оба реализуются компиллятором, как адрес объекта в памяти.

Далее нужно сказать про строгую типизацию, отличие ссылки от указателя, но лучше книжку почитать.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
11.02.2016, 20:05
Цитата Сообщение от Kastaneda Посмотреть сообщение
ничего странного там не видишь?
чоткий код.
чотко показывает.
1
 Аватар для Kastaneda
5232 / 3206 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
11.02.2016, 20:12
Цитата Сообщение от hoggy Посмотреть сообщение
чоткий код.
чотко показывает.
слегка не то, что должен, ну да ладно
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
11.02.2016, 20:14
Цитата Сообщение от Kastaneda Посмотреть сообщение
слегка не то, что должен, ну да ладно
чо это не то?
все он то показывает.
0
Модератор
Эксперт JS
 Аватар для Eva Rosalene
5241 / 2115 / 416
Регистрация: 06.01.2013
Сообщений: 4,846
11.02.2016, 20:17
Kastaneda, hoggy, http://rextester.com/TEH29585
если уж на то пошло, то в первом коде от Kastaneda мы получаем decltype не от p, а от (p). Внезапно, последнее является выражением, возвращающим ссылку.

Добавлено через 1 минуту
C++
1
2
3
4
5
6
7
8
9
//g++  4.9.3
 
#include <iostream>
 
int main()
{
    int p;
    std::cout << std::is_reference<decltype(p)>::value << ' ' << std::is_reference<decltype((p))>::value;
}
Вывод: 0 1
0
 Аватар для Kastaneda
5232 / 3206 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
11.02.2016, 20:27
Цитата Сообщение от FraidZZ Посмотреть сообщение
то в первом коде от Kastaneda мы получаем decltype не от p, а от (p)
это было сделано нарочно, как контрпример к decltype(*p), который тоже возвращает ссылку

hoggy, вместо
C++
1
2
if(  std::is_reference<decltype(p)>::value )
        std::cout <<"о боже! типом-по-значению!\n";
нужно же
C++
1
2
if( !std::is_reference<decltype(p)>::value )
        std::cout <<"о боже! типом-по-значению!\n";
2
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
11.02.2016, 20:29
Цитата Сообщение от Kastaneda Посмотреть сообщение
не надо додумывать, имя переменной - это имя переменной, ссылка - это ссылка
До-думывать, пере-думывать, за-думывать, это думать. И я это буду делать вне зависимости от Ваших призывов. Это при всём уважении. Теперь о имени и ссылке. Ссылка это сущность предоставляющая объект, а имен может быть много. Имя это сущность времени компиляции и это не зависит от порядка объявления. Вы знаете переносимый способ различить первое имя и его псевдонимы (имена объявленные ссылками) в бинарном коде? Первое имя это первая ссылка и есть. И все остальные это та же ссылка. Так говорит мой небольшой опыт + думанье. Вот что ещё могу додумать:
Объявление ссылки, это место, где имя связывается с объектом, к которому с++ допускает программиста. В С нет такой штуки. То есть переменная это именованный объект, но имён можно понапридумать много. Потом написать вычислительную строку с кучей синонимов, инкрементов, декрементов, и получить радость не хуже чем с указателями. Но отличать такие имена нет смысла, ведь? Или я неправ?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
11.02.2016, 20:35
Цитата Сообщение от FraidZZ Посмотреть сообщение
Внезапно, последнее является выражением, возвращающим ссылку.
что б мы без вас делали.
наверное б до сих пор гадали,
и чего это мы там в своих кодах такое написали...

Цитата Сообщение от Kastaneda Посмотреть сообщение
вместо
там все чотко.

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

а так можно "хихик".

Добавлено через 3 минуты
Цитата Сообщение от IGPIGP Посмотреть сообщение
Первое имя это первая ссылка и есть.
"имя обладает типом..."(ц)Труп Страуса.

тип ссылки принципиально отличается от типа-значения.

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

ссылки не приводят к созданию объектов, например.
0
 Аватар для Kastaneda
5232 / 3206 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
11.02.2016, 20:51
Цитата Сообщение от hoggy Посмотреть сообщение
там все чотко.
где чотко?
C++
1
2
if ( это ссылка)
    std::cout <<"о боже! типом-по-значению!\n";
как-то условие с выводом не вяжется.

Цитата Сообщение от IGPIGP Посмотреть сообщение
Вы знаете переносимый способ различить первое имя и его псевдонимы (имена объявленные ссылками) в бинарном коде?
переносимый нет, но в известных мне компиляторах ссылка - это указатель на низком уровне

Т.е. "ссылка - это псевдоним" справедливо на уровне языка (С++), но не на низком уровне. Я тоже когда-то думал, что ссылки просто привязываются к объекту еще на уровне компиляции, как раз вот это
Цитата Сообщение от IGPIGP Посмотреть сообщение
Объявление ссылки, это место, где имя связывается с объектом, к которому с++ допускает программиста.
но это не так. Компилятор может так сделать, но только в целях оптимизации, если этой оптимизации не будет, то ссылка будет отдельным объектом (читай "куском памяти"), а вот имя объекта (которое настоящее) просто транслируется в адрес. Если бы ссылки тоже транслировались в просто адрес, тогда да, можно было бы говорить, что это имя объекта и все ссылки на этот объект - это одно и тоже.
Мы начали путать уровни (языка и реализации), поэтому говорим о разных вещах.
0
Модератор
Эксперт JS
 Аватар для Eva Rosalene
5241 / 2115 / 416
Регистрация: 06.01.2013
Сообщений: 4,846
11.02.2016, 21:22
Цитата Сообщение от Kastaneda Посмотреть сообщение
Результат разыменования указателя есть объект, а не ссылка на объект.
Подтвержу ваши слова:
5.3.1 СтандартаThe unary * operator performs indirection: the expression to which it is applied shall be a pointer to an object type, or a pointer to a function type and the result is an lvalue referring to the object or function to which the expression points. If the type of the expression is “pointer to T,” the type of the result is “T.” [ Note: indirection through a pointer to an incomplete type (other than cv void) is valid. The lvalue thus obtained can be used in limited ways (to initialize a reference, for example); this lvalue must not be converted to a prvalue, see 4.1. — end note]


И то, что "the result is an lvalue" этому не противоречит.
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
11.02.2016, 21:33
Цитата Сообщение от hoggy Посмотреть сообщение
имя обладает типом
Хех... Я то думал мы об одном толкуем. Ну да ладно. Цитату дайте с точными реквизитами. Не помню такого, потому как бессмысленно это.
Цитата Сообщение от hoggy Посмотреть сообщение
тип ссылки принципиально отличается от типа-значения.
Тут же не си-шарп. Ссылка это не тип. У типа есть признаки: размер, формат, допустимые операции. У ссылки нет размера и формата. Допустимые операции - неявный механизм передачи в функцию. Остальное относится к тому на что указывает ссылка.
Цитата Сообщение от Kastaneda Посмотреть сообщение
но это не так. Компилятор может так сделать, но только в целях оптимизации, если этой оптимизации не будет, то ссылка будет отдельным объектом (читай "куском памяти"), а вот имя объекта (которое настоящее) просто транслируется в адрес.
Вопрос реализации ссылки вообще не имеет отношения к теме. Повторю вопрос: вы можете отличить имена объявленные как явные ссылки от первого имени (неявно объявленной ссылки)?

Добавлено через 5 минут
Цитата Сообщение от FraidZZ Посмотреть сообщение
Подтвержу ваши слова:
Данное место из стандарта как раз противоречит а не подтверждает Kastaneda.
Оно говорит что разыменование даёт ссылку lvalue и тип этого lvalue это тип T. Это логично.
0
 Аватар для Nosey
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
11.02.2016, 21:45
Цитата Сообщение от FraidZZ Посмотреть сообщение
И то, что "the result is an lvalue" этому не противоречит.
А вы знаете как вернуть lvalue не ссылку из функции?

Цитата Сообщение от IGPIGP Посмотреть сообщение
Данное место из стандарта как раз противоречит а не подтверждает Kastaneda.
Оно говорит что разыменование даёт ссылку lvalue и тип этого lvalue это тип T. Это логично.
lvalue rvalue и т.д. это понятия не типа переменной, это понятия выражения, поэтому, в приведённой цитате из стандарта явно не указывается что это ссылка, но другого способа вернуть lvalue не ссылку из функции я не знаю.
0
Модератор
Эксперт JS
 Аватар для Eva Rosalene
5241 / 2115 / 416
Регистрация: 06.01.2013
Сообщений: 4,846
11.02.2016, 21:47
Цитата Сообщение от IGPIGP Посмотреть сообщение
как раз противоречит а не подтверждает Kastaneda.
С чего бы это?
Оно не говорит про "ссылку lvalue", то есть "lvalue reference", а про lvalue в чистом виде. Такими темпами можно и так посчитать:
C++
1
2
int p;
p = 1; // здесь p - это int&, так как p - lvalue
что логически бессмысленно.

Добавлено через 20 секунд
Цитата Сообщение от Nosey Посмотреть сообщение
это понятия не типа переменной, это понятия выражения
Истинно так.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
11.02.2016, 23:09
Цитата Сообщение от FraidZZ Посмотреть сообщение
Такими темпами можно и так посчитать:
Это забавно но p здесь и правда ссылка. Создайте ещё пару ссылок на этот p и попробуйте различить и синтаксически и семантически и в коде разницу этих имён. Они все будут ссылаться на тот объект на который ссылается p.
На этот вопрос, - вопрос различия первого имени от всех остальных, никто не спешит ответить. Потому наверное, что тут и нечего ответить.

Добавлено через 2 минуты
Цитата Сообщение от Nosey Посмотреть сообщение
это понятия не типа переменной,
Ссылка это и не переменная. Ссылка это ссылка на переменную или объект.
Цитата Сообщение от FraidZZ Посмотреть сообщение
Истинно так.
Но выражение это по определению всё то что возвращает значение. И если это lvalue то может быть ссылка?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
11.02.2016, 23:49
Цитата Сообщение от Kastaneda Посмотреть сообщение
но в известных мне компиляторах ссылка - это указатель на низком уровне
стало быть мало вы знаете о компиляторах.
так и о случаях, когда случаются ссылки.


Цитата Сообщение от Kastaneda Посмотреть сообщение
как-то условие с выводом не вяжется.
вывод то какой был?

Цитата Сообщение от FraidZZ Посмотреть сообщение
Подтвержу ваши слова:
здесь стандарт прогоняет пургу.
он обязывает компиляторы поиметь обращение к объекту напрямки,
без всяких этих ваших указателей.
однако с точки зрения синтаксиса - ссылка.
она, родимая.

Цитата Сообщение от IGPIGP Посмотреть сообщение
Ссылка это не тип.
вам нужно подучить с++
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
11.02.2016, 23:58
Цитата Сообщение от hoggy Посмотреть сообщение
вам нужно подучить с++
Я его почти не знаю. Я не хочу сказать, что у меня тут тёплая компания, - напротив, люди с которыми я веду дискуссию хорошо знают C++. Меня частенько заносит и я могу сказать ерунду, но сейчас я не вижу аргументов. Когда перечислил признаки типа: размер, формат, допустимые операциями, Вы не стали обращать внимания. И талдычите: ссылка это тип. Пусть это говорят тысячи авторитетов, - докажите.
Что касается различий первого имени и псевдонимов то:
Цитата Сообщение от IGPIGP Посмотреть сообщение
попробуйте различить и синтаксически и семантически и в коде разницу этих имён. Они все будут ссылаться на тот объект на который ссылается p.
и я не вижу смысла повторять. Вы не можете ответить? И не нужно. Даже признавать не нужно. А задуматься стоит. Знания без способности их осмысливать стоят немного. У Вас конкретно, такая способность есть и она развита, но и упрямства хватает. Даже интересно, чего больше.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
12.02.2016, 00:11
Цитата Сообщение от IGPIGP Посмотреть сообщение
докажите.
я никому ничего не доказываю,
если не имею с этого прямого профита.
например - деньги.
Цитата Сообщение от IGPIGP Посмотреть сообщение
попробуйте различить и синтаксически и семантически и в коде разницу этих имён.
C++
1
2
const some obj;
const_cast<some&>(obj).change(); //<--- привет UB
дальше разницу на собственной шкуре прочувствуете.
если повезет - сразу.


если чутка призадумаетесь,
станет очевидно, что "оригинальное имя" отвечает за захват ресурса.
со всеми его нюансами.
и это делает его принципиально отличным от ссылки,
которая только лишь делегирует обращение
к уже существующему объекту.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
12.02.2016, 00:21
Цитата Сообщение от hoggy Посмотреть сообщение
я никому ничего не доказываю,
если не имею с этого прямого профита.
например - деньги.
Это пустые слова. Вы участвуете в обсуждении и стало быть аргументируете. Интерес это Ваше дело, я не интересовался. Я участвую бесплатно.
Объявление константы без инициализации мой компилятор вряд ли пропустит, хотя не пробовал, если честно, а потому пока не смотрю.
Цитата Сообщение от hoggy Посмотреть сообщение
"оригинальное имя" отвечает за захват ресурса.
Захват ресурса это не дело имени и не его ответственность. Имя аттачится к захваченному ресурсу.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
12.02.2016, 00:48
Цитата Сообщение от IGPIGP Посмотреть сообщение
Это пустые слова.
это - ваши сложности.
мне - пофиг.

Цитата Сообщение от IGPIGP Посмотреть сообщение
Захват ресурса это не дело имени и не его ответственность.
специально для вас писал:

Цитата Сообщение от hoggy Посмотреть сообщение
"имя обладает типом..."(ц)Труп Страуса.
могу раскрыть:
"имя детонирует (обозначает) объект. имя обладает типом..."(c)
или вы думали, компилятор к астралу подключается,
что б узнать где и какие объекты нужно породить?
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
12.02.2016, 02:29
Цитата Сообщение от hoggy Посмотреть сообщение
специально для вас писал:
если всё тут мои сложности зачем же? Логика это всё-таки вещь?
Я просил привести источник где имя об... кто кем кстати?
Вы кстати, писали что ссылка не создаёт объекта. Тогда если имя ссылки это имя объекта и все свойства по имени это свойства объекта, то может данное имя это и есть имя объекта? И оно открывает доступ к ссылке так же как и разыменование указателя?
То что объявляя новые псевдонимы можно ограничить доступ модификатором const это договор с компилятором или как вы сами говорили, "не более чем предположение", и следовательно ничего не доказывает. Константная ссылка на неконстантный объект легко кастится (const_cast) и модифицирует объект. То есть компилятор понимает что договор сознательно нарушается. Константная ссылка на константный объект не связывается с объектом. Такая константа может реализовываться инлайн или как-то ещё, но факт остаётся фактом: она кастится и модифицируется, но не затрагивает объект. Поэтому, например, код:
C++
1
2
3
4
const int a=5;
const int& ra=a;
const_cast<int&>ra=6;//ra=6, но a=5
int arr[a];//создает массив из 5
работает предсказуемо.
Я не вижу ясных аргументов считать типом ссылку.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.02.2016, 02:29

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки Правым кликом по серверу -> отладочная информация -> edit Заменить "net": "raw", на "net": "tcp", Нажать кнопку reload.
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru