Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C++] Указатели и функции


Автор: DEIN 4.6.2007, 13:02
Добрый день!
Вот разбираюсь со ссылками и указателями.

Код

void swap (int*, int*);

int main(int argc, char* argv[])
{
    int X(5), Y(20);

    cout<<"X: "<<X<<"\t&X: "<<&X<<endl;
    cout<<"Y: "<<Y<<"\t&Y: "<<&Y<<endl<<endl;

    swap(X, Y); //ПОЧЕМУ РАБОТАЕТ?

    cout<<"X: "<<X<<"\t&X: "<<&X<<endl;
    cout<<"Y: "<<Y<<"\t&Y: "<<&Y<<endl<<endl;

    char a;
    cin>>a;
    return 0;
}

void swap (int* pX, int* pY)
{
    int temp;

    temp = *pX;
    *pX = *pY;
    *pY = temp;
}


Меня интерисует строка номер 10.
Как видно из определения функции, функция swap должно принимать параметры в виде указателей на тип int, т.е. насколько я понял, должны создаваться локальные указатели функции swap и иницилизироваться адресами переменных Y и X. Иными словами должен быть такой код в 10-ой строке: swap(&X, &Y);. Этот способ срабатывает великолепно (и это понятно), как и великолепно срабатывает способ в преведенном выше коде (swap(X, Y);). Но я не могу понять почему! Ведь нельзя же записать:
Код

int B = 56;
int* pB = B;

Автор: S.A.G. 4.6.2007, 13:39
Ага не, не массивы. smile
Цитата
Ведь нельзя же записать:

Да, нельзя. Указатель можно инициализировать только адресом а не значением.

Автор: Sartorius 4.6.2007, 13:40
S.A.G., эээ... где у него массивы то?

DEIN, что за компилятор? По идее ругаться он должен, но видно слишком умный и сам правильно приводит к указателям.

Автор: S.A.G. 4.6.2007, 13:49
Мне кажется, DEIN создал еще одну версию функции swap которая принимает указатели. Если он в качестве параметров задает int то вызывается "встроенная" функция.

Автор: Sartorius 4.6.2007, 13:53
S.A.G., в STL есть множество вариантов swap. Скорее всего ты прав. 
DEIN, какие h-ники используешь?

Автор: S.A.G. 4.6.2007, 14:05
DEIN, запусти программу пошагово и посмотри что оно тебя отсылает не на твою функцию. Иначе бы оно не работало. smile

Автор: Rockie 4.6.2007, 14:07
DEIN, это работает не твоя функция, а swap из std.
Код
#include <iostream>

using namespace std;


//void swap (int*, int*);


//void swap (int* pX, int* pY)
//{
      //если убрать комментарии, то этих сообщений все равно не будет, 
      // так как нет захода в функцию
//    cout<<"pX: "<<pX<<"\t&X: "<<&pX<<endl;
//    cout<<"pY: "<<pY<<"\t&Y: "<<&pY<<endl<<endl;
//
//
//    int temp;
//
//    temp = *pX;
//    *pX = *pY;
//    *pY = temp;
//
//}

int main(int argc, char* argv[])
{
    int X(5), Y(20);

    cout<<"X: "<<X<<"\t&X: "<<&X<<endl;
    cout<<"Y: "<<Y<<"\t&Y: "<<&Y<<endl<<endl;

    swap(X, Y); //ПОЧЕМУ РАБОТАЕТ?

    cout<<"X: "<<X<<"\t&X: "<<&X<<endl;
    cout<<"Y: "<<Y<<"\t&Y: "<<&Y<<endl<<endl;

    char a;
    cin>>a;

    return 0;
}



Автор: Xenon 4.6.2007, 14:08
Ну естественно работает только потому, что вызывается стандартная std::swap(T obj, Tobj2);
Очередной урок - не используйте using директивы где попало smile лучше всегда выбирать using объявления

Автор: DEIN 4.6.2007, 14:29
Спасибо, проблема решена!  smile  smile 

Просто в учебнике как пример функция была названа swap, ну а я поленился свое название придумывать (:

П.с.: Блин жалко 100 постов нету, так бы всем кто помог плюсики поставил...

Оффтоп: Xenon, ты зарегился на форуме в день моего рождения! лол! smile 

Автор: Xenon 4.6.2007, 14:43
DEIN,  smile и нахожусь в подозрительной близости от тебя smile

Автор: Ak47black 10.6.2007, 13:03
Xenon,  smile ну ты из Замайкяй вроде-ж  smile 
Dein, тебе надо вообще осторожно относиться к именам и стараться не называть функции или переменные на подобии Rectangle и т.д. при использовании модулей, библиотек тоесть эти файлы которые через #include идут, так как в них могут быть такие-же функции и переменные в результате может возникнуть нестыковка изза того что например функция и переменная названа одинаково.
Компилятор не знает заранее что там функция или переменная будет и берет наиболее подходящий по какимто критериям ему тип.
А вообще что-бы тебе понять какой код он использовает там, то поставь бряк на эту функцию (breakpoint) и посмотри куда он прыгнет во время выполнения.
Что-бы проверить когда кодишь, можешь сделать так - зажми Ctrl нажми на название функции и попадешь на начало её. (если у тебя в коде нету ошибок иногда это нельзя сделать и только для Borland builder у тя он вроде)
Цитата

Просто в учебнике как пример функция была названа swap,

Ну и офигеный учебник с ошибками.  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)