Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
BrainOverflow
 Аватар для sab1ch
126 / 130 / 64
Регистрация: 31.03.2013
Сообщений: 556

Указатель/ссылка в параметре функции

12.02.2016, 15:32. Показов 1139. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.
Опять появился вопрос. Почему автор книги, которую я читаю, постоянно использует в параметрах функции ссылку/указатель и делает параметр константным? Чтобы стало понятнее, вот пример кода:
C++
1
2
3
4
5
6
void print(const char *cp)
{
    if(cp)
        while(*cp)
            cout << *cp++;
}
Также и с ссылками в параметрах много примеров. Для чего именно так?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.02.2016, 15:32
Ответы с готовыми решениями:

Как использовать указатель на переменную во входящем параметре функции?
Нашел код для решение гиперболического уравнение с помощью разностных схем. Возникли некоторые вопросы. Вот сам код: double...

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

Указатель или ссылка на указатель. В чем разница?
Есть вопрос про указатели и ссылки на указатели :scratch: Хочу в функциях f1() и в f2() динамически выделить память и возвратить этот...

14
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
12.02.2016, 15:43
Sabnik18, Очевидно, чтобы не кушать память, т.к. передача константной ссылки/указателя практически не занимает памяти, ежели передача самого значения, ведь оно копируется, а если это строка в 10000 символов или вектор в 10000 значений типа double? Тогда копирование будет происходить очень долго!
0
о_____О
Эксперт 1С
 Аватар для OrkVasya
225 / 224 / 37
Регистрация: 19.11.2010
Сообщений: 1,061
12.02.2016, 15:46
Sabnik18, насколько я понимаю, передается указатель на константный символ. Т.е. чтобы нельзя было изменить содержимое на которое показывает указатель.
0
BrainOverflow
 Аватар для sab1ch
126 / 130 / 64
Регистрация: 31.03.2013
Сообщений: 556
12.02.2016, 15:49  [ТС]
makfak, ваша подпись подтверждается. ()
OrkVasya, по поводу вашего последнего предложения. В смысл чтобы нельзя было изменить? Где? В функции или в теле программы?
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
12.02.2016, 15:54
Sabnik18, Вам про константу рассказать что ли? Так если не передать как константу, тогда можно будет изменить значение, а так как это указатель или ссылка, то изменится и выражение, которое было передано в функцию.
0
BrainOverflow
 Аватар для sab1ch
126 / 130 / 64
Регистрация: 31.03.2013
Сообщений: 556
12.02.2016, 15:58  [ТС]
makfak, а для того, чтобы работать с константой, я должен в теле программы аргумент тоже обозначить как константа с указателем?
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
12.02.2016, 16:01
Sabnik18, Нет, вот пример:
C++
1
2
3
4
5
6
7
8
9
10
void f(const int& n)
{
    std::cout << n << std::endl;
}
 
int main()
{
    int k = 10;
    f(k);
}
Всё работает и не надо ничего как указатель/ссылку объявлять.
0
BrainOverflow
 Аватар для sab1ch
126 / 130 / 64
Регистрация: 31.03.2013
Сообщений: 556
12.02.2016, 16:20  [ТС]
makfak, и что изменится, если вместо
C++
1
const int&
подставить просто
C++
1
 int&
?
Если можете, приведите пример по поводу вашего сообщения "Так если не передать как константу, тогда можно будет изменить значение, а так как это указатель или ссылка, то изменится и выражение, которое было передано в функцию."
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
12.02.2016, 16:36
Sabnik18, В моём примере ничего, но объявляя ссылку константной ты гарантируешь то, что ты не изменишь значение переданного выражения, а даже если попробуешь, будет ошибка компиляции, если тебе надо изменять выражение только в теле функции, то передавай по значению, но не по ссылке, иначе при изменении переданного выражения, ты изменишь и само передаваемое выражение.
Пример:
C++
1
2
3
4
5
6
7
8
void f(int& n) { std::cout << ++n << std::endl; }
 
int main()
{
    int k = 10;
    f(k);
    std::cout << k << std::endl; // оп-па, а уже 11
}
а если так:
C++
1
2
3
4
5
6
7
8
9
10
void f(const int& n) { 
    std::cout << ++n << std::endl; // ошибка компиляции
}
 
int main()
{
    int k = 10;
    f(k);
    std::cout << k << std::endl; // оп-па, а уже 11
}
Добавлено через 45 секунд
C++
1
2
3
4
5
6
7
8
void f(int n) { std::cout << ++n << std::endl; }
 
int main()
{
    int k = 10;
    f(k);
    std::cout << k << std::endl; // а вот так 10
}
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
12.02.2016, 17:01
Sabnik18, читайте лучше книжки: Скотт Мейерс. Эффективное использование С++ (55 советов), правило 20.
Все вопросы отпадут.
2
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
12.02.2016, 17:05
Цитата Сообщение от Sabnik18 Посмотреть сообщение
и что изменится, если вместо
А ещё, туда где параметром объявлена константная ссылка можно передать литерал, чего нельзя сделать если объявлена простая ссылка.
0
BrainOverflow
 Аватар для sab1ch
126 / 130 / 64
Регистрация: 31.03.2013
Сообщений: 556
12.02.2016, 17:41  [ТС]
DrOffset, это книга для вообще чайников? Или её стоит читать хотя бы второй?
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
12.02.2016, 17:53
Цитата Сообщение от Sabnik18 Посмотреть сообщение
это книга для вообще чайников?
Не для чайников. Но может быть полезна и им. Читать лучше после какого-то букваря по С++. Но вполне понятные ответы на твои текущие вопросы ты там найдешь. Если все-таки что-то будет не понятно, значит время еще не пришло. В таком случае следует вернуться к этому материалу позднее.
2
BrainOverflow
 Аватар для sab1ch
126 / 130 / 64
Регистрация: 31.03.2013
Сообщений: 556
12.02.2016, 17:55  [ТС]
DrOffset, спасибо за совет.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
12.02.2016, 18:53
Цитата Сообщение от Sabnik18 Посмотреть сообщение
Для чего именно так?
что бы почеркнуть, что функция использует данные только для чтения.
но не изменяет их.
Цитата Сообщение от Sabnik18 Посмотреть сообщение
void print(const char *cp)
функция обещает, что не будет менять сами данные.
а это значит, что отдавая их в функцию,
мы можем не бояться,
что с ними что нибудь случится.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.02.2016, 18:53
Помогаю со студенческими работами здесь

Вызов функции в параметре другой функции
программа: #include &lt;iostream&gt; using namespace std; struct E { E() {} }; void f(const E&amp; e)

Ошибка в параметре функции
В части 2 есть ошибка, но я не понимаю какая, помогите пожалуйста разобраться. cout&lt;&lt;&quot;-- Вариант №: &quot;&lt;&lt;endl; ...

Соединение строк в параметре функции
Здравствуйте! Не подскажете, возможно ли такое реализовать: void Fun(char* c) { cout &lt;&lt; c; } ..... ...

Ошибка в передаваемом параметре функции
Добрый вечер! Помогите, пожалуйста, устранить ошибку. есть большая программа, решающее интегральное уравнение Фредгольма. Что могла - нашла...

Ссылка на указатель на указатель
void TEST( int **&amp;refptr, int const &amp;N); int main() { int const N = 10; int i{ 0 }, b{ 2 }, *ptr{ &amp;i, &amp;b }; ...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача №1: при указании работ (справочник РаботыПоРемонтуСпецтехники),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru