Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
27 / 1 / 0
Регистрация: 29.06.2011
Сообщений: 136

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

04.12.2012, 20:02. Показов 2268. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.12.2012, 20:02
Ответы с готовыми решениями:

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

Можно ли узнать, что в функцию передается именно элемент перечисления?
Добрый вечер всем. Возможно глупый вопрос, тем не менее: как грамотно организовать проверку входного параметра, если допустимые варианты...

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

16
 Аватар для booker
24 / 24 / 5
Регистрация: 21.11.2012
Сообщений: 106
04.12.2012, 20:08
Да адреса вроде
1
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
04.12.2012, 20:10
Цитата Сообщение от Alex Z Посмотреть сообщение
Кто не прав? Книжка, поди, опять... Снова меня запутали.
считайте, что передается сам объект, не забивайте себе голову такими вопросами до поры до времени.
1
 Аватар для freemanc
14 / 14 / 6
Регистрация: 27.11.2012
Сообщений: 140
04.12.2012, 20:10
при передаче с использованием указателей или ссылок, в обоих случаях передаются адреса реальных переменных из функции main
- все верно, функция получает переменную по ссылке
0
1969 / 825 / 115
Регистрация: 01.10.2012
Сообщений: 4,893
Записей в блоге: 2
04.12.2012, 20:13
Цитата Сообщение от Alex Z Посмотреть сообщение
C++
1
2
3
4
5
void swap(int &, int &);
void swap(int &rx, int &ry)
{
       /* ... */
}
Такой коментарий к коду: "В строке 6 расположен вызов функции swap(), но ей передаются именно значения x и y, а не их адреса. Вызывающая функция просто передаёт свои переменные."
Не знаю что хотел сказать автор комментариев, но верить ему не следует Физически передаются адреса, просто с ними работают как с переменными (а не как с указателями). Это называется вумным словом "семантика"
1
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
04.12.2012, 20:15
Цитата Сообщение от freemanc Посмотреть сообщение
все верно, функция получает переменную по ссылке
Это понятие языков более высокого уровня.
1
погромист
 Аватар для coloc
415 / 251 / 30
Регистрация: 27.08.2012
Сообщений: 550
04.12.2012, 20:15
Ссылки, как и указатели в аргументах функции всегда принимают адреса

З.Ы.
это
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
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
04.12.2012, 20:17
Цитата Сообщение от coloc Посмотреть сообщение
эквивалентно
попробуйте swap(NULL,NULL) сделать в примере с ссылками.
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,870
04.12.2012, 20:18
вот такая функция
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
1969 / 825 / 115
Регистрация: 01.10.2012
Сообщений: 4,893
Записей в блоге: 2
04.12.2012, 20:21
Цитата Сообщение от Croessmah Посмотреть сообщение
попробуйте swap(NULL,NULL) сделать в примере с ссылками.
А почему нет?
C++
1
swap(*(int *) NULL, *(int *) NULL);
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
04.12.2012, 20:23
Цитата Сообщение от Igor3D Посмотреть сообщение
А почему нет?
это уже другое.
0
погромист
 Аватар для coloc
415 / 251 / 30
Регистрация: 27.08.2012
Сообщений: 550
04.12.2012, 20:26
Croessmah, тоесть ссылки не могут указывать в никуда? Компилятора просто сейчас нету
ЗЫ А как это - указатель в никуда? (тоесть NULL?) Куда он начинает указывать при инициализации?
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
04.12.2012, 20:27
Ссылки - это целый механизм и сравнивать его с указателями как-то не хорошо. Как это реализуется на низком уровне - можно узнать, посмотрев код на мнемонике ассемблера.
2
погромист
 Аватар для coloc
415 / 251 / 30
Регистрация: 27.08.2012
Сообщений: 550
04.12.2012, 20:30
Мда... Я осознал , что я чайник в еще большей степени, чем есть
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
04.12.2012, 20:30
Цитата Сообщение от coloc Посмотреть сообщение
Croessmah, тоесть ссылки не могут указывать в никуда? Компилятора просто сейчас нету
ЗЫ А как это - указатель в никуда? (тоесть NULL?) Куда он начинает указывать при инициализации?
Это я к тому, что ссылки контролируются еще и компилятором, в отличии от указателей.
2
840 / 347 / 67
Регистрация: 20.11.2012
Сообщений: 809
04.12.2012, 20:36
С точки зрения низкого уровня - версии со ссылками и указателями - одинаковы. VS2012, оптимизация отключена.

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
#include <iostream>
using namespace std;
 
void ref_swap(int& a, int& b)
{
    int tmp = a;
    a = b;
    b=tmp;
}
 
