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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.82
bgm313
12 / 12 / 2
Регистрация: 27.07.2012
Сообщений: 208
#1

Передача по ссылке - C++

31.07.2012, 18:39. Просмотров 1454. Ответов 5
Метки нет (Все метки)

В учебнике написано, что можно использовать функцию с левой стороны операции присваивания, если она возвращает ссылку. Например, так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
using namespace std;
 
int &swap(int &x){
    x++;         //инкремент переменной на которую ссылается x
    
    return x;    //возврат ссылки
}
 
int main(){
    int x = 100;
    
    cout << swap(x) << "\n";
    
    swap(x) = 2; //теперь x = 2;
    cout << x << "\n";
 
    return 0;
}
Я попробовал сделать передачу по ссылке вручную так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
  #include <iostream>
using namespace std;
 
int *swap(int *x){
    (*x)++;       //инкремент переменной на которую ссылается x
    
    return x;    //возврат указателя
}
 
 
 
int main(){
    int x = 100;
    
    cout << swap(&x) << "\n";
    
    *swap(&x) = 2; //теперь x = 2;
    cout << x << "\n";
 
    return 0;
}
и попробовал последнее ещё так:

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
 #include <iostream>
using namespace std;
 
int *swap(int x){
          
    int *t = &x;
    return t;
}
 
 
 
int main(){
    int x = 100;
    
    cout << swap(x) << "\n";
    
    *swap(x) = 2; //x почему - то не изменился?;
    cout << x << "\n";
 
    return 0;
}#include <iostream>
using namespace std;
 
int *swap(int x){
          
    int *t = &x;
    return t;
}
 
 
 
int main(){
    int x = 100;
    
    cout << swap(x) << "\n";
    
    *swap(x) = 2; //x почему - то не изменился?;
    cout << x << "\n";
 
    return 0;
}
Почему в последнем примере не изменился x?

Добавлено через 5 минут
И вот ещё последнее очень интересно:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
using namespace std;
 
int *swap(int x){
          
    int *t = &x;
    return t;
}
 
 
 
int main(){
    int x = 100;
    int *;
    cout << swap(x) << "\n";
    
    p = swap(x) ; // p указатель  на x
    *p =2;          //присвоим x = 2;
    cout << *p;    //выведет значение 2
    cout << x << "\n"; //выведет значение 100
 
    return 0;
}
Объясните пожалуйста 2 последних пример (особенное последний). Не пойму p ссылается на локальную переменную ?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.07.2012, 18:39
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Передача по ссылке (C++):

Передача по ссылке - C++
С помощью функции rand() округлить значение double и передать его по ссылке.

Передача по ссылке - C++
Здравствуйте. 1.typedef struct { MATRIXX_LENTA&lt;double&gt;* MATR; //Ленточная матрица } DATA_LENTA, *PDATA_LENTA; DWORD WINAPI...

Enum передача по ссылке - C++
Ребята, подскажите, как передать enum в функцию, что бы внутри функции установить значение. Точнее мне надо всё под тип int сделать, так...

Передача параметра по ссылке - C++
Всем доброго времени суток. Понимаю что вопрос покажется очень глупым, но я уже несколько часов бьюсь и не могу решить эту элементарную...

Передача структуры по ссылке - C++
Здравствуйте. Нужно использовать передачу структуры по ссылке(или по указателю). Объясните пожалуйста как это делать и , если можно, как...

Передача параметров по ссылке - C++
Вот задание: С клавиатуры вводится число, передается в вызываемую функцию, в ней найти сумму делителей и их число. Результат работы...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Schizorb
509 / 461 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
31.07.2012, 18:45 #2
В последнем примере:

C++
1
2
3
4
5
6
int *swap(int x) // создается локальная переменная x (копия переданного аргумента)
{
          
    int *t = &x; // берется адрес этой локальной копии (не исходного x!!!)
    return t; // возвращается этот адрес
}
То есть в p лежит не адрес переменной x из main, а адрес локальной переменной x из функции swap (это разные переменные). Так вообще делать нельзя, поскольку автоматические переменные уничтожаются при выходе из функции. Т.е. не возвращайте ссылки или указатели на локальные переменные.

Выход - передать аргумент по ссылке, т.е.
C++
1
int *swap(int & x)
Тогда не будет локальных копий переменной.
PreFX
25 / 20 / 1
Регистрация: 14.07.2012
Сообщений: 176
31.07.2012, 18:47 #3
Почему в последнем примере не изменился x?
Хм, а где тут, собственно, передача по ссылке? Передача по ссылке осуществляется так:

C++
1
2
3
4
5
6
7
8
9
10
11
int& swap ( int& x)
{
    return x;
}
 
int main ()
{
int x=100;
swap(x)=2;
return 0;
}
А в вашем примере используется указатель, значение которого указывает на удалённую переменную.
bgm313
12 / 12 / 2
Регистрация: 27.07.2012
Сообщений: 208
31.07.2012, 18:52  [ТС] #4
Цитата Сообщение от Schizorb Посмотреть сообщение
В последнем примере:

C++
1
2
3
4
5
6
int *swap(int x) // создается локальная переменная x (копия переданного аргумента)
{
          
    int *t = &x; // берется адрес этой локальной копии (не исходного x!!!)
    return t; // возвращается этот адрес
}
То есть в p лежит не адрес переменной x из main, а адрес локальной переменной x из функции swap (это разные переменные). Так вообще делать нельзя, поскольку автоматические переменные уничтожаются при выходе из функции. Т.е. не возвращайте ссылки или указатели на локальные переменные.

Выход - передать аргумент по ссылке, т.е.
C++
1
int *swap(int & x)
Тогда не будет локальных копий переменной.
Да, я в принципе так и думал. НО локальная переменная уничтожается при выходе из функции. Тогда в последнем примере я должен увидеть на экране мусор, а не значение локальной переменной, которой уже нет.
Schizorb
509 / 461 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
31.07.2012, 19:00 #5
Цитата Сообщение от bgm313 Посмотреть сообщение
Тогда в последнем примере я должен увидеть на экране мусор
Не факт, что там будет мусор... Вы просто возвращаете адрес того места, где была переменная. Непосредственно после вызова функции там возможно остается лежать прежнее значение. Но полагаться на это нельзя, эта область памяти впоследствии может быть заполнена другим значением.
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
31.07.2012, 19:01 #6
Цитата Сообщение от bgm313 Посмотреть сообщение
Да, я в принципе так и думал. НО локальная переменная уничтожается при выходе из функции. Тогда в последнем примере я должен увидеть на экране мусор, а не значение локальной переменной, которой уже нет.
Почему её нет, она там есть. Возможно. А возможно уже мусор. Это просто операционная система не даёт по рукам линейкой за обращения к памяти, которая была уже удалена delete.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.07.2012, 19:01
Привет! Вот еще темы с ответами:

Передача параметров по ссылке - C++
Стоит ли передавать все параметры (кроме скалярных и указателей) по сслыке? Т.е. вместо void doSomething(const int _count, const...

Передача по ссылке и по значению - C++
Эта тема стара как мир, но я хотел уточнить одну вещь. QBluetoothAddress* address = new QBluetoothAddress(&quot;00:1A:7D:DA:71:15&quot;); ...

Передача параметра по ссылке - C++
Здравствуйте! Подскажите пожалуйста! Делаю пример из книги: #include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace...

Передача по указателю и по ссылке - C++
Всем привет! Есть функция, в которую передается ссылка: void Compare(int &amp;p) { int * str = p;// здесь ошибка нельзя...


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

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

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