Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/30: Рейтинг темы: голосов - 30, средняя оценка - 4.67
 Аватар для Super-Hacker
342 / 114 / 37
Регистрация: 26.11.2019
Сообщений: 735

Указатели - отстойные ссылки?

18.06.2021, 17:10. Показов 6220. Ответов 62

Студворк — интернет-сервис помощи студентам
Прямое наследие С - это тонна методов из <stdlib.h> в стиле

C++
1
foo(args..., int* result)
Я сейчас не про замену ООП, ой, процедурное программирование, которая выглядит вот так

Rust
1
2
3
4
5
6
7
8
9
10
struct Rectangle {
    width: u32,
    height: u32,
}
 
impl Rectangle {
    fn area(&self) -> u32 {
        self.width * self.height
    }
}
C
1
2
3
4
5
6
7
8
struct Rectangle {
    int width,
    int height,
}
 
int area(Rectangle* rectangle) {
    rectangle->width * rectangle->height
}
Это была вынужденная мера, так как указатель единственный мог передать не копию структуры, так ещё и сохранить доступ ко всем её полям

В общем 83 давно за горами, СтраусТруп всё ещё жив, появились ссылки, которые избавили б людей от всего такого безумия.
А люди до сих пор посылают указатели вместо ссылок, считают, что указатель - это динамический массив, ну и конечно считают умные указатели высшим разумом

Ну так вот
Есть ли профит от указателей в 2к21. Я не про какие-то однострочные сравнения адресов или что-то подобное.
Есть ли в 2к21 вообще профит от функции, где хоть один аргумент может быть указателем?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.06.2021, 17:10
Ответы с готовыми решениями:

Ссылки vs Указатели
Почему ссылки считаются более хорошим средством, чем указатели? Ведь если человек будет использовать сторонние классы, он может не...

Указатели и ссылки
а если написать return this тогда что вернется? и как определить? П.5.18.Правил Запрещено размещать задания и решения в виде картинок...

Указатели и Ссылки
извеняюсь,но никак не могу понять. int sum(int* inLeft, int* inRight) { if(inLeft == inRight) return *inLeft; ...

62
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
19.06.2021, 00:45
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от avgoor Посмотреть сообщение
ТС не понял разницу между ссылкой и указателем, но в каком-то священном писании прочел
про писание - это ты сам придумал?
в данной теме нет никаких намёков ни на какие писания.

тогда уж напротив:
скорее уж тогда он как раз таки не читает писаний.
потому что у ребят, которые читают литературу,
подобных вопросов обычно не возникает.
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
19.06.2021, 01:27
Цитата Сообщение от hoggy Посмотреть сообщение
про писание - это ты сам придумал?
Конечно, я сам придумал. ТС, наверное, ни одной книжки не прочел. А кодить ему голоса в голове помогают.
Конкретную цитату в конкретной книжке для новичков я, конечно, не приведу. Но догадываюсь, что вопрос ТС мог возникнуть после прочтения книжки, в которой есть рекомендация по поводу использования ссылок, умных указателей итп. Но хорошо не объясняется, что же такое, собственно, ссылки и указатели. Иначе подобного вопроса не возникло бы.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
19.06.2021, 02:23
Цитата Сообщение от avgoor Посмотреть сообщение
Конкретную цитату в конкретной книжке для новичков я, конечно, не приведу. Но догадываюсь
ок.
пока ты тут гадаешь,
я пойду своими делами дальше занимаццо.
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
19.06.2021, 02:27
Цитата Сообщение от hoggy Посмотреть сообщение
я пойду своими делами дальше занимаццо.
Слив защитан.
0
 Аватар для Super-Hacker
342 / 114 / 37
Регистрация: 26.11.2019
Сообщений: 735
19.06.2021, 09:34  [ТС]
Цитата Сообщение от XLAT Посмотреть сообщение
видим, что и ссылки то есть, но одними ими, ну, никак не обойдёшься ...
Отвечу этим ответом сразу на всё.
ТС - не тролер.

Тут конечно тоже непонятно, чем автору ссылки не угодили в данном примере.

Ну и как вы наверное не поняли ещё с первых моих сообщений. Я не спрашивал, можно ли отказаться от указателей.
Я спрашивал есть ли реальный профит от вызова фронте-ендовских функций (тех, что для юзеров апи) с указателями в качестве аргументов.

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

Как по мне, указатели - не лучшее, что есть для прямого использования в функциях без серьёзной на то надобности
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
19.06.2021, 14:48
Цитата Сообщение от Super-Hacker Посмотреть сообщение
Я спрашивал есть ли реальный профит
а ты, стало быть, допускаешь мысль, что профита может и не быть?
думаешь, что люди их используют себе в убыток?

Цитата Сообщение от Super-Hacker Посмотреть сообщение
Как по мне, указатели - не лучшее, что есть
и что же именно есть более лучшего?
0
 Аватар для Super-Hacker
342 / 114 / 37
Регистрация: 26.11.2019
Сообщений: 735
19.06.2021, 15:06  [ТС]
Я не это имел в виду. Я просто не могу понять, как можно это не понять
Почему у std::swap
Такая сигнатура например
C++
1
swap(_Tp& __a, _Tp& __b)
а не такая
C++
1
swap(_Tp* __a, _Tp* __b)
Просто по вашим словам - без указателей жить нельзя. А я хочу сказать, что наоборот очень даже можно.
Единственная ситуация, где я мог бы представить реальное отправление указателя в функцию - делегаты. Потому что там как раз нужно сохранять объект даже после выхода из зоны видимости. И там его прямо реально нужно как указатель создавать.
Ну то есть когда во что-то нужно вкинуть ссылку на объект, который не диспоснется

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

Цитата Сообщение от hoggy Посмотреть сообщение
а ты, стало быть, допускаешь мысль, что профита может и не быть?
Это если что - вопрос моего поста. Я хотел бы узнать мнение о том, почему всё же есть необходимость в функциях, которые принимают указатели

Цитата Сообщение от hoggy Посмотреть сообщение
думаешь, что люди их используют себе в убыток?
Да, я видел кучу кодов, где можно было бы от них избавиться. Вот и я подумал, может быть люди не знают, где амперсант на клавиатуре

Цитата Сообщение от hoggy Посмотреть сообщение
и что же именно есть более лучшего?
В действительности же, можно заменить много кода на аналогичный код, но использующий ссылочки
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
19.06.2021, 15:18
Лучший ответ Сообщение было отмечено Super-Hacker как решение

Решение

Super-Hacker, есть три главные причины
1) Стилистика. Есть подходы к стилю, когда указатели используются специально там, где нужно подчеркнуть, что передаваемый объект может измениться.
С технической точки зрения здесь действительно можно изменить указатели на ссылки, но этого не делают намеренно, потому что большая часть кодовой базы уже написана/у технических лидеров проекта непреклонный взгляд на это.

2) Необходимость поддерживать двоичную соместимость. Есть код, который в целом мог бы использовать ссылки, но не делает этого, потому что это приведет к потере бинарной совместимости. Речь о всяких API DLL и т.д. Сейчас, если нужно написать DLL, которую потом можно было бы использовать, например, из C#, то без указателей это сделать не получится. На С++-сные ссылки нет стандартного ABI, в отличие от указателей.

3) Техническая необходимость. В соответствии с тем, что делает код, нам реально нужно передавать именно указатель и ничто другое. Ну например мы пишем смартпойтнер. Указатель нужно передать в его конструктор, иначе мы просто не решим задачу.

В остальных случаях, разумеется, лучше использовать ссылки.
2
 Аватар для Super-Hacker
342 / 114 / 37
Регистрация: 26.11.2019
Сообщений: 735
19.06.2021, 15:21  [ТС]
Спасибо. Очень понятно
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
19.06.2021, 15:21
Цитата Сообщение от Super-Hacker Посмотреть сообщение
Почему у std::swap
ты ж не спрашиваешь, почему у машин колеса круглые,
а не квадратные.

Цитата Сообщение от Super-Hacker Посмотреть сообщение
А я хочу сказать, что наоборот очень даже можно.
Указатели - отстойные ссылки?

Цитата Сообщение от Super-Hacker Посмотреть сообщение
Это если что - вопрос моего поста. Я хотел бы узнать мнение о том, почему всё же есть необходимость в функциях, которые принимают указатели
необходимость может быть продиктованна самыми разными факторами.
например:
- требование, что бы API было совместимо с языком си.
- поддержика опциональных параметров функции.
и тп.

Цитата Сообщение от Super-Hacker Посмотреть сообщение
Да, я видел кучу кодов, где можно было бы от них избавиться. Вот и я подумал, может быть люди не знают, где амперсант на клавиатуре
я тоже видел множество такого кода.
только это уже совсем другая тема.

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

далеко ходить не нужно, взять твой же собственный вопрос:
Цитата Сообщение от Super-Hacker Посмотреть сообщение
Почему у std::swap
раз ты задал такой вопрос, значит тебе не очевидно,
в каких случаях уместно использовать указатели,
а в каких - ссылки.
0
 Аватар для Super-Hacker