void p_swap(int *a, int *b)
{
    int tmp = *a;
    *a=*b;
    *b=tmp;
}
 
int main()
{
    int a = 0, b = 0;
    cout<<"Enter a: "; cin>>a;
    cout<<"Enter b: "; cin>>b;
    ref_swap(a, b);
    cout<<"a == "<<a<<"\nb == "<<b<<endl;
    p_swap(&a, &b);
    cout<<"a == "<<a<<"\nb == "<<b<<endl;
}
Кликните здесь для просмотра всего текста
Assembler
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
29
30
31
32
33
34
35
36
37
38
39
;   COMDAT ?ref_swap@@YAXAAH0@Z
_TEXT   SEGMENT
_tmp$ = -4                      ; size = 4
_a$ = 8                         ; size = 4
_b$ = 12                        ; size = 4
?ref_swap@@YAXAAH0@Z PROC               ; ref_swap, COMDAT
 
; 5    : {
 
    push    ebp
    mov ebp, esp
    push    ecx
 
; 6    :    int tmp = a;
 
    mov eax, DWORD PTR _a$[ebp]
    mov ecx, DWORD PTR [eax]
    mov DWORD PTR _tmp$[ebp], ecx
 
; 7    :    a = b;
 
    mov edx, DWORD PTR _a$[ebp]
    mov eax, DWORD PTR _b$[ebp]
    mov ecx, DWORD PTR [eax]
    mov DWORD PTR [edx], ecx
 
; 8    :    b=tmp;
 
    mov edx, DWORD PTR _b$[ebp]
    mov eax, DWORD PTR _tmp$[ebp]
    mov DWORD PTR [edx], eax
 
; 9    : }
 
    mov esp, ebp
    pop ebp
    ret 0
?ref_swap@@YAXAAH0@Z ENDP               ; ref_swap
_TEXT   ENDS


Кликните здесь для просмотра всего текста
Assembler
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
29
30
31
32
33
34
35
36
37
38
39
;   COMDAT ?p_swap@@YAXPAH0@Z
_TEXT   SEGMENT
_tmp$ = -4                      ; size = 4
_a$ = 8                         ; size = 4
_b$ = 12                        ; size = 4
?p_swap@@YAXPAH0@Z PROC                 ; p_swap, COMDAT
 
; 12   : {
 
    push    ebp
    mov ebp, esp
    push    ecx
 
; 13   :    int tmp = *a;
 
    mov eax, DWORD PTR _a$[ebp]
    mov ecx, DWORD PTR [eax]
    mov DWORD PTR _tmp$[ebp], ecx
 
; 14   :    *a=*b;
 
    mov edx, DWORD PTR _a$[ebp]
    mov eax, DWORD PTR _b$[ebp]
    mov ecx, DWORD PTR [eax]
    mov DWORD PTR [edx], ecx
 
; 15   :    *b=tmp;
 
    mov edx, DWORD PTR _b$[ebp]
    mov eax, DWORD PTR _tmp$[ebp]
    mov DWORD PTR [edx], eax
 
; 16   : }
 
    mov esp, ebp
    pop ebp
    ret 0
?p_swap@@YAXPAH0@Z ENDP                 ; p_swap
_TEXT   ENDS


Вызов этих функций - также 1 в 1.
1
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
04.12.2012, 20:43
Стефан К. Дьюхэрст - Скользкие места С++
там есть полезности по этому вопросу.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.12.2012, 20:43
Помогаю со студенческими работами здесь

Разработать функцию, в которую передается массив типа float, что возвращает сумму элементов массива в диапазон
Разработать функцию, в которую передается массив типа float, что возвращает сумму элементов массива в диапазоне от 5.0 до 100.

Что происходит когда передается в функцию базового класса аргумент с типом производного класса?
Есть функция перегруженного оператора&quot;+&quot; в производном классе и в базовом классе который принимает свой тип(базового класса) что...

Почему в поток передается делегат, а не ссылка на метод
Привет всем. Вопрос в следующем, допустим у нас есть метод возвращающий значение типа int и мы хотим этот метод выполнить в отдельном...

Как сделать так, что если результат - средний или низкий - появлялась ссылка
Здравствуйте. Как организовать: имеется переменная result. в ней хранится результат прохождения тестирования. (высокий, средний или...

Написать функцию, которая возвращает целое случайное число из диапазона, который передается параметрами в функцию.
&lt;html&gt; &lt;head&gt; &lt;title&gt;Случайные числа &lt;/title&gt; &lt;script type=&quot;text/javascript&quot;&gt; function RAND(min,max) { var...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru