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

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

Войти
Регистрация
Восстановить пароль
 
 
Alex Z
27 / 1 / 0
Регистрация: 29.06.2011
Сообщений: 136
#1

Что передаётся в функцию, если в прототипе ссылка? - C++

04.12.2012, 20:02. Просмотров 612. Ответов 16
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void swap(int &, int &);
 
int main()
{
       /* ... */
       swap(x,y);
       /* ... */
}
 
void swap(int &rx, int &ry)
{
       /* ... */
}
Такой коментарий к коду: "В строке 6 расположен вызов функции swap(), но ей передаются именно значения x и y, а не их адреса. Вызывающая функция просто передаёт свои переменные."

Что-то я не понял. Читал недавно здесь, на форуме, что при передаче с использованием указателей или ссылок, в обоих случаях передаются адреса реальных переменных из функции main:
Ссылки и указатели
(см. страница 1, сообщения обоих модераторов).

Кто не прав? Книжка, поди, опять... Снова меня запутали.

(Или может автор книги хотел сказать, что вызов функции swap в данном случае такой же, как если бы была передача по значению? А конкретная реализация функции swap скрыта от функции main. - это я сейчас просто фантазирую).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.12.2012, 20:02
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Что передаётся в функцию, если в прототипе ссылка? (C++):

Что значит void в прототипе? - C++
BOOL WINAPI AllocConsole(void); BOOL - тип возвращаемого значения, WINAPIN - соглашение, AllocConsole - имя самой функции. А void здесь что...

Строка не передаётся в функцию - C++
#include <iostream> #include <stdio.h> #include <string.h> using namespace std; str_while(char* str) { int i=0; ...

В функцию через указатель передаётся массив ТОЛЬКО с первым[0] элементом - C++
Считал, что передавая указатель на массив, в функции буду иметь весь массив, но передаётся массив с ОДНИМ элементом. В чём может быть...

Найти минимальный и максимальный элементы (неожиданное поведение программы: массив не передаётся в функцию) - C++
Ребята,помогите,пожалуйста,разобраться с функциями. Программа не хочет передавать значение массива в функцию(17 строчка). Нужно создать...

Создать функцию, которой строка передаётся как параметр, и которая возвращает количество слов - C++
создать функцию в которой строка передаётся как параметр и возвращает колличество слов в этой строке

Создать функцию, которой строка передаётся как параметр, и которая возвращает количество слов - C++
создать функцию в которой строка передаётся как аргумент и возвращает количество слов

16
booker
23 / 23 / 2
Регистрация: 21.11.2012
Сообщений: 106
04.12.2012, 20:08 #2
Да адреса вроде
1
Croessmah
Эксперт CЭксперт С++
13424 / 7578 / 856
Регистрация: 27.09.2012
Сообщений: 18,665
Записей в блоге: 3
Завершенные тесты: 1
04.12.2012, 20:10 #3
Цитата Сообщение от Alex Z Посмотреть сообщение
Кто не прав? Книжка, поди, опять... Снова меня запутали.
считайте, что передается сам объект, не забивайте себе голову такими вопросами до поры до времени.
1
freemanc
12 / 12 / 1
Регистрация: 27.11.2012
Сообщений: 140
04.12.2012, 20:10 #4
при передаче с использованием указателей или ссылок, в обоих случаях передаются адреса реальных переменных из функции main
- все верно, функция получает переменную по ссылке
0
Igor3D
966 / 499 / 50
Регистрация: 01.10.2012
Сообщений: 2,497
04.12.2012, 20:13 #5
Цитата Сообщение от Alex Z Посмотреть сообщение
C++
1
2
3
4
5
void swap(int &, int &);
void swap(int &rx, int &ry)
{
       /* ... */
}
Такой коментарий к коду: "В строке 6 расположен вызов функции swap(), но ей передаются именно значения x и y, а не их адреса. Вызывающая функция просто передаёт свои переменные."
Не знаю что хотел сказать автор комментариев, но верить ему не следует Физически передаются адреса, просто с ними работают как с переменными (а не как с указателями). Это называется вумным словом "семантика"
1
Croessmah
Эксперт CЭксперт С++
13424 / 7578 / 856
Регистрация: 27.09.2012
Сообщений: 18,665
Записей в блоге: 3
Завершенные тесты: 1
04.12.2012, 20:15 #6
Цитата Сообщение от freemanc Посмотреть сообщение
все верно, функция получает переменную по ссылке
Это понятие языков более высокого уровня.
1
coloc
погромист
410 / 246 / 15
Регистрация: 27.08.2012
Сообщений: 550
Завершенные тесты: 1
04.12.2012, 20:15 #7
Ссылки, как и указатели в аргументах функции всегда принимают адреса