342 / 114 / 37
Регистрация: 26.11.2019
Сообщений: 735
19.06.2021, 15:42  [ТС]
Цитата Сообщение от hoggy Посмотреть сообщение
Указатели - отстойные ссылки?
Хоть я и получил ответ на вопрос. Всё же отвечу вам.
Вы видимо единственный, кто ещё не понял. Я не говорил, что указатели - отстой
Я же сказал ФУНКЦИИ ДЛЯ НЕПОСРЕДСТВЕННОГО ИСПОЛЬЗОВАНИЯ ДЛЯ ДАЛЬНЕЙШЕЙ РАЗРАБОТКИ поэтому и привёл в пример функции из std::.
Я потому и спросил, почему там ссылки, раз указатели имеют ряд преимуществ

Не по теме:


Кстати, не по теме, но может есть у кого-нибудь что-то знакомое из стд, что ряльно принимает указатель
( - я не про конструкторы смарт поинтеров )
( - не про алгоритмы с итераторами)
( - не про конст чар поинтер)



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

Кстати, я так и не понял тот пример Указатели - отстойные ссылки?

В чём там необходимость от свапа через указатели и обёртку над свапом?
0
Гвоздь Задиров
 Аватар для Folian
1718 / 1117 / 337
Регистрация: 25.01.2019
Сообщений: 2,940
19.06.2021, 15:55
Цитата Сообщение от Super-Hacker Посмотреть сообщение
В чём там необходимость от свапа через указатели и обёртку над свапом?
Втом чтоб дофигаразмерные массивы не копировались туда-сюда-обратно (как если б через одни ссылки), а сидели ровно и не хрюкали.
Эт такая косвенная сортировка там.
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
19.06.2021, 15:57
Цитата Сообщение от Super-Hacker Посмотреть сообщение
В чём там необходимость от свапа через указатели
Потому что массив хранит в качестве своих элементов указатели. Обмениваем местами указатели, поэтому и принимаем ссылки на них.

Цитата Сообщение от Super-Hacker Посмотреть сообщение
обёртку над свапом?
Обертка над свапом технически не нужна. std::swap справится с этим без обертки. Видимо здесь какой-то педагогический момент, чтобы подчеркнуть во что выведется T у swap.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
19.06.2021, 16:00
Цитата Сообщение от Super-Hacker Посмотреть сообщение
Вы видимо единственный, кто ещё не понял. Я не говорил, что указатели - отстой
я прекрасно тебя понял.

а вот ты меня, похоже, не очень.
ты смотришь на неккий "профит", "крутизну" инструмента.

я ж тебе пытаюсь донести: забей на профит,
смотри на уместность


Цитата Сообщение от Super-Hacker Посмотреть сообщение
В чём там необходимость от свапа через указатели и обёртку над свапом?
ни в чем.
можешь смело удалить эту обертку из кода,
и ничего вообще не изменится:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <bits/stdc++.h>
 
#define  l(v)  std::cout << #v << " = " << (v) << "\n";
 
struct A
{   int x[100000000];
};
 
//void swap(A*& a, A*& b){   std::swap(a, b);}
 
///----------------------------------------------------------------------------|
/// Старт тест.
///----------------------------------------------------------------------------:
int main()
{   A a={1}, b={2};    l(a.x[0]) l(b.x[0])
 
    A* p[] = {&a, &b};
    ::std::swap(p[0], p[1]) ;   l(p[0]->x[0]) l(p[1]->x[0])
}
пример от господина XLAT - это один из тех случаев,
когда человек не осознает, когда уместно применять инструмент,
а когда нет.
0
Гвоздь Задиров
 Аватар для Folian
1718 / 1117 / 337
Регистрация: 25.01.2019
Сообщений: 2,940
19.06.2021, 16:18
Чёт такое, наверное, имелось в :
C++
1
2
3
4
5
6
7
8
9
10
11
    typedef int BIG;
 
    const size_t n = 6;
    std::array<BIG, n> ba { 2, 54, 6, 8, 2, 1 };
    std::array<BIG*, n> pba;
    std::generate(pba.begin(), pba.end(), [&ba](){ static size_t i = 0; return &ba[i++]; });
    std::sort(pba.begin(), pba.end(), [](BIG* a, BIG* b){ return *a < *b; });
 
    for(const auto &i : pba) std::cout << *i << " ";
    std::cout << "\n\n";
    for(const auto &i : ba) std::cout << i << " ";
0
19.06.2021, 16:24

Не по теме:

