Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
d7d1cd
194 / 117 / 36
Регистрация: 30.06.2011
Сообщений: 1,075
#1

Как получить значение из функции? - C++

13.06.2016, 15:55. Просмотров 340. Ответов 10
Метки нет (Все метки)

Приветствую всех! Требуется совет эксперта С++. Как правильнее передать в функцию значение какой-либо переменной, при условии, что функция должна значение этой переменной изменить. Посмотрите пример:
C++ (Qt)
1
2
3
4
5
6
7
8
9
int a = 1;
int b = 2;
Increment(&a, b);
 
void Increment(int *a, int &b)
{
 *a = *a + 1;
 b++;
}
В приведенном примере после работы функции Increment значение переменных a и b увеличивается на единицу. Однако значение переменной а передано по указателю, а значение b - по ссылке. Как, все же, правильнее?
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.06.2016, 15:55
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как получить значение из функции? (C++):

Получить возращаемое значение из виртуальной функции из класса наследника - C++
Здравствуйте, в общем столкнулся непониманием как, получить значение из виртульной функции: class Pointers{ public: virtual...

Как присвоить второму элементу массива в функции A(), значение, которое было возвращено из функции B()? - C++
Как присвоить к второму элементу массива в функции innfunc значение 10, который вернет innfunc1? Замечание: нельзя указывать b = 10, а...

Вычислить значение функции (значение переменной Х передается в качестве параметра функции) - C++
Написать функцию, которая возвращает вычисленное значение функции. Значение переменной Х передается в качестве параметра функции.

Как получить значение определенного пикселя. - C++
Здравствуйте. Кто нибудь знает как получить цвет(RGB код) определенного пикселя в битмапе. Знаю что в MFC есть CBitmap, но как это...

Как из С++ получить значение ячейки в файле Excel - C++
хотелось бы наиболее простым способом получить значение из открытого файла в Excel значение в заданной ячейке.

Как в VC++ получить абсолютное значение для int??? - C++
Я много искал ... ничего не могу толком найти ... и гуглил .. и в яндексе рылся .... кто нить хелп плиз.... Как получить абсолютное...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Ferrari F1
=^_^=
570 / 457 / 94
Регистрация: 27.01.2015
Сообщений: 2,694
Записей в блоге: 1
Завершенные тесты: 1
13.06.2016, 16:08 #2
d7d1c, ну лучше, конечно, по ссылке передавать (со знаком &), т.к. при передаче указателя тратится драгоценная оперативная память (как правило, 4 байта), что является очень важным моментом.
0
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
13.06.2016, 16:10 #3
в данном случае передача по ссылке - более в духе с++.
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
т.к. при передаче указателя тратится драгоценная оперативная память
причем тут это вообще?
0
Ferrari F1
=^_^=
570 / 457 / 94
Регистрация: 27.01.2015
Сообщений: 2,694
Записей в блоге: 1
Завершенные тесты: 1
13.06.2016, 16:10 #4
Цитата Сообщение от retmas Посмотреть сообщение
причем тут это вообще?
кто-то шуток не понимает...
0
Evg
Эксперт CАвтор FAQ
17809 / 6015 / 388
Регистрация: 30.03.2009
Сообщений: 16,531
Записей в блоге: 26
13.06.2016, 19:21 #5
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от d7d1c Посмотреть сообщение
Как, все же, правильнее?
Эти два варианта делают ровно одно и то же. В том числе и код для них построится одинаковый (т.е. в посте #2 слова не соответствуют действительности)

Что же касается того, как правильнее, тут вопрос больше упирается в читабельность кода (т.е. в стиль програмирования). Когда ты видишь вызов

C++
foo (&x);
то ты сразу видишь, что в функцию параметр передаётся по косвенности и может быть изменён. Когда ты видишь вызов

C++
foo (x);
то придётся искать описание функции foo, чтобы понять, в реальности мы передаём по значению, или по ссылке.

Вообще этот стилевой подход на форуме много раз обсуждался, если не лень, воспользуйся поиском
1
Unknownx
Заблокирован
13.06.2016, 20:57 #6
d7d1c, если ты пишешь на С/С++, то лучше передавай по указателю, т.к параметра ссылки в Си вообще нет http://codepad.org/HD66Fs1M. Т.е написав по указателю ты сможешь при желании собирать код как Сишный и как плюсовый(это особенно существенно когда делаем сборку статических библиотек), голый сишный код - быстрей.

Добавлено через 2 минуты

Не по теме:

Цитата Сообщение от Ferrari F1 Посмотреть сообщение
d7d1c, ну лучше, конечно, по ссылке передавать (со знаком &), т.к. при передаче указателя тратится драгоценная оперативная память (как правило, 4 байта), что является очень важным моментом.
не пиши глупости, а по ссылке что по твоему заходит параметром?

0
d7d1cd
194 / 117 / 36
Регистрация: 30.06.2011
Сообщений: 1,075
13.06.2016, 21:10  [ТС] #7
Спасибо всем за объяснения. С "одинокой" переменной все понятно. А как быть, если их несколько, то есть, если в функцию надо передать массив, элементы которого в функции могут меняться. В этом случае нужно передавать по указателю на этот массив, верно?
0
Unknownx
Заблокирован
13.06.2016, 21:28 #8
Цитата Сообщение от d7d1c Посмотреть сообщение
Спасибо всем за объяснения. С "одинокой" переменной все понятно. А как быть, если их несколько, то есть, если в функцию надо передать массив, элементы которого в функции могут меняться. В этом случае нужно передавать по указателю на этот массив, верно?
- bingo!(вот ещё один фактор почему указатель лучше ссылки, хотя и опасней)
0
Ferrari F1
=^_^=
570 / 457 / 94
Регистрация: 27.01.2015
Сообщений: 2,694
Записей в блоге: 1
Завершенные тесты: 1
13.06.2016, 21:29 #9
Unknownx, это ты не пиши глупостей, по ссылке передается исходный объект(переменная), т.е. копирования не происходит, а при передачи указателя, копируется этот указатель.
Авторы многих книг по плюсам так уверяют...
0
Unknownx
Заблокирован
13.06.2016, 21:37 #10
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
Unknownx, это ты не пиши глупостей, по ссылке передается исходный объект(переменная), т.е. копирования не происходит, а при передачи указателя, копируется этот указатель.
Авторы многих книг по плюсам так уверяют...
- где ты это увидел(конретно что передача по ссылке экономит память, покажи)?Ссылка почти тот же указатель, только без перегруженных операторов инкремента декремента. Возьми лучше асм и погляди, что идёт в функцию при передаче по ссылке и по указателю.
0
Ferrari F1
=^_^=
570 / 457 / 94
Регистрация: 27.01.2015
Сообщений: 2,694
Записей в блоге: 1
Завершенные тесты: 1
13.06.2016, 21:48 #11
Unknownx, асм код посмотрел. И в самом деле одинаковый, НО я не виноват, что авторы многих книг по плюсам пишут, что во втором случае происходит копирование указателя И совершенно недоговаривают, что передача по ссылке по своей сути есть то же самое, но с автоматическим разыменованием (они пишут примерно так: ссылка - это просто псевдоним, и у читателя складывается устойчивое мнение, что копирования таким образом не происходит), тем самым авторы вводят в заблуждение читателя. В своем ответе я положился на информацию из подобных книг, а то, что она не являлась истинной, то моей вины в этом нет.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.06.2016, 21:48
Привет! Вот еще темы с ответами:

Как получить размер функции? - C++
её начало я получаю с помощью ассемблера(offset), не получается получить её конец и вычислить её длину P. S. Borland c++ 6

Как получить промежуточное значение используя линейную интерполяцию? - C++
Программирую ардуино, нужно точно мерять температуру термистором. Есть таблица показаний термистора: short sArrayResistance =...

Как получить адресс функции находящейся в классе? - C++
посмотрите плз.. не вдаваясь в извращенную задумку, задача такова: нужно получить адрес функции из класса... class MyClass { ...

Как получить массив из одной функции в другую? - C++
Всем доброго времени суток! Как получить массив из первый функции во вторую, если она была объявлена в первой? Заранее спасибо.


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
13.06.2016, 21:48
Ответ Создать тему
Опции темы

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