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

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

Войти
Регистрация
Восстановить пароль
 
 
dimcoder
Полярный
455 / 428 / 67
Регистрация: 11.09.2011
Сообщений: 1,129
#1

Дребедень с указателями хэлп - C++

11.09.2011, 19:01. Просмотров 963. Ответов 24
Метки нет (Все метки)

Здравствуйте, форумчане. Изучаю с++, дошёл до указателей. Душа потребовала эксперементов. Прежде чем обяъявить проблему ,подумайте, какой ответ должна дать следующая программа на с++:
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
#include <iostream.h>
#include <conio.h>
 
int modify(int *);
 
main ()
{
   int x = 10;
 
   cout << "modify(x) = " << modify(&x) << endl << "x = " << x << endl;
 
 
   getch();
 
 
   return 0;
}
 
int modify(int *y)
{
   *y = 1;
 
   return *y;
}
По идее (по моей идее), используя указатель *у, х доже модифицируется, должен быть ответ:
modify(x) = 1, а x = 1

Но у меня х = 10

Народ, подскажите, в чём проблема, точнее в чём моя проблема?

PS. Если перед cout вызвать функцию modify(&x), выдаёт правильный ответ (х = 1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.09.2011, 19:01     Дребедень с указателями хэлп
Посмотрите здесь:

хэлп с лабой) - C++
1. В файле в каждой строке заменить ту комбинацию из трех символов, которая чаще всех встречается в строке, на символ '&amp;'. 2. В...

Хэлп по лабораторной 2 - C++
Я прошу прощения, понимаю что выгляжу глупо, но не мог бы кто помочь с остальными 8 вопросами - не все зарегистрированы в контакте,...

Хэлп с функциями - C++
1.Написать функцию, которая умножает поэлементно 2 массива. Параметрами функции должны быть оба массива и массив, в который записывается...

Операция с указателями - C++
SomeClass* ptr = sc1; SomeClass* ptr2 = ptr1; как имея только ptr2 изменить указатель ptr (изменить переменную, на которую ссылается ptr)...

Работа с указателями - C++
#include &lt;iostream&gt; #include &lt;cstdio&gt; #include &lt;iomanip&gt; using namespace std; int main() { int i;float f;long int l;double d;...

Указателями массивов - C++
#include &lt;iostream&gt; #include &lt;math.h&gt; #include &lt;stdlib.h&gt; #include &lt;iomanip&gt; using namespace std; int main() ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
sandye51
программист С++
681 / 583 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
11.09.2011, 19:04     Дребедень с указателями хэлп #2
аргументы идут с права налево
и просто не успевает измениться x
dimcoder
Полярный
455 / 428 / 67
Регистрация: 11.09.2011
Сообщений: 1,129
11.09.2011, 19:09  [ТС]     Дребедень с указателями хэлп #3
Я так понял, в операторе cout всё идёт с права на лево? Разъясните, пожалуйста...
soon
2539 / 1304 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
11.09.2011, 19:16     Дребедень с указателями хэлп #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
#include <iostream>
 
int modify(int *y) { *y = 1; return *y; }
 
int main ()
{
   int x = 10;
 
   std::cout << "x = " << x << std::endl;
   std::cout << "modify(&x) = " << modify(&x) << " x = " << x << std::endl;
   std::cout << "x = " << x << std::endl;
  
   //getch();
   return 0;
}
Так понятней? Фактически x меняется, но увидеть это можно только припоследующем вызове cout
dimcoder
Полярный
455 / 428 / 67
Регистрация: 11.09.2011
Сообщений: 1,129
11.09.2011, 19:20  [ТС]     Дребедень с указателями хэлп #5
Понятно! Но почему? Почему не успевает?
soon
2539 / 1304 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
11.09.2011, 19:36     Дребедень с указателями хэлп #6
Сообщение #2 читали?
dimcoder
Полярный
455 / 428 / 67
Регистрация: 11.09.2011
Сообщений: 1,129
11.09.2011, 19:41  [ТС]     Дребедень с указателями хэлп #7
ОК, почему они идут справа налево? Как это работает? Сорри за столько вопросов.
viktorrrr
42 / 42 / 1
Регистрация: 11.02.2010
Сообщений: 358
11.09.2011, 20:09     Дребедень с указателями хэлп #8
Цитата Сообщение от dimcoder Посмотреть сообщение
По идее (по моей идее), используя указатель *у, х доже модифицируется, должен быть ответ:
modify(x) = 1, а x = 1
Это у тебя вызов по ссылке. Не получается 1, потому что вызываете значение х, а то, что у вас в функции, можно сказать, что значение по умолчанию, что ли.)
soon
2539 / 1304 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
11.09.2011, 20:21     Дребедень с указателями хэлп #9
Это у тебя вызов по ссылке. Не получается 1, потому что вызываете значение х, а то, что у вас в функции, можно сказать, что значение по умолчанию, что ли.)
Не въехал абсолютно, проясните, пожалуйста, что вы хотели донести.

Добавлено через 1 минуту
Как раз 1 то и получается. Он не _выводится_. Почему? Посмотрите сообщение #2
easybudda
Эксперт С++
9456 / 5469 / 927
Регистрация: 25.07.2009
Сообщений: 10,495
11.09.2011, 20:30     Дребедень с указателями хэлп #10
soon, при передаче в cout сначала берётся значение x, и только потом modify(x), потому и выводится так, как выводится...
Mustik
56 / 56 / 2
Регистрация: 10.07.2011
Сообщений: 229
11.09.2011, 20:37     Дребедень с указателями хэлп #11
Судя по всему, функция cout сначала собирает справа налево все аргументы, затем выводит.
Просто поменяй места modify(&x) и x

Добавлено через 2 минуты
dimcoder, дело не в указателе. Ты все правильно сделал, у функции cout, видимо, свои особенности.
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
11.09.2011, 20:37     Дребедень с указателями хэлп #12
Mustik, cout - НЕ функция
Kastaneda
Форумчанин
Эксперт С++
4479 / 2841 / 227
Регистрация: 12.12.2009
Сообщений: 7,224
Записей в блоге: 1
Завершенные тесты: 1
11.09.2011, 20:38     Дребедень с указателями хэлп #13
Цитата Сообщение от Mustik Посмотреть сообщение
Судя по всему, функция cout сначала собирает справа налево все аргументы, затем выводит.
В общем-то так и должно быть:
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
;MSVS 2010
;cout << "modify(x) = " << modify(&x) << endl << "x = " << x<< endl;
01307A95  push        offset std::endl (130477Bh)  
01307A9A  mov         eax,dword ptr [x]  
01307A9D  push        eax  ; в стек кладется значение x, т.е. 10
01307A9E  push        offset string "x = " (1371378h)  
01307AA3  push        offset std::endl (130477Bh)  
01307AA8  lea         ecx,[x]  
01307AAB  push        ecx  
01307AAC  call        modify (13059AAh)  ; а modify() вызывается уже после этого
01307AB1  add         esp,4  
01307AB4  push        eax  
01307AB5  push        offset string "modify(x) = " (1371368h)  
01307ABA  push        offset std::cout (1386F00h)  
01307ABF  call        std::operator<<<std::char_traits<char> > (130510Dh)  
01307AC4  add         esp,8  
01307AC7  mov         ecx,eax  
01307AC9  call        std::basic_ostream<char,std::char_traits<char> >::operator<< (130491Ah)  
01307ACE  mov         ecx,eax  
01307AD0  call        std::basic_ostream<char,std::char_traits<char> >::operator<< (1305153h)  
01307AD5  push        eax  
01307AD6  call        std::operator<<<std::char_traits<char> > (130510Dh)  
01307ADB  add         esp,8  
01307ADE  mov         ecx,eax  
01307AE0  call        std::basic_ostream<char,std::char_traits<char> >::operator<< (130491Ah)  
01307AE5  mov         ecx,eax  
01307AE7  call        std::basic_ostream<char,std::char_traits<char> >::operator<< (1305153h)
viktorrrr
42 / 42 / 1
Регистрация: 11.02.2010
Сообщений: 358
11.09.2011, 20:40     Дребедень с указателями хэлп #14
Цитата Сообщение от soon Посмотреть сообщение
Как раз 1 то и получается. Он не _выводится_. Почему? Посмотрите сообщение #2
Первый вызов modify(&x) - Так вообще делать нельзя. Смысл теряет. Функция в данном случае вызывается, чтобы произвести какие-то изменения с переменной х, а потом уже ее измененную вывести.

C++
1
2
 modify(&x);
cout<< "x = " << x << endl;
Правильно должно быть вот так.
Mustik
56 / 56 / 2
Регистрация: 10.07.2011
Сообщений: 229
11.09.2011, 20:44     Дребедень с указателями хэлп #15
Цитата Сообщение от ForEveR Посмотреть сообщение
Mustik, cout - НЕ функция
Ну как выразился
Объект?

Добавлено через 1 минуту
Цитата Сообщение от viktorrrr Посмотреть сообщение
Первый вызов modify(&x) - Так вообще делать нельзя. Смысл теряет. Функция в данном случае вызывается, чтобы произвести какие-то изменения с переменной х, а потом уже ее измененную вывести.

C++
1
2
 modify(&x);
cout<< "x = " << x << endl;
Правильно должно быть вот так.
Он учится работать с указателями, а с помощью cout, контролирует и проверяет изменение значений
soon
2539 / 1304 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
11.09.2011, 20:45     Дребедень с указателями хэлп #16
soon, при передаче в cout сначала берётся значение x, и только потом modify(x), потому и выводится так, как выводится...
Ну т.е. при
C++
1
std::cout << f(&x) << x;
сначала выводится непосредственно x, затем вызывается f(&x), которое передает в поток значение f(&x), и именно поэтому x выводится ихзначальное, а не то, которое должно получится после f()?
Ну дак я это и не отрицал.
Kastaneda
Форумчанин
Эксперт С++
4479 / 2841 / 227
Регистрация: 12.12.2009
Сообщений: 7,224
Записей в блоге: 1
Завершенные тесты: 1
11.09.2011, 20:47     Дребедень с указателями хэлп #17
Цитата Сообщение от soon Посмотреть сообщение
сначала выводится непосредственно x, затем вызывается f(&x), которое передает в поток значение f(&x), и именно поэтому x выводится ихзначальное, а не то, которое должно получится после f()?
Нет, выводиться в том порядке, в котором мы пишем. Дело в том - в какой последовательности аргументы кладутся в стек. Значение x будет положенно до вызова ф-ции и больше меняться не будет, отсюда и такой вывод.
soon
2539 / 1304 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
11.09.2011, 20:53     Дребедень с указателями хэлп #18

Не по теме:

Ааа, я кажется понял. Вот это

Почему? Посмотрите сообщение #2
относилось к возможному встречному вопросу от viktorrrr-а. И, соответственно, не означало, что я не согласен с тем, что cout обрабатывает справа налево.



Добавлено через 2 минуты
Нет, выводиться в том порядке, в котором мы пишем. Дело в том - в какой последовательности аргументы кладутся в стек. Значение x будет положенно до вызова ф-ции и больше меняться не будет, отсюда и такой вывод.
Все правильно. Это я не так выразился. Разумеется будет выводить в нужном порядке
emilen
10 / 10 / 0
Регистрация: 25.05.2010
Сообщений: 52
11.09.2011, 21:34     Дребедень с указателями хэлп #19
Точно не помню, но поведение cout не определенно, так что полагаться на то, что будет справа или слева лучше не надо, а сделать примерно, как сделал soon.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.09.2011, 21:49     Дребедень с указателями хэлп
Еще ссылки по теме:

непонятки с указателями - C++
Добрый день! изучаем плюсы, наткнулся на одну странную ситуацию, не могу сообразить, в чём дело... :( Есть структура - Point...

Вектор с указателями - C++
Доброго времени суток, есть такой код: // 1159.cpp : Defines the entry point for the console application. // #include...

Массив. с указателями с++ - C++
1. Задан массив из 10 целых чисел. Посчитать количество смен знаков заданных чисел. Перебор элементов массива должен осуществляться...

Проблемка с указателями - C++
Нужно перегрузить &quot;+&quot; чтобы он делал слияние 2ух массивов(элементы не повторялись) вот код: #include &lt;iostream.h&gt; #include...


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

Или воспользуйтесь поиском по форуму:
soon
2539 / 1304 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
11.09.2011, 21:49     Дребедень с указателями хэлп #20
Кому интересно может также погуглить на эту тему, а конкретно на форуме VPF находил топик, в котором обсуждалось поведение cout. На трех разных компиляторах выводило три разных ответа.

Добавлено через 2 минуты
И можете даже не гуглить, я нашел линк. Вот
Yandex
Объявления
11.09.2011, 21:49     Дребедень с указателями хэлп
Ответ Создать тему
Опции темы

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