Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
0 / 0 / 0
Регистрация: 30.04.2026
Сообщений: 10

Как понять тему ссылки и указатели

05.08.2026, 20:53. Показов 9839. Ответов 135
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
я не понимаю эту тему я постоянно путаюсь дайте какойто видеоурок самый понятный или сами объясните я не понимаю.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.08.2026, 20:53
Ответы с готовыми решениями:

Указатели и указатели на указатели, а также типы данных
Недавно начал изучать Си, перешел с Delphi. Много непонятного и пока процесс идет медленно....

Code:: Blocks (не на тему программирования, а на тему настройки)
доброе время суток сразу попрошу прощения за созданную тему в этом разделе, которая не совсем по...

Указатели на указатели, как правильно разыменовать, где ошибка?
1)Есть класс: Shape - абстрактный; у него есть классы наследники: Circle, Triangle. 2)Eсть...

135
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,350
06.08.2026, 21:31
Студворк — интернет-сервис помощи студентам
Зачем вообще нужен указатель? К переменной можно обратиться по имени. Следовательно, имя переменной хранит адрес, а имя массива - адрес первого элемента. Какая разница, какой конкретно физический адрес у переменной? Это какие-то машиннокодовые заморочки.
0
фрилансер
 Аватар для Алексей1153
6506 / 5757 / 1134
Регистрация: 11.10.2019
Сообщений: 15,405
06.08.2026, 21:41
Цитата Сообщение от alexu_007 Посмотреть сообщение
Зачем вообще нужен указатель
для возможности косвенного обращения к объекту

Цитата Сообщение от alexu_007 Посмотреть сообщение
имя переменной хранит адрес, а имя массива - адрес первого элемента
имя ничего не хранит, в машинном коде этих имён уже нет

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

Тогда в указатель пишется актуальный адрес

Добавлено через 54 секунды
Цитата Сообщение от alexu_007 Посмотреть сообщение
Это какие-то машиннокодовые заморочки
для которых языки C и C++ напрямую и создавались
0
1980 / 836 / 115
Регистрация: 01.10.2012
Сообщений: 5,222
Записей в блоге: 2
06.08.2026, 21:54
А по-моему такие вещи улавливаются интуитивно. А если нет - программирование не для него
0
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,350
06.08.2026, 22:15
Цитата Сообщение от Алексей1153 Посмотреть сообщение
для возможности косвенного обращения к объекту
Зачем, если можно обратиться напрямую?

Цитата Сообщение от Алексей1153 Посмотреть сообщение
имя ничего не хранит, в машинном коде этих имён уже нет
Мы программируем на языке высокого уровня, или в машинных кодах? Даже ассемблер работает с именами переменных.

Цитата Сообщение от Алексей1153 Посмотреть сообщение
а вот адрес может смениться, в том смысле, что мы переключились на работу с другим объектом. Тогда в указатель пишется актуальный адрес
Это что-бы запутать программу, и в ней нельзя было разобраться без трассировки?

Цитата Сообщение от Алексей1153 Посмотреть сообщение
для которых языки C и C++ напрямую и создавались
А я думал, что для машинных кодов создавался ассемблер.

Добавлено через 5 минут
Приведите пример, когда без указателя невозможно обойтись никак?
0
фрилансер
 Аватар для Алексей1153
6506 / 5757 / 1134
Регистрация: 11.10.2019
Сообщений: 15,405
06.08.2026, 22:36
Цитата Сообщение от alexu_007 Посмотреть сообщение
Зачем, если можно обратиться напрямую?
затем, что иногда нужно косвенно

Цитата Сообщение от alexu_007 Посмотреть сообщение
Приведите пример, когда без указателя невозможно обойтись никак?
1) есть локальный объект, его нужно частично поменять при помощи функции. Передаём туда указатель (или ссылку)
2) есть набор объектов. Нужно работать с одним из них, а с каким именно - заранее неизвестно. Указатель является селектором
3) произвольный доступ к элементам массива (указатели или итераторы)
4) динамический полиморфизм
0
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,350
06.08.2026, 23:13
Цитата Сообщение от Алексей1153 Посмотреть сообщение
есть набор объектов. Нужно работать с одним из них, а с каким именно - заранее неизвестно. Указатель является селектором
Switch - case. Если 1 - вызываем функцию А(), если 2 - функцию В() - и так далее.

Цитата Сообщение от Алексей1153 Посмотреть сообщение
произвольный доступ к элементам массива (указатели или итераторы)
a[5] = 10; a[18] = 33; - не произвольный доступ? Вычисляешь индексы и получаешь произвольный доступ. Зачем плодить сущности?
0
 Аватар для Наталья8
638 / 396 / 68
Регистрация: 09.03.2016
Сообщений: 4,372
06.08.2026, 23:19
Цитата Сообщение от Алексей1153 Посмотреть сообщение
динамический полиморфизм

А кто это сделаль??
Не моё это не моё... Простите меня старого...
Это не я...
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
106
107
108
109
110
111
112
#include <iostream>
#include <vector>
#include <memory>
#include <string>
 
// Структура, имитирующая тяжелые данные изображения
struct ImageData {
    std::string format = "RGBA";
    size_t width = 1920;
    size_t height = 1080;
};
 
// Абстрактный базовый класс (Интерфейс фильтра)
class ImageFilter {
public:
    // Виртуальный деструктор обязателен для предотвращения утечек памяти
    virtual ~ImageFilter() {
        std::cout << "[Destroying Filter Base]\n";
    }
 
    // Чистая виртуальная функция — делает класс абстрактным
    virtual void apply(ImageData& data) const = 0;
 
    // Обычный виртуальный метод с базовой реализацией
    virtual std::string getName() const {
        return "Generic Filter";
    }
};
 
// Первый конкретный класс: Размытие
class BlurFilter : public ImageFilter {
private:
    int radius;
public:
    explicit BlurFilter(int r) : radius(r) {}
 
    ~BlurFilter() override {
        std::cout << "[Destroying BlurFilter]\n";
    }
 
    // Переопределение метода базового класса
    void apply(ImageData& data) const override {
        std::cout << "-> Применение BlurFilter с радиусом " << radius 
                  << " к изображению " << data.width << "x" << data.height << "\n";
    }
 
    std::string getName() const override {
        return "Blur (Radius: " + std::to_string(radius) + ")";
    }
};
 
// Второй конкретный класс: Цветокоррекция
class ColorFilter : public ImageFilter {
private:
    float exposure;
public:
    explicit ColorFilter(float exp) : exposure(exp) {}
 
    ~ColorFilter() override {
        std::cout << "[Destroying ColorFilter]\n";
    }
 
    void apply(ImageData& data) const override {
        std::cout << "-> Изменение экспозиции на " << exposure << " единиц.\n";
    }
 
    std::string getName() const override {
        return "Color Correction";
    }
};
 
// Класс-менеджер, управляющий жизненным циклом фильтров через полиморфизм
class RenderPipeline {
private:
    // Храним полиморфные объекты через указатели на базовый класс
    std::vector<std::unique_ptr<ImageFilter>> pipeline;
public:
    // Добавление фильтра в цепочку (принимает любой дочерний класс)
    void addFilter(std::unique_ptr<ImageFilter> filter) {
        pipeline.push_back(std::move(filter));
    }
 
    // Выполнение всей цепочки для конкретных данных
    void run(ImageData& data) const {
        std::cout << "--- Запуск конвейера обработки ---\n";
        for (const auto& filter : pipeline) {
            std::cout << "Вызов: " << filter->getName() << "\n";
            // Динамическое связывание происходит здесь:
            filter->apply(data); 
        }
        std::cout << "--- Обработка завершена ---\n\n";
    }
};
 
int main() {
    // Настройка локализации для корректного вывода кириллицы
    std::setlocale(LC_ALL, "ru_RU.UTF-8");
 
    ImageData rawImage;
    RenderPipeline processor;
 
    // Полиморфное добавление разных объектов в один контейнер
    processor.addFilter(std::make_unique<BlurFilter>(5));
    processor.addFilter(std::make_unique<ColorFilter>(1.2f));
    processor.addFilter(std::make_unique<BlurFilter>(10));
 
    // Выполнение кода (динамический поиск нужных методов в рантайме)
    processor.run(rawImage);
 
    std::cout << "--- Очистка памяти (автоматический вызов деструкторов) ---\n";
    return 0;
}
0
фрилансер
 Аватар для Алексей1153
6506 / 5757 / 1134
Регистрация: 11.10.2019
Сообщений: 15,405
06.08.2026, 23:21
Цитата Сообщение от alexu_007 Посмотреть сообщение
Switch - case. Если 1 - вызываем функцию А(), если 2 - функцию В() - и так далее.
да уж, красота Спасибо, но нет

Цитата Сообщение от alexu_007 Посмотреть сообщение
a[5] = 10; a[18] = 33; - не произвольный доступ?
индексирование бывает медленнее, чем сразу доступ по указателю
0
 Аватар для Наталья8
638 / 396 / 68
Регистрация: 09.03.2016
Сообщений: 4,372
06.08.2026, 23:23
Алексей1153,
Когда ещё не было искуственного интелекта, я пытался учиться у людей...
А они склонны бросаться вот такими штуками...
А от этого толку нету, так как я ни чего не понимаю в динамическом полиформизьме...
0
фрилансер
 Аватар для Алексей1153
6506 / 5757 / 1134
Регистрация: 11.10.2019
Сообщений: 15,405
06.08.2026, 23:26
Цитата Сообщение от Наталья8 Посмотреть сообщение
так как я ни чего не понимаю в динамическом полиформизьме
значит, он тебе ещё не требовался
0
 Аватар для Наталья8
638 / 396 / 68
Регистрация: 09.03.2016
Сообщений: 4,372
07.08.2026, 00:49
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
#include <iostream>
#include <windows.h>
#include <random>
#include <stdio.h>
#pragma warning(disable:4996)
 
char one() { return 'a'; }// Функции мы вызываем как бы случайно.
char two() { return 'b'; }
char three() { return 'c'; }
char four() { return 'd'; }
char five() { return 'e'; }
char six() { return 'f'; }
char seven() { return 'g'; }
char eight() { return 'h'; }
char nine() { return 'i'; }
char ten() { return 'j'; }
 
typedef char(*arithm_t)();
arithm_t funcs[] = {
    one,two,three,four,five,six,seven,eight,nine,ten,
    
};
 
 
 
int main()
{
    std::random_device rd;
    //std::default_random_engine generator;
    std::mt19937 mersenne(rd());
    std::uniform_int_distribution<int> dist(0, 9);
 
    while (true) {
        char mass[12]{};
        char massn[12]{};
        for (int i = 0; i < (int)dist(mersenne) + 2; ++i) {
            char lt = funcs[(int)dist(mersenne)]();
            strncat(mass, &lt, 1);
            lt = funcs[(int)dist(mersenne)]();
            strncat(massn, &lt, 1);
    }
    printf("%*s %s\n", -16, mass, massn);
        Sleep(200);
    }
    getchar();
}
Содержит несколько интересных приёмов. Вообще это про указатели.
1
 Аватар для Наталья8
638 / 396 / 68
Регистрация: 09.03.2016
Сообщений: 4,372
07.08.2026, 00:53
0
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,350
07.08.2026, 08:37
Ссылка - это особая переменная, в которой хранится адрес другой переменной (например А).
Указатель - это "нечто", в котором тоже хранится адрес переменной А (иначе как бы он на неё указывал).
Имя переменной А - в ней тоже хранится адрес переменной А.

Так?
0
 Аватар для vlisp
1071 / 992 / 153
Регистрация: 10.08.2015
Сообщений: 5,447
07.08.2026, 09:05
Цитата Сообщение от alexu_007 Посмотреть сообщение
Так?
Так да не так. ты путаешь литры с километрами. в железе нет никаких переменных. там есть только ячейки памяти. указатель как переменная компилируется в ячейку памяти в области кода, которая хранит смещение до ячейки памяти в которой находятся данные. то есть Если пишешь
C++
1
int i=5;
, то программа просит у ОС 2 ячейки памяти. 1 в "коде" будет хранить 5, другая на стеке хранит смещение до ячейки хранящей 5
если пишешь
C++
1
int i=5; int* p = &i;
, то выделится 3 ячейки: одна будет хранить 5, другая будет хранить смешение до ячейки с 5, третье будет хранить смещение до ячейки хранящей смещение до ячейки хранящей 5
0
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,350
07.08.2026, 09:31
Цитата Сообщение от vlisp Посмотреть сообщение
Так да не так. ты путаешь литры с километрами. в железе нет никаких переменных. там есть только ячейки памяти.
Ты еще объясни, что в железе никаких цифр нету, там только единицы и нули. При компиляции какая-то область памяти выделяется под переменную А. И где бы ты в программе не написал А = 5; компилятор запишет пятерку именно в эту область памяти. Ты можешь объявить другую переменную (или как написано выше, она сама автоматически создается при компиляции), в которой будет храниться адрес А - это и есть ссылка. Можно повторить эту процедуру еще пару-тройку раз - и в каждой новой адресной переменной будет храниться адрес предыдущей переменной - которые в результате все равно приведут тебя к А. Только зачем?

И что физически представляет из себя указатель - это тоже какая-то область памяти?

Цитата Сообщение от vlisp Посмотреть сообщение
, то выделится 3 ячейки: одна будет хранить 5, другая будет хранить смешение до ячейки с 5, третье будет хранить смещение до ячейки хранящей смещение до ячейки хранящей 5
Зачем тройное дублирование в памяти, если к переменной можно тупо обратиться по имени, и компилятор это поймет?
0
Модератор
Эксперт Java
 Аватар для alecss131
2902 / 1407 / 413
Регистрация: 11.08.2017
Сообщений: 4,512
Записей в блоге: 2
07.08.2026, 10:49
Если есть большой объект, то при передаче в функции по имени, он будет копироваться, лишние действия, потеря производительности. А если объект надо внутри изменить? Передать копию и вернуть измененный? ну такое себе. Можно передать в функцию либо ссылку либо указатель, все же лучше ссылку, а если не надо менять то константную ссылку.
Да и вся динамическая память работает с указателями, то есть после выделения получается адрес памяти, а то что можно использовать как массив это уже другой разговор.
0
 Аватар для vlisp
1071 / 992 / 153
Регистрация: 10.08.2015
Сообщений: 5,447
07.08.2026, 10:57
Цитата Сообщение от alexu_007 Посмотреть сообщение
Ты еще объясни, что в железе никаких цифр нету, там только единицы и нули.
Ну так и есть цифр нет, числа в виде блоков памяти хранятся в двоичном виде. вкл/выкл.
Цитата Сообщение от alexu_007 Посмотреть сообщение
Зачем тройное дублирование в памяти, если к переменной можно тупо обратиться по имени, и компилятор это поймет?
см. видео которая выложил. там популярно объяснено что да как и почему для новичков

Добавлено через 2 минуты
Цитата Сообщение от alecss131 Посмотреть сообщение
Если есть большой объект, то при передаче в функции по имени, он будет копироваться, лишние действия, потеря производительности. А если объект надо внутри изменить? Передать копию и вернуть измененный? ну такое себе. Можно передать в функцию либо ссылку либо указатель, все же лучше ссылку, а если не надо менять то константную ссылку.
Да и вся динамическая память работает с указателями, то есть после выделения получается адрес памяти, а то что можно использовать как массив это уже другой разговор.
если у тебя есть яблоко красивое, ты хочешь его откусить, но чтоб оно целое осталось... копируешь яблоко и кусаешь копию, Красивое яблоко остается целым
0
фрилансер
 Аватар для Алексей1153
6506 / 5757 / 1134
Регистрация: 11.10.2019
Сообщений: 15,405
07.08.2026, 11:04
Цитата Сообщение от alexu_007 Посмотреть сообщение
Ссылка - это особая переменная, в которой хранится адрес другой переменной
нет, ссылка - это просто второе имя. С точки зрения языка это так

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


например, у нас есть объект

C++
1
int A; //A - это его имя
мы можем дать этому объекту ещё одно имя
C++
1
int& B = A; //B - это ссылка, второе имя для объекта A
Добавлено через 1 минуту
и всё, что дальше будем делать с B, это будет делаться с объектом A
0
 Аватар для vlisp
1071 / 992 / 153
Регистрация: 10.08.2015
Сообщений: 5,447
07.08.2026, 11:27
Цитата Сообщение от Алексей1153 Посмотреть сообщение
и всё, что дальше будем делать с B, это будет делаться с объектом A
сказал а, скажи и б
C++
1
2
3
4
5
6
7
8
9
10
11
#include <print> //С++23 std::print
 
 
int main ()
{
    int i = 5;
    int& p= i;
    p=7;
    std::print("{0}{1}", i, 6);
    return 0;
}
0
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,350
07.08.2026, 12:16
Цитата Сообщение от Алексей1153 Посмотреть сообщение
нет, ссылка - это просто второе имя. С точки зрения языка это так
Сами же говорили, что под ссылку выделяется память, какое же это "просто" второе имя? Второе имя это #define. C ссылкой можно работать как с переменной, можно менять её содержимое.

Цитата Сообщение от vlisp Посмотреть сообщение
Если есть большой объект, то при передаче в функции по имени, он будет копироваться, лишние действия, потеря производительности. А если объект надо внутри изменить?
Это понятно. Но это какой-то синтаксический сахар. Когда-то при создании языка решили для передачи в функцию использовать занимающую память ссылку. А можно было просто:

void func(a);
или
void func (const a);

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

Единственно, для чего реально (по моему мнению) нужна ссылка - это для возможности создавать сложные программы. Программа не может менять свой код. Но она может менять содержимое ссылок, и в зависимости от предыдущих вычислений ход программы может меняться.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.08.2026, 12:16

Указатели на функции. Указатели на функции как формальные параметры у функциях высшего уровня
Найти наименьшее значение для функций используя функции и указатели на функции ...

Вопрос по программе на тему: Массивы и указатели. Динамическое выделение памяти
народ, очень прошу! пожалуйста! Помогите решить задачку на тему: Массивы и указатели. Динамическое...

Программа на тему указатели, функции, строки. (язык Си)
Доброго времени суток. Как это случается со многими - я оттянула решение лабораторных работ до...

Задание на тему Указатели
требуется решить такую задачу на C++ : Имеются N-точек, соединенных отрезками. Составить...

Задачи на тему "указатели"
Нужны задачки для закрепления темы &quot;указатели&quot;. Проходил тему по Шилдту и частично по Девису....


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
GitHub Copilot в JetBrains: модель по умолчанию, Fix и контроль MCP
and_y87 12.10.2026
10 октября 2026 года GitHub обновил Copilot для JetBrains: добавил настройки стартовой модели, исправления из диагностики и управление автозапуском MCP. Поддержка IDE 2025. 1 прекращена — требуется. . .
День 5 из 28: Codex подсказывает следующий запрос
and_y87 12.10.2026
9 октября 2026 года OpenAI запустила бету Composer predictions — подсказок следующего сообщения в текущем диалоге Codex. Это помощь с формулировкой запроса, а не автоматическое продолжение задачи. . . .
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
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