Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
5 / 5 / 6
Регистрация: 17.05.2014
Сообщений: 61

В чем отличие ссылочных переменных от указателей?

06.02.2016, 21:15. Показов 5034. Ответов 54
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет. Вопрос в теме, чем отличаются
C++
1
2
int a=5;
int &p=a;
от
C++
1
2
int a=5;
int *p=&a;
Кроме того, что ссылочная переменная автоматически разыименовывается и различий в доступе к элементам(-> и .)
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.02.2016, 21:15
Ответы с готовыми решениями:

В чем отличие указателей и массивов на примере strlen()?
Здравствуйте уважаемые форумчаче. Появился вот такой вопрос. Почему функция strlen работает в таком случае: const int...

В чем отличие локальных и глобальных переменных в C?
В чем отличие локальных и глобальных переменных в C?

В чём отличие разных способов объявления переменных?
в чем отличие int a(2); от int a=2; И как писать правильней

54
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
08.02.2016, 19:40
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Babysitter Посмотреть сообщение
просто великолепный комментарий в стиле русского коммьюнити
надоело объяснять одно и тоже по десять раз.
на одном только этом форуме несколько раз обсуждалось.

любой желающий мог бы получить информацию.
но вы не желаете ничего знать.


Цитата Сообщение от Babysitter Посмотреть сообщение
давайте забудем, что ссылки так или иначе реализованы через указатели
во-первых, монопенисуальный фактор,
как они там точно реализуются в конкретном компиляторе.

а во-вторых, через указатели компиляторы их реализуют
только в каких то частных случаях, и не более того.

Цитата Сообщение от Babysitter Посмотреть сообщение
например здесь показано что код этих функций
вас должен волновать синтаксис языка, а не оптимизации компилятора.

Цитата Сообщение от Babysitter Посмотреть сообщение
мне в свое время очень помогло такое понимание ссылки и мне бы хотелось, чтобы я узнал его раньше.
иногда приходит время вырастать из деццкого садика.

вы вкурсе, что называя ссылку "указателем с авторазыменовыванием"
путаете причину и следствие?

подумайте о том, чем является результат разыменовывания указателя.

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
так разыменованный указатель иил нет
нет.

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
разименнованый указатель - это адресс.
здрасти, приехали.


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
 
int main()
{
    std::cout << "Hello, world!\n";
    
    std::cout <<"чем является результат разыменовывания указателя?\n";
    
    int* p;
    
    if(  std::is_reference<decltype(*p)>::value )
        std::cout <<"о боже! ссылка!\n";
    
}

если когда нибудь в вашу голову закрадутся крамольные мыслишки,
что якобы ссылка - это указатель с авторазыменованием,
вспомните этот пример,
и тогда он может вам не перепутать причину и следствие.
1
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
08.02.2016, 20:22
Цитата Сообщение от Forrgit Посмотреть сообщение
чем отличаются
Цитата Сообщение от Forrgit Посмотреть сообщение
Кроме того, что ссылочная переменная
Как раз тем и отличаются, что ссылка не является переменной (т.е. объектом, т.е. участком памяти, имеющим имя и тип). Ссылка - это только альтернативное имя переменной, и все операции со ссылкой на самом деле производятся с переменной, на которую она ссылается.
0
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
08.02.2016, 20:32
Цитата Сообщение от Mr.X Посмотреть сообщение
(т.е. объектом, т.е. участком памяти, имеющим имя и тип)
Это смотря с какой монописуальной стороны посмотреть
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
 
struct X
{
    X(int& x):obj(x){}
    int& obj ;
};
 
 
 
struct Y
{
    Y(int& x):obj(x){}
    int obj ;
};
 
 
int main()
{
    int var ;
    X x(var) ;
    Y y(var) ;
    std::cout << sizeof(x) << std::endl ;
    std::cout << sizeof(y) << std::endl ;
}
http://rextester.com/VMWXG67513

P.S. Mr.X, это стёб, так что не нужно отвечать на это сообщение. Начнется холивар
1
 Аватар для Kastaneda
5232 / 3206 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
08.02.2016, 20:34
Цитата Сообщение от Mr.X Посмотреть сообщение
ссылка не является переменной ... т.е. участком памяти
является, без этого работа следующего кода была бы не возможна
C++
1
2
3
void f(MyType &ob) {}
 
f(myObj);
myObj не передается, но физически передается его адрес, который занимает память.
Ссылка может подменятся объектом (еще на уровне семантического анализа), но это уже оптимизация компилятора.
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
08.02.2016, 20:54
Цитата Сообщение от Croessmah Посмотреть сообщение
Это смотря с какой монописуальной стороны посмотреть
Да с какой ни смотри. x.obj хоть память и занимает, но эта память имени не имеет, так как x.obj - это альтернативное имя переменной, на которую эта ссылка ссылается.
Цитата Сообщение от Kastaneda Посмотреть сообщение
myObj не передается, но физически передается его адрес, который занимает память.
Здесь та же песня - не объект, так как эта память не имеет имени.

Добавлено через 4 минуты
Цитата Сообщение от Croessmah Посмотреть сообщение
P.S. Mr.X, это стёб, так что не нужно отвечать на это сообщение. Начнется холивар
Ну почему же обязательно холивар-то? А, кстати, вопрос: может ли в холиваре родиться истина?
0
08.02.2016, 21:00

Не по теме:

Цитата Сообщение от Mr.X Посмотреть сообщение
А, кстати, вопрос: может ли в холиваре родиться истина?
Встречный вопрос: что было раньше - холивар или истина? :D

0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
08.02.2016, 21:08

Не по теме:

Цитата Сообщение от Croessmah Посмотреть сообщение
Встречный вопрос: что было раньше - холивар или истина?
Оо.. Моя тема. Философию я люблю.

0
08.02.2016, 21:32

Не по теме:

Цитата Сообщение от castaway Посмотреть сообщение
Оо.. Моя тема. Философию я люблю.
Ну, я ж говорю, что Страуструп волшебник. Обсуждение любого его элементарного определения тут же выливается в философию.

0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
09.02.2016, 18:40
Цитата Сообщение от Kastaneda Посмотреть сообщение
является, без этого работа следующего кода была бы не возможна
нет, не является.
и этот фактор никак не мешает работе приведенного вами кода.
0
 Аватар для Kastaneda
5232 / 3206 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
09.02.2016, 18:43
Цитата Сообщение от hoggy Посмотреть сообщение
нет, не является.
и этот фактор никак не мешает работе приведенного вами кода.
как передать что-то куда-то не в чем (регистры не в счет)? Как ни крути кусок памяти нужен.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
09.02.2016, 18:47
Цитата Сообщение от Kastaneda Посмотреть сообщение
как передать что-то куда-то не в чем (регистры не в счет)? Как ни крути кусок памяти нужен.
очень просто.
все аргументы функции всегда копируются.
в теле функций присутствуют копии оригиналов.

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

значит все что нужно - что бы внутри функции
фигурировал оригинальный объект.

итого: передача по ссылке не предполагает передачу данных.
такая передача - это лишь способ сообщить компилятору,
что здесь мы хотим работать с объектом,
который существует выше по стеку.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
09.02.2016, 18:54
Цитата Сообщение от hoggy Посмотреть сообщение
все аргументы функции всегда копируются.
Если не рассматривать стандартный подход, то не всегда. Хотя я на самом деле не в курсе что говорит стандарт по этому поводу. Вполне возможно что ничего.
0
 Аватар для Kastaneda
5232 / 3206 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
09.02.2016, 18:54
Цитата Сообщение от hoggy Посмотреть сообщение
но поскольку ссылка - псевдоним оригинала,
значит все действия над ссылкой - есть действия над оригиналом.
значит все что нужно - что бы внутри функции
фигурировал оригинальный объект.
итого: передача по ссылке не предполагает передачу данных.
такая передача - это лишь способ сообщить компилятору,
что здесь мы хотим работать с объектом,
который существует выше по стеку.
Я так думал про ссылки, когда только начал изучать С++, потом, поработав с низким уровнем, я узнал, что нифига это не так. Это нереальная задача для компилятора, поэтому где-то как-то в куске памяти все равно передается адрес объекта.
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
09.02.2016, 18:59
Цитата Сообщение от Kastaneda Посмотреть сообщение
Это нереальная задача для компилятора
он поступает так всегда, когда у него есть такая возможность.
и случаев, когда он может больше, чем когда не может.

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

уровень компилятора - личные трудности самого компилятора.
это никак не влияет на процесс написания исходного кода на языке.
0
 Аватар для Kastaneda
5232 / 3206 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
09.02.2016, 19:04
Цитата Сообщение от hoggy Посмотреть сообщение
уровень компилятора - личные трудности самого компилятора.
это никак не влияет на процесс написания исходного кода на языке.
безусловно, но мы начали со слов ссылка не является куском памяти "Кусок памяти" уже относит нас на низкий уровень, где С++ перестает существовать, есть только память, регистры, и инструкции.
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
09.02.2016, 19:28
Цитата Сообщение от Kastaneda Посмотреть сообщение
но мы начали со слов ссылка не является куском памяти
не начинали.
к тому же, ссылка действительно не является куском памяти.

Цитата Сообщение от Kastaneda Посмотреть сообщение
где С++ перестает существовать, есть только память,
там прекращают существовать и ссылки, и указали, и весь остальной синтаксис языка
0
 Аватар для Kastaneda
5232 / 3206 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
09.02.2016, 19:32
hoggy, we are speaking different languages.
2
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
09.02.2016, 22:14
Цитата Сообщение от hoggy Посмотреть сообщение
он поступает так всегда, когда у него есть такая возможность.
и случаев, когда он может больше, чем когда не может.
Для убедительности бы пример работы компилятора. То что я встречал до сих пор - компилятор абсолютно одинаково обрабатывает ссылки и константные указатели при передаче параметров. Если не включена оптимизация - честно кладет в стек, если включена - может превратить в инлайн вызов.
По теме вопроса - ИМХО, как интерпретировать ссылку - особый вид указателя или псевдоним, расширяющий область видимости - дело личных предпочтений, как и всякая интерпретация и актуализация. Наверное, лучше второе, поскольку проще для нетехнарей.
Вряд ли можно привести пример, где какая-то из этих интерпретаций даст "сбой".
0
 Аватар для SergioO
261 / 209 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
09.02.2016, 22:23
А можно как- то строго дать определения, в стиле алгебраических учений, указателя и ссылки? Типа алфавит, терм, операция ...
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
09.02.2016, 23:29
Цитата Сообщение от gng Посмотреть сообщение
Для убедительности бы пример работы компилятора.
выхлоп компилятора ортогонален синтаксису с++.

Цитата Сообщение от gng Посмотреть сообщение
Вряд ли можно привести пример, где какая-то из этих интерпретаций даст "сбой".
1. у ссылки нет собственного объекта.
как следствие - у неё нельзя взять адрес.
нельзя взять адрес того, что не существует.

2.
поскольку нет объекта, то нет того,
что нельзя, или можно было бы изменить.
поэтому, у ссылок отсуствуют квалификаторы

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
 
template<class T>
void trololo(const T& ref)
{
    std::cout <<" is const? " 
        << std::is_const< decltype(ref)>::value 
            << std::endl;
}
 
int main()
{
    std::cout << "Hello, world!\n";
    const int v =10;
    trololo(v);
}
особенно прикольно это стреляет в шаблонах.
где сама попытка наделить ссылку квалификатором молча игнорируется.

а потом люди начинают задавать веселые вопросы:
(как компилятор мог позволить передать константную ссылку в функцию,
которая ожидает не константную ссылку)

http://rextester.com/JIHJM15370

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <memory>
#include <utility>
#include <functional>
 
template <typename T> 
struct Callable;
 
template <typename R, typename... Args> 
struct Callable <R(Args...)>
{
    virtual R operator()(const Args&...)const = 0;
};
 
template <typename T> 
class Function;
 
template <typename R, typename... Args> 
class Function<R(Args...)>
{
    typedef std::unique_ptr <Callable<R(Args...)>> 
        Ptr;
    
    Ptr ptr;
 
    template <typename T> struct Realisation : Callable<R(Args...)>
    {
        T t;
    public :
 
        // принимает по константной ссылке, хе хе
        R operator()(const Args&... args)const   
       // о обоже! константные данные передаются 
       // по неконстантной ссылке!!!!! КАРАУЛ!!!!!! 
            { return t(args...); }    
 
        Realisation () {}
        Realisation(T&& at) : t(std::move(at)) {}
    };
 
public :
    template <typename... Args1> 
    R operator()(Args1&&... args)const
        { return ptr->operator () (std::forward<Args1>(args)...); }
 
    Function(){}
    template <typename T>Function (T&& t): 
        ptr(std::make_unique<Realisation<T>>(std::move(t)))
    {}
};
 
int main()
{    
    Function<void(const char*)> f1 
        = [] (const char* a) { printf("%s\n", a); };
    
    f1("Hello, world!");
    
   // принимает мутабельную ссылку
    Function<void(int&)> f2 
        = [] (int& i) { ++i; };   
    
    int i = 5;
    f2(i);
    
    printf("int %d", i);
}
3.
поскольку ссылка - альтернативное имя объекта,
то все действия над ссылкой - есть действия над объектом,
на который она ссылается.

именно так, и никак иначе,
программист должен её воспринимать.

что бы не тупил:

http://rextester.com/YRZKE77500

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
 
struct example
{
    
    example(  int (&src)[256]  )
        :arr(src)
    {
        if(  sizeof(*this)< sizeof(arr) )
            std::cout<<"о боже! но как же так!\n"
                "размер всего класса меньше,\n"
                "чем размер отдельного его члена\n";
    }
    
    int (&arr)[256];
};
 
 
 
int main()
{
    std::cout << "Hello, world!\n";
    
    
    int a[256];
    
    example ex(a);
}
4.
результат разыменовывания указателя - есть ссылка.
этого одно достаточно, что бы понимать:
сама ссылка при этом уже указателем быть не может.
иначе возникает противоречие здравому смыслу.


---------------

можно ещё что нибудь придумать.

но мне честно говоря уже надоела эта заезженная тема.
одно и тоже приходится рассказывать.

ссылка - особый тип данных в языке,
со своими особенностями и умениями.
они подчиняются особым правилам.
это - главное, что нужно знать и понимать.

путают(отожествляют) жеж с указателями их только те ребята,
которые этих правил тупо не знают.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.02.2016, 23:29

Чем отличается передача в процедуру переменных от передачи указателей?
В загаловке вопрос глупо звучит,хотел спросить, как в процедуре обрабатывать не значение, переданное в аргументах, а именно существующий...

Передача в методы переменных ссылочных типов
Есть класс: class Sample { int i; public Sample(int x) { i = x; } ...

В чем отличие двумерного массива типа char от массива указателей на char?
В чем отличие двумерного массива типа char и массива указателей на char ?

Отличие инкриментов указателей
Чем отличатеся ++*p от (*p)++ и от *p++ вроде увеличивается значение а не адлрес указателя.....

Отличие приведение типов указателей
Чем отличаются при Base* a_ptr = new Derivered(); следующие строки: A) auto ptr = static_cast&lt;Derived*&gt;( a_ptr ); B) auto ptr =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru