Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.01.2013, 04:22   #1
koderman
Пользователь
 
Регистрация: 07.01.2013
Сообщений: 10
По умолчанию Функции

Я учил функции и даже думал что понял пока не увидел следующий пример:
Как *py и *py получили значения 10 и 5?
Вижу только объявление *py и *py, инициализации этих переменных числами 10 и 5 не вижу.



// Листинг 9.6. Пример передачи аргументов как ссылок
Код:
#include <iostream.h>

void swap (int *x, int *y)

 int main()
 {
int x = 5, у = 10;

cout << "Main. Before swap, x: " << x << " у: " << у << "\n";
 swap(&x,&y);
 cout << "Main. After swap, x: " << x << " у: " << у << "\n";
   return 0;
 }

void swap (int *px, int *py)
 {
    int temp;

   cout << "Swap. Before swap, *рх: " << *px << " *py: " << *py << "\n";

   temp = *px;
   *px = *py;
    *py = temp;

  cout << "Swap. After swap, *px: " << *px << " *py: " << *py << "\n";

 }
Результат:
Main. Before swap, x: 5 y: 10
Swap. Before swap, *px: 5 *py: 10
Swap. After swap, *px: 10 *py: 5
Main. After swap, x: 10 y: 5

Последний раз редактировалось koderman; 18.01.2013 в 04:24.
koderman вне форума Ответить с цитированием
Старый 18.01.2013, 07:55   #2
Ezhik Kihze
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 639
По умолчанию

1. Сначала читаем вашу же тему http://programmersforum.ru/showthread.php?t=225451
2.
Цитата:
Как *py и *py получили значения 10 и 5?
Вижу только объявление *py и *py, инициализации этих переменных числами 10 и 5 не вижу.
Вы опять реально не видете строку?
Код:
swap(&x,&y);
ICQ: 677936656 Gmail: ekEmbed@gmail.com
Ezhik Kihze вне форума Ответить с цитированием
Старый 18.01.2013, 17:04   #3
koderman
Пользователь
 
Регистрация: 07.01.2013
Сообщений: 10
По умолчанию

Как этой строкой
Код:
swap(&x,&y);
присваиваются 5 и 10 переменным *py и *py? Это вроде просто ссылки х и у которые меняются адресами.
Я думал должно стоять чтото типа
Код:
py=5;  py=10;
koderman вне форума Ответить с цитированием
Старый 18.01.2013, 17:10   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Это вроде просто ссылки х и у которые меняются адресами.
Ты в функцию передаешь адреса на переменные, а в функции ты эти адреса разименовываешь. Поэтому там работа идет со значениями, на которые указывают px и py, а не с самими px и py.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 18.01.2013, 17:25   #5
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Как этой строкой
Код:
swap(&x,&y);
присваиваются 5 и 10 переменным *py и *py?
Если рассуждать в терминах кода C++, при вызове функции создаются все локальные переменные этой функции, включая её аргументы; формальным аргументам функции присваиваются значения фактических параметров. То есть,
Код:
swap(&x,&y);
в первом приближении (и с километровым списком оговорок) можно заменить на вот такой текст:
Код:
{//Вход в функцию
  int *px; int *py; int temp;//Создание локальных переменных
  px = &x; py = &y; //Присваивание формальным аргументам переданных параметров

  //Тело функции  
  cout << "Swap. Before swap, *рх: " << *px << " *py: " << *py << "\n";

  temp = *px;
  *px = *py;
  *py = temp;

  cout << "Swap. After swap, *px: " << *px << " *py: " << *py << "\n";
}//Выход из функции
Abstraction вне форума Ответить с цитированием
Старый 18.01.2013, 21:12   #6
koderman
Пользователь
 
Регистрация: 07.01.2013
Сообщений: 10
По умолчанию

Цитата:
Сообщение от Abstraction Посмотреть сообщение
Если рассуждать в терминах кода C++ [/CODE]
А если рассуждать не в терминах кода, а так чтоб было понятно?))
koderman вне форума Ответить с цитированием
Старый 18.01.2013, 21:46   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
а так чтоб было понятно?
А вот тут наверное лучше почитать про указатели литературу. Все равно столкнешься с терминологией, которую я так понимаю как раз и не усвоил.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 18.01.2013, 21:51   #8
Ezhik Kihze
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 639
По умолчанию

У функции есть два типа параметров:
1. формальные - те, что записаны в заголовке функции; некая абстракция, именно с ними вы и работаете внутри функции -
Код:
int *px, int *py
2. фактические - те, с которыми функция вызывается;

Это как в школе, когда вам говоили: вычислить а + с, при а = 5 и с = 10

2 Stilet
Рано про указатели. Он не понимает почему параметры внутри функции вдруг получили значения равные тем, какие были в вызове функции.
ICQ: 677936656 Gmail: ekEmbed@gmail.com

Последний раз редактировалось Ezhik Kihze; 18.01.2013 в 21:56.
Ezhik Kihze вне форума Ответить с цитированием
Старый 19.01.2013, 01:20   #9
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
А если рассуждать не в терминах кода, а так чтоб было понятно?))
Так я же не знаю, что Вам понятно, а что - нет. Можно обратиться к абстракции низшего уровня, с ячейками памяти и их адресами - это будет для Вас лучше?
Вот, скажем, со второго прочтения мне попалось на глаза:
Цитата:
присваиваются 5 и 10 переменным *px и *py?
Они же не переменные, и хорошо бы это осознать пораньше. Переменная имеет имя. Скажем, px - переменная. *px, px[0], ((MyStruct*)px)->value, !px - выражения, в которые входит переменная px. То есть, Ваш вопрос можно прочитать - как получается так, что значение выражения *px становится равно 5. Ответ: переменной px присваивается значение выражения &x - адреса переменной x. Это свойство "адреса", его определение - что из px==&x следует *px==x (обратное, вообще говоря, неверно).
Abstraction вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Использование подпрограммы-функции: Вычислить значение функции (Турбо паскаль) RealUnited Паскаль, Turbo Pascal, PascalABC.NET 1 05.12.2012 20:34
Построение графика функции, мигание(затухание) шарика в минимумах функции kas1m_rus Паскаль, Turbo Pascal, PascalABC.NET 0 27.05.2012 20:28
Как подменить адрес возврата функции func на адрес функции f используя переполнение буфера buf и функции gets dmitrii6120 Помощь студентам 6 14.11.2011 20:10
Мини бэйсик:объявление функции, вызов функции , возврат. AL_LORD Помощь студентам 2 14.10.2010 17:48
Программа на СИ++, используя функции работы с файлами и функции <string.h> Аня Popova Фриланс 9 13.09.2010 15:52