З.Ы.
это
C++
1
2
3
4
5
6
7
void swap (int* x, int* y)
{
int temp;
temp = *x;
*x = *y;
*y = temp;
}
эквивалентно
C++
1
2
3
4
5
6
7
void swap (int& x, int& y)
{
int temp;
temp = x;
x = y;
y = temp;
}
0
Croessmah
Эксперт CЭксперт С++
13424 / 7578 / 856
Регистрация: 27.09.2012
Сообщений: 18,665
Записей в блоге: 3
Завершенные тесты: 1
04.12.2012, 20:17 #8
Цитата Сообщение от coloc Посмотреть сообщение
эквивалентно
попробуйте swap(NULL,NULL) сделать в примере с ссылками.
0
ValeryS
Модератор
6654 / 5063 / 470
Регистрация: 14.02.2011
Сообщений: 16,934
04.12.2012, 20:18 #9
вот такая функция
C++
1
2
3
4
5
6
void swap(int &rx, int &ry)
{
int tmp=rx;
rx=ry;
ry=rx;
}
поменяет значения между собой
а такая
C++
1
2
3
4
5
6
void swap(int rx, int ry)
{
int tmp=rx;
rx=ry;
ry=rx;
}
поменяет копии значений

но вызов этих функций одинаков(синтаксически)
C++
1
swap(x,y);
если тебя интересуют такие тонкости то дизасемблируй коды и смотри в чем разница
0
Igor3D
966 / 499 / 50
Регистрация: 01.10.2012
Сообщений: 2,497
04.12.2012, 20:21 #10
Цитата Сообщение от Croessmah Посмотреть сообщение
попробуйте swap(NULL,NULL) сделать в примере с ссылками.
А почему нет?
C++
1
swap(*(int *) NULL, *(int *) NULL);
0
Croessmah
Эксперт CЭксперт С++
13424 / 7578 / 856
Регистрация: 27.09.2012
Сообщений: 18,665
Записей в блоге: 3
Завершенные тесты: 1
04.12.2012, 20:23 #11
Цитата Сообщение от Igor3D Посмотреть сообщение
А почему нет?
это уже другое.
0
coloc
погромист
410 / 246 / 15
Регистрация: 27.08.2012
Сообщений: 550
Завершенные тесты: 1
04.12.2012, 20:26 #12
Croessmah, тоесть ссылки не могут указывать в никуда? Компилятора просто сейчас нету
ЗЫ А как это - указатель в никуда? (тоесть NULL?) Куда он начинает указывать при инициализации?
0
Croessmah
Эксперт CЭксперт С++
13424 / 7578 / 856
Регистрация: 27.09.2012
Сообщений: 18,665
Записей в блоге: 3
Завершенные тесты: 1
04.12.2012, 20:27 #13
Ссылки - это целый механизм и сравнивать его с указателями как-то не хорошо. Как это реализуется на низком уровне - можно узнать, посмотрев код на мнемонике ассемблера.
2
coloc
погромист
410 / 246 / 15
Регистрация: 27.08.2012
Сообщений: 550
Завершенные тесты: 1
04.12.2012, 20:30 #14
Мда... Я осознал , что я чайник в еще большей степени, чем есть
0
Croessmah
Эксперт CЭксперт С++
13424 / 7578 / 856
Регистрация: 27.09.2012
Сообщений: 18,665
Записей в блоге: 3
Завершенные тесты: 1
04.12.2012, 20:30 #15
Цитата Сообщение от coloc Посмотреть сообщение
Croessmah, тоесть ссылки не могут указывать в никуда? Компилятора просто сейчас нету
ЗЫ А как это - указатель в никуда? (тоесть NULL?) Куда он начинает указывать при инициализации?
Это я к тому, что ссылки контролируются еще и компилятором, в отличии от указателей.
2
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.12.2012, 20:30
Привет! Вот еще темы с ответами:

Имена аргументов в прототипе функции - C++
Не нашел инфу, конкретно, для чего все же имена аргументов прототипу функции. Либо для уяснения назначения аргументов (1), уточнения...

Переменная ссылочного типа в прототипе функции - C++
Только начала изучать C++ и эти прототипы функций нигде не всртечал. Прописываю прототип функции со ссылкой: void dectohex(int&); При...

Не работает ссылка на функцию. - C++
Пожалуйста,Помогите найти ошибку.Мне нужно сделать ссылку на функцию, которая является функцией класса interface. С этой ссылкой на функцию...

Инкапсуляция, ссылка на функцию - C++
Делаю задание по инкапсуляции, реализовать 3 вида списков в 1 программе, причем списки как подкл модули и снаружи только выбор типа при...


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

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

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