4 / 4 / 0
Регистрация: 04.07.2013
Сообщений: 27

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

21.04.2017, 19:09. Показов 17868. Ответов 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru