Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++] Указатели и функции 
V
    Опции темы
DEIN
Дата 4.6.2007, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 22.12.2006
Где: Вильнюс (Литва)

Репутация: нет
Всего: нет



Добрый день!
Вот разбираюсь со ссылками и указателями.

Код

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;

PM MAIL ICQ   Вверх
S.A.G.
Дата 4.6.2007, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1339
Регистрация: 20.7.2006
Где: in ad equate

Репутация: нет
Всего: 19



Ага не, не массивы. smile
Цитата
Ведь нельзя же записать:

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

Это сообщение отредактировал(а) S.A.G. - 4.6.2007, 13:47


--------------------
Вот она задачка: спасти себя от себя самого © Cube
Sometimes good people do evil things © A Simple Plan
PM   Вверх
Sartorius
Дата 4.6.2007, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

Репутация: 8
Всего: 37



S.A.G., эээ... где у него массивы то?

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

Это сообщение отредактировал(а) Sartorius - 4.6.2007, 13:45
PM MAIL ICQ   Вверх
S.A.G.
Дата 4.6.2007, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1339
Регистрация: 20.7.2006
Где: in ad equate

Репутация: нет
Всего: 19



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

Это сообщение отредактировал(а) S.A.G. - 4.6.2007, 13:55


--------------------
Вот она задачка: спасти себя от себя самого © Cube
Sometimes good people do evil things © A Simple Plan
PM   Вверх
Sartorius
Дата 4.6.2007, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

Репутация: 8
Всего: 37



S.A.G., в STL есть множество вариантов swap. Скорее всего ты прав. 
DEIN, какие h-ники используешь?
PM MAIL ICQ   Вверх
S.A.G.
Дата 4.6.2007, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1339
Регистрация: 20.7.2006
Где: in ad equate

Репутация: нет
Всего: 19



DEIN, запусти программу пошагово и посмотри что оно тебя отсылает не на твою функцию. Иначе бы оно не работало. smile


--------------------
Вот она задачка: спасти себя от себя самого © Cube
Sometimes good people do evil things © A Simple Plan
PM   Вверх
Rockie
Дата 4.6.2007, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 13
Всего: 31



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;
}





--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Xenon
Дата 4.6.2007, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 19
Всего: 50



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

Это сообщение отредактировал(а) Xenon - 4.6.2007, 14:10


--------------------
user posted image  
PM MAIL   Вверх
DEIN
Дата 4.6.2007, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 22.12.2006
Где: Вильнюс (Литва)

Репутация: нет
Всего: нет



Спасибо, проблема решена!  smile  smile 

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

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

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

Это сообщение отредактировал(а) DEIN - 4.6.2007, 14:36
PM MAIL ICQ   Вверх
Xenon
Дата 4.6.2007, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 19
Всего: 50



DEIN,  smile и нахожусь в подозрительной близости от тебя smile


--------------------
user posted image  
PM MAIL   Вверх
Ak47black
Дата 10.6.2007, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

Репутация: нет
Всего: 0



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

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

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

Это сообщение отредактировал(а) Ak47black - 10.6.2007, 13:32
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0793 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.