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

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

21.04.2017, 19:09. Показов 17993. Ответов 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
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
23.04.2017, 12:54
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Qazz Посмотреть сообщение
Ладно, под ссыль не выделяется память, но под указатель выделяется. Для чего плодить все эти сущности, постоянно выделяя память, по сути одному и тому же значению?
Попробуйте построить граф не используя ссылки и указатели. Например, генеалогическое древо.
0
 Аватар для ПерС
587 / 490 / 371
Регистрация: 05.11.2013
Сообщений: 1,272
Записей в блоге: 6
23.04.2017, 17:53
т.е. передача в функцию указателя на переменную, быстрее выведет значение на консоль, чем передача переменной в эту же фу-ию..?
уже подчеркивали, что в программе речь обычно идёт о массиве или структуре, а не об отдельной переменной.
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
#include <iostream>
#include <ctime>
using namespace std;
 
struct chtoto {
 char name[20];
 double x,y,z;
};
 
void f1(chtoto a) {
    static bool p=false;
    if (!p) { cout << endl << sizeof(a) << "byte(s)"; p=true; }
}
 
void f2(chtoto *a) {
    static bool p=false;
    if (!p) { cout << endl << sizeof(a) << "byte(s)"; p=true; }
}
 
int main(void) {
 const int size=1000000000;
 chtoto a={"Hello",1.,2.,3.};
 long t1=time(0);
 for (int i=0; i<size; i++) f1(a);
 cout << endl << (time(0)-t1) << "s";
 t1=time(0);
 for (int i=0; i<size; i++) f2(&a);
 cout << endl << (time(0)-t1) << "s";
 system("pause >nul");
 return 0;
}
функция f1 получит через стек больше данных (=размеру структуры в байтах), чем f2 (=размеру указателя)
а по быстродействию будет примерно одно и то же, во всяком случае, в Release-сборке. В Debug, конечно, заметно отстанет f1:
Code
1
2
3
4
48byte(s)
60s
4byte(s)
37s
Ну и если просто взять структурку пробольше и собрать в Release что-то типа
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
using namespace std;
 
struct chtoto {
 char name[20000];
 double x,y,z;
};
 
void f1(chtoto a) {
 static bool p=false;
 if (!p) { cout << endl << sizeof(a) << "byte(s)"; p=true; }
}
 
int main(void) {
 const int size=1000000000;
 chtoto a={"Hello",1.,2.,3.};
 f1(a);
 system("pause >nul");
 return 0;
}
исполняемый файл получится больше размером, чем
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
using namespace std;
 
struct chtoto {
 char name[20000];
 double x,y,z;
};
 
void f1(chtoto *a) {
 static bool p=false;
 if (!p) { cout << endl << sizeof(a) << "byte(s)"; p=true; }
}
 
int main(void) {
 const int size=1000000000;
 chtoto a={"Hello",1.,2.,3.};
 f1(&a);
 system("pause >nul");
 return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.04.2017, 17:53

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
22
Ответ Создать тему
Новые блоги и статьи
Транслитерация текста с кириллицы на латиницу (вариант №3)
Maks 15.11.2026
Обновленная версия предыдущей обработки. Изменения коснулись букв: Ъ, Ы, Ь, Э, отображения которых зависят от положения реквизита "Транслитерация имён". Изменено отображение буквы Й. Добавлена. . .
Транслитерация текста с кириллицы на латиницу (вариант №2)
Maks 13.11.2026
Обновленная версия ранее созданной обработки. Добавлено: - Проверка исходного текста на кириллицу, через обращение к стандартной функции "ТолькоКириллицаВСтроке" из общего модуля. . .
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы. Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru