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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.05.2009, 23:01   #11
atomicxp
Форумчанин
 
Аватар для atomicxp
 
Регистрация: 01.05.2009
Сообщений: 110
Радость

Взял на себя смелость и изменил функцию:

Код:
void swapp(int* p, int* q)
{
    int* temp;
    temp = p;
    p = q;
    q = temp;
}
Код:
Starting...
address = 0x22ff74; a = 5;
address = 0x22ff70; b = 10;

swapr
address = 0x22ff74; a = 10;
address = 0x22ff70; b = 5;

swapp
address = 0x22ff74; a = 10;
address = 0x22ff70; b = 5;

Process returned 0 (0x0)   execution time : 0.015 s
Press any key to continue.
Вот теперь похоже не работает.
atomicxp вне форума Ответить с цитированием
Старый 09.05.2009, 23:05   #12
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от atomicxp Посмотреть сообщение
Взял на себя смелость и изменил функцию:

Код:
void swapp(int* p, int* q)
{
    int* temp;
    temp = p;
    p = q;
    q = temp;
}
[CODE]
Внутри функции то Вы указатели поменяли, но они передаются по значению и потому вне функции ничего не поменяется
pu4koff вне форума Ответить с цитированием
Старый 09.05.2009, 23:08   #13
atomicxp
Форумчанин
 
Аватар для atomicxp
 
Регистрация: 01.05.2009
Сообщений: 110
Радость

Цитата:
Сообщение от pu4koff Посмотреть сообщение
Внутри функции то Вы указатели поменяли, но они передаются по значению и потому вне функции ничего не поменяется
Это то как раз понятно, зато создаётся иллюзия работы, если не считать того, что обмен должен происходить два раза.
atomicxp вне форума Ответить с цитированием
Старый 10.05.2009, 00:08   #14
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

ПОЧЕМУ так происходит? почему результат разный?

Последний раз редактировалось Dimarik; 10.05.2009 в 00:12.
Dimarik вне форума Ответить с цитированием
Старый 10.05.2009, 00:23   #15
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
ПОЧЕМУ так происходит? почему результат разный?
Потому что сначала вы обмениваете значения одной функцией, а потом обмениваете их ОБРАТНО.
Результат не разный. Если вы вызовете сделаете две программы, в одной из которых будет использоваться первая функция, а в другой - вторая, то результат будет один и тот же.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 10.05.2009, 02:29   #16
atomicxp
Форумчанин
 
Аватар для atomicxp
 
Регистрация: 01.05.2009
Сообщений: 110
Радость

Цитата:
Сообщение от Dimarik Посмотреть сообщение
ПОЧЕМУ так происходит? почему результат разный?
Может так понятнее будет:

Код:
#include <iostream>

using namespace std;

void swapr(int& a, int& b)
{
    int temp;
    temp = a;
    a = b ;
    b = temp;
}

void swapp(int* p, int* q)
{
    int temp;
    temp = *p;
    *p = *q;
    *q = temp;
}

void printAll(const int& a, const int& b)
{
    cout << "address = " <<  &a << "; a = " << a << ";" << endl;
    cout << "address = " << &b << "; b = " << b << ";" << endl;
}

int main()
{
    // Первый обмен
    int x1 = 5; int y1 = 10;
    cout << "Exchange 1" << endl;
    printAll(x1, y1);
    cout << endl << "swapr" << endl;
    swapr(x1, y1);
    printAll(x1, y1);

    // Пропуск
    cout << endl << endl;

    // Второй обмен
    int x2 = 5; int y2 = 10;
    cout << "Exchange 2" << endl;
    printAll(x2, y2);
    cout << endl << "swapp" << endl;
    swapp(&x2, &y2);
    printAll(x2, y2);

    return 0;
}
Код:
Exchange 1
address = 0x22ff74; a = 5;
address = 0x22ff70; b = 10;

swapr
address = 0x22ff74; a = 10;
address = 0x22ff70; b = 5;


Exchange 2
address = 0x22ff6c; a = 5;
address = 0x22ff68; b = 10;

swapp
address = 0x22ff6c; a = 10;
address = 0x22ff68; b = 5;

Process returned 0 (0x0)   execution time : 0.015 s
Press any key to continue.
Видишь я ввёл разные переменные, даже по адресам это видно. А в том варианте работа происходила с одними и теми же переменными, что тоже было видно по адресам, так как они совпадали.

Когда пишется вот так:
Код:
void swapr(int a, int b)
и где-то происходит вызов, например так
Код:
swapr(x1, y1);
переменные x1 и y1 копируются, то есть создаются новые переменные a и b, и им присваивается значения x1 и y1.

А вот передача по ссылке или указателю работает с теми же переменными, не копируя, а просто передавая функции указатели на них.
Код:
void swapr(int& a, int& b)
Код:
void swapp(int* p, int* q)
Причём я говорю об указателях в памяти, а не просто об указателях в C++. Может разница и не большая, но главное ведь смысл.
atomicxp вне форума Ответить с цитированием
Старый 10.05.2009, 03:13   #17
Nomlpppp
Пользователь
 
Регистрация: 26.02.2009
Сообщений: 51
По умолчанию

Цитата:
ПОЧЕМУ так происходит? почему результат разный?
Вызывай тогда так
Код:
 int wallet1=300;
 int wallet2=350;

 swapp( &wallet1, &wallet2 );    //передача адресов переменных
 ...

 wallet1=300;
 wallet2=350;

 swapr( wallet1, wallet2 );
 ...
Немного про передачу параметров в функцию: c swapr все понятно, она принимает адреса т.е работает практически с переданными переменными.

swapp получает указатели т.е не адреса в памяти где находятся данные, а переменные которые его содержат(в памяти находятся в другом месте(где угодно)).
В языке Cи, переданный в функцию указатель, изменить нельзя т.к он отличается даже от того что передан(т.е это уже другой указатель содержащий тот-же адрес) . Но, можно менять данные на которые он указывает:
Код:
void swapp( int *p, int *q )
 {
 int temp;
 temp = p[ 0 ];
 p[ 0 ] = q[ 0 ];
 q[ 0 ] = temp;
 }

//equivalent

void swapp(int* p, int* q)
{
    int temp;
    temp = *p;
    *p = *q;
    *q = temp;
}
изменения останутся после выхода из функции, а манипуляции с самим указателем не скажутся на переданной переменной.

ps:
В качестве эксперимента, можно поменять данные в памяти кот-е нахлдятся сразу за областью занятой переменной например wallet1. Проверить что за ней можно так: int *p = &wallet1; теперь *p это wallet1, *++p, это то что за wallet1. Там может быть что угодно(любой технический мусор или какая-нибудь другая переменная). Но может оказаться что памяти больше нету и возникнет ошибка. В современных компах памяти дофига(обычно), а современные операционки используют всю динамическую память. Так что можно "вылазить" за пределы массивов особо не боясь(было-бы зачем).
Код:
void swapp( int *p, int*q )
 {
 int temp;
 temp = p[ 0 ];
 p[ 0 ] = q[ 0 ];
 q[ 0 ] = temp;

 p[ 1 ] = 200; // выход за предел переменной
 }
потом в main смотрим:
Код:
 int *p = &wallet1;

 printf( "%d %d\n", p[ 0 ], p[ 1 ] );
 getch();
350 200

Последний раз редактировалось Nomlpppp; 10.05.2009 в 03:57.
Nomlpppp вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разница между двумя Bitmap Seqular Общие вопросы .NET 2 25.04.2009 17:31
Разница между датами kykysya Общие вопросы Delphi 8 26.03.2009 18:22
Какая разница в css между id и class? Красавчег))) HTML и CSS 6 05.08.2008 14:44
Какая разница между MS Visual и C++ Fanta_Clour Софт 2 09.03.2008 18:33
Разница между датами deenka БД в Delphi 3 31.01.2008 13:21