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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.04.2014, 11:03   #1
Pavlov_yu
Пользователь
 
Регистрация: 22.02.2009
Сообщений: 65
По умолчанию Ссылки & указатели

Доброго времечка, господа. ни как не могу победить разницу в ссылках и указателях. в чем принципиальная разница? и одна и другая ссылаются на значение в памяти переменной, обе позволяют ее изменять....указатель не может, вроде, работать с адресом переменной. зачем их две одинаковые????
Pavlov_yu вне форума Ответить с цитированием
Старый 29.04.2014, 11:10   #2
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,022
По умолчанию

ссылка = защищенный указатель
eval вне форума Ответить с цитированием
Старый 29.04.2014, 11:15   #3
Pavlov_yu
Пользователь
 
Регистрация: 22.02.2009
Сообщений: 65
По умолчанию

Цитата:
Сообщение от eval Посмотреть сообщение
ссылка = защищенный указатель
от кого защищена она? она не защищает значение самой переменной от изменения через нее.
Pavlov_yu вне форума Ответить с цитированием
Старый 29.04.2014, 11:16   #4
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,022
По умолчанию

см. Адресная арифметика
eval вне форума Ответить с цитированием
Старый 29.04.2014, 13:28   #5
Krok27
Форумчанин
 
Аватар для Krok27
 
Регистрация: 08.07.2010
Сообщений: 505
По умолчанию

Яндекс тебе поможет
Знающий не говорит, говорящий не знает (С) Лао Цзы
Krok27 вне форума Ответить с цитированием
Старый 30.04.2014, 00:12   #6
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Pavlov_yu Посмотреть сообщение
Доброго времечка, господа. ни как не могу победить разницу в ссылках и указателях. в чем принципиальная разница?
Ссылку нельзя перенацелить.
Ссылка предполагает работу с реальным объектом, и не должна быть nullptr.

Любое действие над ссылкой - есть действие над оригинальным объектом.

Все эти факторы делают работу с ссылками проще, безопаснее, и интуитивно понятнее, чем с указателями.

Распространенная ошибка новичков:
http://rextester.com/DZZRH5563
Код:
#include <iostream>
#include <iterator>

void Foo(int* a, const size_t n)
{
    delete a;
    a = new int[n];
    std::fill(a,a+n, 66);
    std::cout << "\nchange:\n";
    std::copy( a, a+20, std::ostream_iterator<int> (std::cout, ", ") );
}

int main()
{
    std::cout << "Hello, world!\n";


    std::cout << "before:\n";
    int* a = new int[10];
    std::fill(a,a+10, 33);
    std::copy( a, a+10, std::ostream_iterator<int> (std::cout, ", ") );
    
    Foo(a, 20);
    std::cout << "\nafter:\n";
    std::copy( a, a+20, std::ostream_iterator<int> (std::cout, ", ") );
}
Здесь сначала заполняется массив из 10 чисел 33.
А потом он изменяется внутри функции Foo на массив из 20 чисел 66.

Однако, вывод after в консоль показывает: содержимое массива не изменилось.

На самом деле этот код содержит утечку памяти и потенциальную мину замедленного действия.

Все дело в том, что все аргументы функции копируются.
Внутри функции Foo модифицируется копия указателя, а не оргинал.
Оригинал остается без изменений, и по окончанию функции указывает на невалидные данные.

Последствия - не предсказуемы.

Теперь рассмотрим аналогичный код но и с использованием ссылок:
http://rextester.com/ZBD32753

Теперь в качестве аргумента фигурирует ссылка. А так как все действия над ссылкой есть действие над оригиналом, то модифицируется оригинальный указатель, и поведение программы совпадает с ожидаемым.

А ещё, ссылки на языке с++ не обладают идентичностью.
Это единственный тип данных на языке у которого не существует объекта.
_Bers вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ссылки, указатели, динамическая память, С++ TRIZER Помощь студентам 9 01.08.2013 16:54
указатели и ссылки Trampcher Visual C++ 1 02.06.2013 21:27
указатели и ссылки syrga Общие вопросы C/C++ 10 18.01.2012 06:19
указатели vs ссылки Aistn Общие вопросы C/C++ 9 01.06.2011 23:02
ссылки и указатели. mojohead Помощь студентам 13 14.01.2011 16:00