Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
Alex Z
27 / 1 / 0
Регистрация: 29.06.2011
Сообщений: 136
1

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

04.12.2012, 20:02. Просмотров 877. Ответов 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
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.12.2012, 20:02
Ответы с готовыми решениями:

Что значит void в прототипе?
BOOL WINAPI AllocConsole(void); BOOL - тип возвращаемого значения, WINAPIN - соглашение,...

Строка не передаётся в функцию
#include <iostream> #include <stdio.h> #include <string.h> using namespace std; ...

Файловый ввод С++.Не создаётся файл ifstream что делать?Если что функцию is_open тоже пробовал не выходит
//Удаление Элемента из массива// #include<fstream> using std::ifstream; void...

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

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

16
booker
23 / 23 / 5
Регистрация: 21.11.2012
Сообщений: 106
04.12.2012, 20:08 2
Да адреса вроде
1
Croessmah
++Ͻ
15955 / 9065 / 1746
Регистрация: 27.09.2012
Сообщений: 22,310
Записей в блоге: 2
Завершенные тесты: 2
04.12.2012, 20:10 3
Цитата Сообщение от Alex Z Посмотреть сообщение
Кто не прав? Книжка, поди, опять... Снова меня запутали.
считайте, что передается сам объект, не забивайте себе голову такими вопросами до поры до времени.
1
freemanc
12 / 12 / 6
Регистрация: 27.11.2012
Сообщений: 140
04.12.2012, 20:10 4
при передаче с использованием указателей или ссылок, в обоих случаях передаются адреса реальных переменных из функции main
- все верно, функция получает переменную по ссылке
0
04.12.2012, 20:10
Igor3D
1229 / 596 / 74
Регистрация: 01.10.2012
Сообщений: 2,844
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
++Ͻ
15955 / 9065 / 1746
Регистрация: 27.09.2012
Сообщений: 22,310
Записей в блоге: 2
Завершенные тесты: 2
04.12.2012, 20:15 6
Цитата Сообщение от freemanc Посмотреть сообщение
все верно, функция получает переменную по ссылке
Это понятие языков более высокого уровня.
1
coloc
погромист
412 / 248 / 30
Регистрация: 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
++Ͻ
15955 / 9065 / 1746
Регистрация: 27.09.2012
Сообщений: 22,310
Записей в блоге: 2
Завершенные тесты: 2
04.12.2012, 20:17 8
Цитата Сообщение от coloc Посмотреть сообщение
эквивалентно
попробуйте swap(NULL,NULL) сделать в примере с ссылками.
0
ValeryS
Модератор
7944 / 5915 / 783
Регистрация: 14.02.2011
Сообщений: 20,355
Завершенные тесты: 1
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
1229 / 596 / 74
Регистрация: 01.10.2012
Сообщений: 2,844
04.12.2012, 20:21 10
Цитата Сообщение от Croessmah Посмотреть сообщение
попробуйте swap(NULL,NULL) сделать в примере с ссылками.
А почему нет?
C++
1
swap(*(int *) NULL, *(int *) NULL);
0
Croessmah
++Ͻ
15955 / 9065 / 1746
Регистрация: 27.09.2012
Сообщений: 22,310
Записей в блоге: 2
Завершенные тесты: 2
04.12.2012, 20:23 11
Цитата Сообщение от Igor3D Посмотреть сообщение
А почему нет?
это уже другое.
0
coloc
погромист
412 / 248 / 30
Регистрация: 27.08.2012
Сообщений: 550
Завершенные тесты: 1
04.12.2012, 20:26 12
Croessmah, тоесть ссылки не могут указывать в никуда? Компилятора просто сейчас нету
ЗЫ А как это - указатель в никуда? (тоесть NULL?) Куда он начинает указывать при инициализации?
0
Croessmah
++Ͻ
15955 / 9065 / 1746
Регистрация: 27.09.2012
Сообщений: 22,310
Записей в блоге: 2
Завершенные тесты: 2
04.12.2012, 20:27 13
Ссылки - это целый механизм и сравнивать его с указателями как-то не хорошо. Как это реализуется на низком уровне - можно узнать, посмотрев код на мнемонике ассемблера.
2
coloc
погромист
412 / 248 / 30
Регистрация: 27.08.2012
Сообщений: 550
Завершенные тесты: 1
04.12.2012, 20:30 14
Мда... Я осознал , что я чайник в еще большей степени, чем есть
0
Croessmah
++Ͻ
15955 / 9065 / 1746
Регистрация: 27.09.2012
Сообщений: 22,310
Записей в блоге: 2
Завершенные тесты: 2
04.12.2012, 20:30 15
Цитата Сообщение от coloc Посмотреть сообщение
Croessmah, тоесть ссылки не могут указывать в никуда? Компилятора просто сейчас нету
ЗЫ А как это - указатель в никуда? (тоесть NULL?) Куда он начинает указывать при инициализации?
Это я к тому, что ссылки контролируются еще и компилятором, в отличии от указателей.
2
WhiteP
611 / 209 / 32
Регистрация: 20.11.2012
Сообщений: 437
Завершенные тесты: 1
04.12.2012, 20:36 16
С точки зрения низкого уровня - версии со ссылками и указателями - одинаковы. 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
++Ͻ
15955 / 9065 / 1746
Регистрация: 27.09.2012
Сообщений: 22,310
Записей в блоге: 2
Завершенные тесты: 2
04.12.2012, 20:43 17
Стефан К. Дьюхэрст - Скользкие места С++
там есть полезности по этому вопросу.
1
04.12.2012, 20:43
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.12.2012, 20:43

Событие не передаётся в функцию
Я пишу &lt;html&gt; &lt;head&gt; &lt;script&gt; function f(e) { alert(e.type) } &lt;/script&gt; &lt;/head&gt; &lt;body...

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

Если нет файла, но есть ссылка, то будет отображаться ссылка на указанную страницу...
Здравствуйте, понадобилась помощь в php)) В общем есть такой код: &lt;?php $file =...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

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