Цитата Сообщение от Super-Hacker Посмотреть сообщение
Кстати, не по теме, но может есть у кого-нибудь что-то знакомое из стд, что ряльно принимает указатель
ряльно.
https://en.cppreference.com/w/cpp/utility/launder
https://en.cppreference.com/w/... ant/get_if
https://en.cppreference.com/w/... y/any_cast
https://en.cppreference.com/w/... to_address
https://en.cppreference.com/w/cpp/memory/align
https://en.cppreference.com/w/... me_aligned
https://en.cppreference.com/w/... nstruct_at
https://en.cppreference.com/w/... destroy_at
это то, что вспомнил с первого раза(ну и что под руку попалось).
в аллокаторах много где используется в целом.

0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
19.06.2021, 19:19
Цитата Сообщение от Super-Hacker Посмотреть сообщение
из стд, что ряльно принимает указатель
Возвращаясь к моему самому первому ответу здесь:
Цитата Сообщение от DrOffset Посмотреть сообщение
реализуйте связный список на ссылках
И принимая во внимание вот этот пост:
Цитата Сообщение от DrOffset Посмотреть сообщение
Даже если интерфейс, например, класса может целиком инкапсулировать указатели через ссылки или другие средства, то внутренние методы, если реальная работа идет с указателями, все-таки должны работать непосредственно с ними
Смотрим сюда (это реализация std::list):
http://cs.brown.edu/people/jwi... ource.html
C++
1
2
3
4
5
6
7
void transfer(_List_node_base * const __first, _List_node_base * const __last);
 
void hook(_List_node_base * const __position);
 
......................
 
void _M_put_node(_List_node<_Tp>* __p)
И в каждом из подобных классов можно найти такие методы.
0
 Аватар для Super-Hacker
342 / 114 / 37
Регистрация: 26.11.2019
Сообщений: 735
20.06.2021, 08:11  [ТС]
Python
1
'А' + 'a' * 5
Я ж говорю, что понимаю это. Меня интересовало не что-то из стд, что вообще использует указатели.
А что-то, что реально принимает указатель в конструкторе или как аргумент функции

Думаю, можно закончить на этом
0
Just Do It!
 Аватар для XLAT
4189 / 2644 / 654
Регистрация: 23.09.2014
Сообщений: 8,922
Записей в блоге: 3
20.06.2021, 10:33
Цитата Сообщение от hoggy Посмотреть сообщение
человек не осознает
дык, однако, кажется для вас нужно отдельно объяснять,
но зачем же пример мой так извратили то?

раскомментируйте то, что должно изначально быть, а потом на меня ссылайтесь!
Там именно пользовательский свап, а не библиотечный, вместо него может быть всё, что угодно!


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


анекдот

Кто-то написал коммент, чтобы показать как оно правильно:
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
 
void foo()
{   std::cout << "Hello world!" << endl;
}
 
int main()
{
    foo();
    return 0;
}
приходит осознающий и заявляет: А НАФИГА?!!!!
ЛУЧШЕ ТАК:
C++
1
2
3
4
5
6
7
#include <iostream>
 
int main()
{
    std::cout << "Hello world!" << endl;
    return 0;
}
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
20.06.2021, 13:53
Цитата Сообщение от XLAT Посмотреть сообщение
однако, кажется для вас нужно отдельно объяснять,
нет, не нужно.

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

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

из чего лично ты должен сделать вывод:
твой пользовательский свап действительно бесполезен.

а потом задай себе вопрос:
зачем ты пишешь код, в котором используются бесполезные вещи?

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


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

Цитата Сообщение от XLAT Посмотреть сообщение
вместо него может быть всё, что угодно!
это только у балбесов.

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

Цитата Сообщение от XLAT Посмотреть сообщение
ваще, потрудились бы показать свой пример
я и показал свой пример.
1. взял твой пример.
2. убрал бесполезный хлам.
3. PROFIT ???!!!!


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

замечательный анегдот.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.06.2021, 13:53
Помогаю со студенческими работами здесь

Ссылки и указатели
Всем привет. Совсем запутался с ссылками и указателями. Помогите решать задачку: Функция принимает два аргумента, число с плавающей...

Указатели и ссылки
Добрый день, есть вопросы по поводу указателей и ссылок в параметрах функций. Правильно ли я понимаю, что есть по сути 2 варианта, либо...

Ссылки, указатели
Доброго времени. Как, используя ссылки, указатели и, возможно, другие приемы сделать что-то вроде этого?: int a = 1; int b = 2; ...

Указатели и ссылки
Используя вместо самой переменной указатель на нее написать программу в соответствии с заданием: Вычислить y = cos|x3-x2|.

Ссылки и указатели
#include &lt;iostream&gt; using namespace std; int main() { int *n=new int{1,2}; cout&lt;&lt;&amp;n&lt;&lt;' '&lt;&lt;&amp;n&lt;&lt;' '&lt;&lt;&amp;n&lt;&lt;endl; return...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
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