Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.51/88: Рейтинг темы: голосов - 88, средняя оценка - 4.51
4 / 4 / 0
Регистрация: 04.07.2013
Сообщений: 27

Ссылки и указатели: зачем все это?

21.04.2017, 19:09. Показов 17473. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте форумчане. Кому не лень, могли бы мне доступно объяснить, для чего в С++ все так усложнять? Я про указатели, ссылки, взятие по адресу, разыменование, ссылка на ссылку, ссылка на константный указатель, указатель на указатель через указатель по ссылке... и тд.
Я выучил ужасный синтаксис всего этого, и могу использовать, но я не пойму на кой это все надо. Почему просто не обращаться к переменной? Ладно, под ссыль не выделяется память, но под указатель выделяется. Для чего плодить все эти сущности, постоянно выделяя память, по сути одному и тому же значению? Может есть какой нить пример, который докажет мне что без всего этого не обойтись? Или это просто философия языка?
Искренне хотелось бы понять...
Спасибо.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.04.2017, 19:09
Ответы с готовыми решениями:

Зачем нужны все эти указатели (или не указатели)
Зачем надо DWORD, HANDLE, LPVOID?

сегодня наконец то понял что такое КЛАСС, и ОБЪЕКТ. понято всё, кроме одного - зачем всё это? в смысле, можно же без этого? так зачем жизнь усложнять?
сегодня наконец то понял что такое КЛАСС, и ОБЪЕКТ. понято всё, кроме одного - зачем всё это? в смысле, можно же без этого? так зачем жизнь...

Зачем биты нужны это меньше байтов но int 32 бита но я не допер зачем это нужно это 4 байта то есть int не может больше 4 байт весить?
Вот еще один вопрос зачем биты нужны это меньше байтов но int 32 бита но я не допер зачем это нужно это 4 байта то есть int не может...

21
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
21.04.2017, 19:19
Цитата Сообщение от Qazz Посмотреть сообщение
Может есть какой нить пример, который докажет мне что без всего этого не обойтись?
Может ты пример приведёшь, в котором, по-твоему, всё усложненно.
0
Эксперт С++
1624 / 954 / 782
Регистрация: 06.02.2016
Сообщений: 2,452
Записей в блоге: 31
21.04.2017, 19:21
Как и в любой сложной конструкции, язык состоит из простых вещей, а уже их объедение и наложение вызывает чувство "сложности"
0
12 / 12 / 8
Регистрация: 19.02.2017
Сообщений: 44
21.04.2017, 19:33
Привет!
На самом деле все эти "сложности" сделаны не просто так.
Попробуй немного изменить взгляд на вещи. Смотри на это не как на "усложнения", а как на инструменты.

Вот маленький пример.
Допустим я создал какую-то функцию
C++
1
2
3
void function(int a)
{
}
Если значения, которые я передал в функцию из
C++
1
main
меняются, то в самой main они меняться не будут. Пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
void function(int a)
{
    a = a*a;
}
 
int main()
{
    int c = 3;
    function(c);
    std::cout << c;
    return 0;
}
На экран выведется та-же 3-ка, а не её квадрат. Хотя я по идее хотел, чтобы 3-ка возвелась в квадрат.
Конечно для этого можно было бы функцию, которая возвращает значение ( int function(int a) ) и всё бы работало.
Но если этих значений 2? Или 10-ть? Что делать? Функция может вернуть только 1 значение.
Тут вступают в бой ссылки, или указатели. Мощный инструмент, который по вашему был усложнением языка.

Если я передам в функцию значение по ссылке, то эти значения будут меняться и в функции.
C++
1
2
3
4
5
6
void function(int &a, int &b, int &c)
{ 
    a =1;
    b = 2;
    c = 3;
}
Все эти значения изменятся. Просто чудесно.


Ладно, допустим ссылки еще ничего. Но зачем эти злые указатели?
Представьте такую задачу.
Вас просят создать функцию, которая ищет максимальное значение в массиве.
Что делать?
Если передать указатель на начальный элемент массива в функцию, то, перемещая этот указатель можно "пройтись" по всем элементам массива, и благополучно найти максимальный элемент.

Я описал только базовые вещи. Которые на самом то деле в полной мере не отображают мощь и полезность ссылок и указателей.
4
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
21.04.2017, 21:12
Цитата Сообщение от Qazz Посмотреть сообщение
философия языка?
философский вопрос предполагает философский ответ.

итак... кафедра. экзамен по философии.
всем студентам раздали задание.
у всех одно и тоже.
все задание из одного единственного вопроса:
ПОЧЕМУ?

экзамен сдал один единственный студент.
его ответ был:

ПОЧЕМУ БЫ И НЕТ?
3
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
21.04.2017, 21:22
Qazz, Чем острее скальпель, тем точнее вырез, и тем больше шансов порезаться.
0
21.04.2017, 21:24

Не по теме:

_stanislav, между прочим шанс порезаться меньше. как бы ни казалось.

0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
21.04.2017, 22:12
Вы ещё до полиморфизма не дошли. Когда дойдёте, вернитесь в эту тему.
Кроме полиморфизма ещё есть всякие причины, но полиморфизм, полагаю, достаточно красноречив.

Ну а пока о злых указателях замолвю словечко:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
 
void foo1(){    std::cout << "foo1\n";  }
void foo2(){    std::cout << "foo2\n";  }
 
int main()
{
    void (*pf1)() = &foo1;
    void (*pf2)() = &foo2;
 
    void (*arr_func[2])() = {pf1,pf2}; //массив функций
 
    for (int i=0; i<2;i++)   arr_func[i]();
}
Списки, стеки, очереди, деревья ещё в помощь.
1
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
21.04.2017, 22:19
daslex, мне кажется что указатели это самый мощный инструмент С++.
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
21.04.2017, 23:21
Цитата Сообщение от Qazz Посмотреть сообщение
Кому не лень,
Опасаясь навлечь гнев обитателей этого раздела, все-таки положу и свои 5 копеек на алтарь вашего познания.
С++ произошел от чистого Си. И в чистом Си никаких ссылок нет. Есть только указатели. Но создатели С++ хотели сделать поудобнее и попонятнее. Что-то для кого-то получилось, а что-то для кого-то и не очень. Конечно, объяснять студенту, что функция
C
1
swap0(int a, int b) { int t = a; a = b; b = t; }
не производит вообще никакой работы, затруднительно. Поэтому отцы-разработчики пошли студенту навстречу, и предложили
C++
1
swap1(int &a, int &b) { int t = a; a = b; b = t; }
В самом деле эта функция абсолютно эквивалентна
C
1
swap2(int *pa, int *pb) { int t = *pa; *pa = *pb; *pb = t; }
Только обращения к ним разные.
C++
1
2
3
int a, b;
swap2(&a, &b);
swap1(a, b);  // Пляши, студент!
Есть глубокое подозрение, что и реализация этих функций-обращений совершенно идентична.
Стоит это осознать, и жизнь потихонечку начинает налаживаться...

Добавлено через 10 минут
Цитата Сообщение от Qazz Посмотреть сообщение
ссылка на константный указатель,
А вот все эти константные указатели на константы придумали добрые дяди и тети, чтобы уберечь нас от самих себя. Мы же - дети неразумные! И чтоб мы меньше могли набедокурить, подвесили нас за эти помочи. Это особо не спасает, язык позволяет бедокурить ни на что не взирая. Ибо первоначальный Си был создан для взрослых людей, которые отвечают сами за себя. Программистами (великими!) - для нас - просто программистов.
2
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
22.04.2017, 06:15
Цитата Сообщение от Qazz Посмотреть сообщение
ссылка на ссылку
такого в с++ нет.
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
22.04.2017, 06:54
Цитата Сообщение от Байт Посмотреть сообщение
не производит вообще никакой работы
не производит полезной работы ты хотел сказать?
0
Велосипедист...
 Аватар для Mournful Max
353 / 220 / 73
Регистрация: 15.12.2015
Сообщений: 785
22.04.2017, 07:08
_stanislav, я думаю, для the студента это не так важно) Для него она просто нерабочая
0
12 / 13 / 2
Регистрация: 11.01.2015
Сообщений: 208
Записей в блоге: 15
22.04.2017, 07:27
Qazz, для экономии ОЗУ, быстроты вычислений и т.д.
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
22.04.2017, 09:16
Цитата Сообщение от _stanislav Посмотреть сообщение
не производит полезной работы ты хотел сказать?
gcc с опцией -O3 превращает эту функцию в
Assembler
1
2
swap0(int, int):
        rep ret
если возврат из функции не считать за работу,
то она вообще ничего не делает.
А в силу того, что она ничего не делает, то gcc,
скорее всего выпилит все её вызовы, ибо бесполезны.
Так что, скорее всего, она и правда ничего не делает.
2
4 / 4 / 0
Регистрация: 04.07.2013
Сообщений: 27
23.04.2017, 11:14  [ТС]
Цитата Сообщение от GbaLog- Посмотреть сообщение
такого в с++ нет.
это я образно выразился...

Добавлено через 2 минуты
Цитата Сообщение от wireZ Посмотреть сообщение
Qazz, для экономии ОЗУ, быстроты вычислений и т.д.
как же экономия, если под переменную выделяется, и еще под указатель выделяется?
0
440 / 432 / 159
Регистрация: 21.05.2016
Сообщений: 1,338
23.04.2017, 11:19
Цитата Сообщение от Qazz Посмотреть сообщение
как же экономия, если под переменную выделяется, и еще под указатель выделяется?
что экономнее, передать копию массива в функцию или указатель на массив?
1
4 / 4 / 0
Регистрация: 04.07.2013
Сообщений: 27
23.04.2017, 11:22  [ТС]
Цитата Сообщение от oldnewyear Посмотреть сообщение
что экономнее, передать копию массива в функцию или указатель на массив?
ну, наверное если иметь дело с массивами, то возможно тут Вы правы...
0
440 / 432 / 159
Регистрация: 21.05.2016
Сообщений: 1,338
23.04.2017, 11:25
Цитата Сообщение от Qazz Посмотреть сообщение
ну, наверное если иметь дело с массивами, то возможно тут Вы правы...
не только массивы, любая структура данных
0
4 / 4 / 0
Регистрация: 04.07.2013
Сообщений: 27
23.04.2017, 11:30  [ТС]
Цитата Сообщение от oldnewyear Посмотреть сообщение
не только массивы, любая структура данных
т.е. передача в функцию указателя на переменную, быстрее выведет значение на консоль, чем передача переменной в эту же фу-ию..?
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.04.2017, 11:30
Помогаю со студенческими работами здесь

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

Указатели на слонов или А зачем нужны указатели?
Знаю что таких вопросов было уйма, но я так и не нашел ответа на свой вопрос. Для чего нужны указатели? Что такое указатели я знаю, это...

Зачем нужны контейнеры stack, queue, list, если это всё можно заменить вектором?
В чём их преимущество? Оптимизация?

Зачем нужны rvalue ссылки, если есть универсальные ссылки
Читаю книгу Скотта Мэйерса... Что-то я совсем запутался с этими rvalue ссылками. Я не пойму, зачем нужны rvalue ссылки, если есть...

Зачем нужно освобождать память динамических объектов в деструкторе, если всё равно это сделает менеджер памяти
Не скажу за все ОС-и, но под Windows есть менеджер памяти. Когда по ходу кода встречается new, ну или что - то другое для алокации...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru