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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.05.2009, 19:16   #1
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию разница между указателями и ссылками

Кто-нибудь может объяснить разницу между указаелями и ссылками???
разница между ссылками и переменными очевидна.
вот код, в котором сравниваются : указатели, ссылки и переменые (передачи по значению):
Код:
include <iostream.h>
void swapr(int& a, int& b); //a,b - псевдонимы переменных типа int
void swapp(int* p, int* q);//p,q - адреса переменных типа int
void swapv(int a, int b);//a,b - новые переменные
int main()
{
int wallet1=300;
int wallet2=350;
cout<<"wallet1 = $"<<wallet1;
cout<<" wallet2= $"<<wallet2<<"\n";
cout<<"Using references to swap contents:\n";
swapr(wallet1, wallet2);  //передача перемнных
cout<<"wallet1 = $"<<wallet1;
cout<<" wallet2= $"<<wallet2<<"\n";
swapp(&wallet1,&wallet2);    //передача адресов переменных
cout<<"wallet1 = $"<<wallet1;
cout<<" wallet2= $"<<wallet2<<"\n";
swapv(wallet1, wallet2);   //передача значений переменных
cout<<"wallet1 = $"<<wallet1;
cout<<" wallet2= $"<<wallet2<<"\n";
cin.get();}

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 swapv(int a, int b)
{
int temp;
temp=a;
a=b;
b=temp;
}
Dimarik вне форума Ответить с цитированием
Старый 09.05.2009, 19:30   #2
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Указатель может быть равен 0, а ссылка не может ссылаться на объект по адресу 0.
Ссылка - это практически псевдоним переменной (или константы). Ее нельзя переназначить.
Пример:
Код:
int k=10;
int ssylka = &k;
int newK = 20;
ssylka = newK; // присваиваем переменной k значение переменной newK
Ссылки удобны при перегрузке операторов. С помощью указателей код будет выглядеть более громоздко и неудобно.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 09.05.2009, 20:11   #3
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

а указатель можно переназначить??? если можно, приведите пример...
и как понять: "Указатель может быть равен 0, а ссылка нет"?
Dimarik вне форума Ответить с цитированием
Старый 09.05.2009, 20:16   #4
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
а указатель можно переназначить??? если можно, приведите пример...
Код:
int a=5;
int b=100;
int *p;  // указатель

p = &a; // теперь p указывает на a
cout<<*p<<endl;
p = &b;
cout<<*p<<endl;
Выведет сначала значение переменной a, а потом значение b.

Цитата:
и как понять: "Указатель может быть равен 0, а ссылка нет"?
Если указатель равен нулю, то это значит, что объект, на который он указывает, не существует.
Ссылка же не может ссылаться на несуществующий объект )
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 09.05.2009, 21:21   #5
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

а почему функции возвращают разные значения?
Код:
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;
}

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

Цитата:
а почему функции возвращают разные значения?
Начнем с того, что эти функции вообще ничего не возвращают. Они обменивают значения своих аргументов. Притом работают одинаково.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

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

Цитата:
Сообщение от Sazary Посмотреть сообщение
Начнем с того, что эти функции вообще ничего не возвращают. Они обменивают значения своих аргументов. Притом работают одинаково.
Они вот так работают:
Код:
#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 x = 5;
    int y = 10;

    cout << "Starting..." << endl;
    printAll(x, y);

    cout << endl << "swapr" << endl;
    swapr(x, y);
    printAll(x, y);

    cout << endl << "swapp" << endl;
    swapp(&x, &y);
    printAll(x, y);

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

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

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

Process returned 0 (0x0)   execution time : 0.016 s
Press any key to continue.
atomicxp вне форума Ответить с цитированием
Старый 09.05.2009, 22:57   #8
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

я про это и говорю!
a = 5;
b = 10;
а во втором
swapr
a = 10;
b = 5;
Dimarik вне форума Ответить с цитированием
Старый 09.05.2009, 23:00   #9
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

так первый раз поменяли местами и потом опять эти же измененные местами значения опять поменяли)
pu4koff вне форума Ответить с цитированием
Старый 09.05.2009, 23:00   #10
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Сообщение от Dimarik
я про это и говорю!
a = 5;
b = 10;
а во втором
swapr
a = 10;
b = 5;
Так а что вам не нравится?
Сначала обмениваем одной функцией. Потом обмениваем еще раз.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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