Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.55/75: Рейтинг темы: голосов - 75, средняя оценка - 4.55
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32

Ссылки vs указатели - в чем разница?

21.11.2015, 20:04. Показов 17053. Ответов 150
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Навеяно соседней темой. Не понимаю в чем разница, хотя несколько раз честно пробовал почитать на эту тему, правда без должного внимания и усердия. Зато программировал на ассемблере и чистом С, понимаю абстракцию "адрес ячейки памяти" и "размер типа в байтах", с арифметикой указателей и указателями на указатели сложностей вроде не испытываю Есть переменная, если она не регистровая - то лежит в какой-то ячейке памяти (или нескольких, зависит от разрядности памяти и структуры типа переменной), адрес этой ячейки (ака указатель) я могу запоминать в другую переменную типа указателя, передавать/возвращать ее из функций, инкрементировать/декрементировать для движения по массиву переменных (если я его предварительно нарезал в той области памяти конечно), разыменовывать и получать/изменять значение. Вроде все. При чем тут термин "ссылки"? А еще оказывается бывают смартпоинтеры, умные указатели и прочие страшные слова
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.11.2015, 20:04
Ответы с готовыми решениями:

Указатели и ссылки: в чем разница
Здравствуйте, объясните, пожалуйста, в чем разница между "ссылается" и "указывает"?

Указатели и ссылки: в чём их разница и сходство?
Я начал учить с++ и не могу кое в чём разобраться. Кто знает ответы на эти вопросы может ответить или скинуть какую нибудь ссылку где это...

в чем разница? массивы и указатели строк
В примере Дейтла ( в документе ) массивы строк инициализируются через указатели, при этом компилятор выдает ошибки. Я же инициализоравал...

150
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
25.11.2015, 18:56
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от zer0mail Посмотреть сообщение
1) Что передается в первом случае? Вижу абсолютно одинаковый ассемблерный код.
Да пофиг на ассемблерный код. Там уже детали реализации. В первом случае передается int*, во втором - int(&)[2]. Мы пишем не на ассемблере, а на языке, в котором есть статическая типизация, со всеми вытекающими.
C++
1
2
void fa(int a[2])          { using T = decltype(a); cout << is_array_v<T> << is_pointer_v<T>;    } // 01
void fr(int (&a)[2])       { using T = remove_reference_t<decltype(a)>; cout << is_array_v<T> << is_pointer_v<T>;    } // 10
Цитата Сообщение от zer0mail Посмотреть сообщение
2) Никаких предупреждений компилятора я не вижу. Вы о чем, собственно?
Так надо бы их включить и смотреть (Clang, GCC).
warning: sizeof on array function parameter will return size of 'int *' instead of 'int [2]' [-Wsizeof-array-argument]
warning: 'sizeof' on array function parameter 'a' will return size of 'int*' [-Wsizeof-array-argument]
0
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
25.11.2015, 19:05
zer0mail, а еще было б интересно взглянуть на одинаковый ассемблерный код, если заменить одну-единственную строчку int A[2]; на int A[3]; в main
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
25.11.2015, 19:41
Цитата Сообщение от zer0mail Посмотреть сообщение
передаче массива передается адрес первого элемента
запись
C++
1
void fa(int a[2]);
аналогична записи
C++
1
void fa(int *a);
насколько я знаю. Оба варианта передают указатель.
А запись:
C++
1
void fr(int(& a)[2]);
это передача массива по ссылке. Тут размер переменной равен размеру типа, как и должно быть.
0
2688 / 2260 / 244
Регистрация: 03.07.2012
Сообщений: 8,231
Записей в блоге: 1
25.11.2015, 20:43
Цитата Сообщение от IGPIGP Посмотреть сообщение
это передача массива по ссылке.
Если добавить fp (int *p) и вызвать ее: fp(a);
то ассеблерный код при вызове функций абсолютно одинаковый во всех трех случаях.
Переданный в стеке параметр - просто адрес начала массива.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
25.11.2015, 20:54
Цитата Сообщение от zer0mail Посмотреть сообщение
то ассеблерный код при вызове функций абсолютно одинаковый во всех трех случаях.
Это может быть в зависимости от реализации, что много там общего. Вопрос же был изначально в том, почему размер такой sizeof() выдаёт? А он же и не виноват. Что ему дали то он и процессит. Вопрос в том что ему дали. И видно же что в одном случае - указатель, а во втором - переменную. Драки не будет.
0
-5 / 14 / 2
Регистрация: 16.03.2014
Сообщений: 78
25.11.2015, 21:50
если читать первоисточник - нету там никаких ссылок как ссылок - есть оператор взятия адреса и оператор обратный ему.
Ссылка - это бредятина переводчиков, которые суют в уши неокрепшего организма "какую то дичь", отчего у организма нестыковки в мозге случаются.
0
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
25.11.2015, 21:53
Цитата Сообщение от fmtuner Посмотреть сообщение
Ссылка - это бредятина переводчиков, которые суют в уши неокрепшего организма "какую то дичь", отчего у организма нестыковки в мозге случаются.
Вы сейчас о C++ говорите?
0
-5 / 14 / 2
Регистрация: 16.03.2014
Сообщений: 78
25.11.2015, 22:10
да(3символа )
0
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
25.11.2015, 22:12
fmtuner, аргументируйте(о каком первоисточнике речь).
2
-5 / 14 / 2
Регистрация: 16.03.2014
Сообщений: 78
25.11.2015, 22:19
http://www.cplusplus.com/doc/tutorial/pointers/
я тут читаю
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
25.11.2015, 22:25
fmtuner, это первоисточник?:rofl:

Добавлено через 29 секунд
fmtuner, почитайте в друмо месте тоже.
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
25.11.2015, 22:31
Цитата Сообщение от fmtuner Посмотреть сообщение
если читать первоисточник
Имхо его надо жадно пить! Организму, - польза. Любому.
Евгений хорошо показал, что например, для встроенных типов, регистровая переменная быстрее чем адрес на неё. Копия переданная через стек вряд ли быстрее. А как быть с массивами, большущими структурами/классами? Понятно, что их легче по адресу передавать. Но интересно что с ними происходит когда какой-то алгоритм проходит по контейнеру. Если в контейнере значения, то объекты создаются, уничтожаются... Особенно плохо если часть объектов уничтожается. Тогда если в контейнере указатели (обычные), потеряется память.
Вот написал жуть. Там всё начинается с массива поэтому никуда не денется. И кроме того элементы не удаляются так как только сортировка используется.
Вначале забавно наблюдать как это всё конструируется, копируется.
Выигрыш во времени от работы с указателями всего в 10 раз. Это наверное потому, что копирование в памяти делается блоками, а сортировка тоже хитро реализована).
Кликните здесь для просмотра всего текста
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include <iostream>
#include <vector>
#include <algorithm>
#include <ctime>
using namespace std;
 
struct A
{
int n;
static bool isExpressed;
static int cnt;
static int del;
static const int N=10000;
double myArray[N];
 
void arrInit()
{
for(int i=0; i<N; i++)
myArray[i]=i;
}
void arrInit(const double *a)
{
for(int i=0; i<N; i++)
myArray[i]=a[i];
}
 
A()
{
cnt++;
n=0;
arrInit();
if(isExpressed) cout<<"A()"<<cnt<<endl;
}
 
A(const int a)
{
cnt++;
n=a;
arrInit();
if(isExpressed)cout<<"A(const int)"<<cnt<<endl;
}
 
A(const A &a)
{
cnt++;
n=a.n;
arrInit(a.myArray);
if(isExpressed)cout<<"A(const A&)"<<cnt<<endl;
}
~A(){
    del++;
    if(isExpressed)cout<<"~A()"<<del<<endl;
}
int operator<(A &rhs)
{
return n<rhs.n;
}
static int compireByPtr(A*lhs, A* rhs)
{
return *lhs<*rhs;
}
};
int A::cnt=0;
int A::del=0;
bool A::isExpressed=true;
int  main(void)
{
    
const int size=1000;
A *arr = new A[size];
srand((unsigned)time(NULL));
for(int i=0;i<size;i++){
    arr[i].n=rand()%(size-1);
}
vector<A> first;
for(int i=0;i<size;i++)first.push_back(arr[i]);
for(int i=0;i<size;i++)cout<<first[i].n<<" ";
cout<<endl;
 
A::isExpressed =false;
 
clock_t tBegFirst=clock();
sort(first.begin(), first.end());
clock_t  tEndFirst=clock ();
clock_t spanF= tEndFirst-tBegFirst;
cout<<"first elapsed "<<spanF<<endl;
 
for(int i=0;i<size;i++)cout<<first[i].n<<" ";
cout<<endl;
 
vector<A*> second;
for(int i=0;i<size;i++)
    second.push_back(&arr[i]);
 
clock_t tBegSecond=clock();
sort(second.begin(), second.end(),A::compireByPtr);
clock_t tEndSecond=clock();
clock_t spanS=tEndSecond-tBegSecond;
cout<<"second elapsed "<<spanS<<endl;
for(int i=0;i<size;i++)cout<<second[i]->n<<" ";
cout<<"\nfirst processing takes "<<(float)spanF/spanS<<" times more time than second"<<endl;
cout << endl;
    system("pause");
    return 0;
}

0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
25.11.2015, 22:36

Не по теме:

Цитата Сообщение от fmtuner Посмотреть сообщение
http://www.cplusplus.com/doc/tutorial/pointers/
я тут читаю
Странно, что ты читаешь про указатели, а не про побитовое "и". Тогда бы точно всех сразил наповал



Добавлено через 50 секунд

Не по теме:

Цитата Сообщение от IGPIGP Посмотреть сообщение
Копия переданная через стек вряд ли быстрее
Копия, переданная через стек, такая же медленная, как и ссылка (которая в реализации станет указателем), переданная через стек

0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
25.11.2015, 22:39
Цитата Сообщение от Evg Посмотреть сообщение
Копия, переданная через стек, такая же медленная, как и ссылка (которая в реализации станет указателем), переданная через стек
Дык... А если речь о экземпляре байт на пару сот, хотя бы. Не уж-то скопировать его в стек легче чем передать по ссылке/указателю?
0
2688 / 2260 / 244
Регистрация: 03.07.2012
Сообщений: 8,231
Записей в блоге: 1
25.11.2015, 23:52
Цитата Сообщение от ct0r Посмотреть сообщение
Так надо бы их включить и смотреть (Clang, GCC).
1. А у меня VS2010
2. Вы сразу дали директиву "читать предупреждения компилятора" без привязки к компилятору и его настройкам (типа все компиляторы должны сообщать).
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
26.11.2015, 09:13
Цитата Сообщение от IGPIGP Посмотреть сообщение
А если речь о экземпляре байт на пару сот, хотя бы
Я всего лишь продемонстрировал на конкретном примере, что живя с идеей "синонимов" и без понимания того, как всё происходит в реальности, эффективную программу не напишешь. Конкретно по части передачи параметров нужно ещё и на архитектуру смотреть. Условно говоря, на intel'е передача структуры размером 16 байт по значению будет не эффективна (будет клонировано значение и передан на него адрес), на sparc64 - эффективна (будет всё на регистрах). Т.е. мой посыл был вовсе не на тему "нужно использовать ссылки, или нет", а на тему "если не хотите быть говнокодером, то учите матчасть"
3
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
26.11.2015, 10:59
Цитата Сообщение от Evg Посмотреть сообщение
Т.е. мой посыл был вовсе не на тему "нужно использовать ссылки, или нет"
Конечно. Пример очень хороший. При передаче типов соответствующего размера ссылка может быть неэффективна. Спора же нет.
Вон _Ivana, вопросов назадавал и где-то в глубине шекспирово "так прямо или косвенно... и как?"
Цитата Сообщение от _Ivana Посмотреть сообщение
При чем тут термин "ссылки"? А еще оказывается бывают смартпоинтеры, умные указатели и прочие страшные слова
Я попытался показать трудности использования обычных указателей в качестве объекта контейнера. Получилось так себе.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
26.11.2015, 11:25
Цитата Сообщение от IGPIGP Посмотреть сообщение
Вон _Ivana, вопросов назадавал
Что поделать. У большинства людей этот вопрос появляется. Если на вопрос "что же такое ссылка" ответ более-менее можно дать по простому, то на ответ "зачем нужна ссылка" ответ дать сложно. После того, как появится реальный опыт программирования, понимание всё равно возникнет, но как объяснить по простому, зачем эту концепцию придумали, то нужно иметь довольно широкие знания, чтобы понять даже простой ответ
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
26.11.2015, 11:31
Цитата Сообщение от Evg Посмотреть сообщение
После того, как появится реальный опыт программирования, понимание всё равно возникнет, но как объяснить по простому, зачем эту концепцию придумали, то нужно иметь довольно широкие знания, чтобы понять даже простой ответ
Согласен. Но _Ivana, достаточно серьёзный товарищ. Мне кажется ему захотелось устроить праздник общения. По моему удачно.
1
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
26.11.2015, 12:23
Цитата Сообщение от fmtuner Посмотреть сообщение
если читать первоисточник - нету там никаких ссылок как ссылок - есть оператор взятия адреса и оператор обратный ему.
fmtuner, да Вы нам всем просто новые горизонты открываете! "Нету никаких ссылок". Ну надо же!
Миниатюры
Ссылки vs указатели - в чем разница?  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.11.2015, 12:23

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

Ссылки и указатели
Добрый день. Возможно было. В чем существенная разница между передачей данных в функцию по ссылке или указателю. В каких случаях вы бы...

Указатели и ссылки [С++]
Всем привет. я тут программу делаю. Цель: определить,принадлежит ли точка заданному промежутку(а точнее лежит внутри или снаружи фигуры)....

Ссылки и указатели
Вот есть код в котором я проверял как ведут себя указатели : using namespace std; int* first() { int p = 5; cout &lt;&lt;...

Ссылки и указатели
Здравствуйте, может кто объяснить в чем будет отличие при передаче в функцию по **, *, *&amp;, &amp;(**), желательно на примерах простых


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

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Новые блоги и статьи
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет) Содержание проекта Симуляция вековой (50 лет) экологической сукцессии в почве леса Основные участники: АМ-гриб, ЭКМ-гриб,. . .
сукцессия 23. Более физиологичная физиология, более экологичная экология, более диффурные диффуры.
anaschu 12.07.2026
Что реально нашли и починили за эти 5 часов Правило Линдемана (КПД конверсии сахара в тело, kEff) — раньше 100% полученного углерода шло прямо в биомассу гриба; теперь только kEff=0. 5 (после. . .
сукцессия 22. От артефактов к физиологии: калибровка агентной модели грибной сукцессии для воспроизведения сезонной динамики и pH-плато
anaschu 11.07.2026
Аннотация В данной работе представлена калибровка агентной модели динамики грибных сообществ (fungal-succession), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru