Зачем и когда нужно использовать указатели в C++?
===================================================

 Мне сейчас 16 лет. До работы еще далеко, поэтому сейчас я стараюсь изучить языки и выбрать язык, подходящий для работы. Я выбрал четыре языка, так как и платят немало и работа интересная(python, c#, java, c++).  

Питон и Шарп я знаю на уровне джуна и, если бы я был старше, то мог бы идти работать. Джаву я собираюсь учить через годик, так как это самая высокооплачиваемая работа, а так же самая скучная.  

Ближе к сути вопроса. Зачем использовать указатели, если можно напрямую обратиться к переменной, как в Шарпе: int a = 7; a = 5;? Я пересмотрел много уроков, но так и не понял, где их использовать, ведь другие языки обходятся без указателей.  

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

 Обратите внимание, что в например в python, переменные не базовых типов очень похожи на ссылки в C++.  

```
>>> a = [1, 2, 3]
>>> b = a
>>> b.append(4)
>>> print(b)
[1, 2, 3, 4]
>>> print(a)
[1, 2, 3, 4]
```
  
  

В С++ при присваивании происходит копирование. Вам нужно явно использовать ссылки или указатели чтобы повторить такое же поведение.  
  

Как уже упоминали, для создания массивов (или других структур данных) произвольного размера используется new, который возвращает указатели. В современном C++ это стараются спрятать за классами контейнеров (vector, map, ...) и умными указателями. Но внутри у них лежат те самые указатели.  
  

Тема большая и заслуживает несколько лекций. Я читал, что товарищи из яндекса сделали достаточно хороший курс. Гуглите "Белый пояс C++". 

 Ну что же. попробуем в указатели.  

 Когда то давно, когда деревья были высокими, а трава сочнее и зеленее, на одной красивой планете - да можно было и без указателей. Автоматические переменные неплохо работали в стеке (ага иди гугли про стек и какой он маленький и про знаменитый его оверфлоу). В общем ответь на вопрос, много ли этого стека? Стало все не так романтично, объемы данных росли программы усложнялись , а программист ручками в куче (ага гугли про кучу) с помощью malloc'а выделял память. А что бы он знал где он выделяет память нужны указатели (ну как адрес квартиры - где проживают переменные Ивановы?). вот указатели в общем этот адрес и хранят. Только выяснилось, что программист плохо ручками память выделяет. Например в 20 метровую однушку он может захотеть поселить табор из 300 закарпатских цыган. И согласись получится неприятность.  
  

Вот в c++ память выделяется new и delete - это операторы такие. Сами посчитают сколько цыган куда и адресок вернут, а когда надо всех ненужных выселят. Только лучше и веселее не стало, память всегда течет, а указатели всегда висят. А где там в какой квартире Ивановы, а где Петровы вообще не понять И куда тот табор делся? А может и не делся.  
  

Оппа у нас же в c++ парадигма ООП и классы (гуглим классы). А в классах всегда конструктор и деструктор (гуглим), и они вызываются автоматически когда объект (экземпляр класса) создается и когда уничтожается. Так может new положим в конструктор, а delete в деструктор? И назовем все это хозяйство std::auto\_ptr. И пусть он сам за памятью следит, а программиста будем бить по рукам за ручное выделение памяти  
  

Беда, печаль однако. Лучше жить не стало. и виной тому конструктор копирования (вот опять гуглим). Тогда придумали семантику перемещения r-value ссылки и кучу новых умных указателей вот просвещайся <https://ru.cppreference.com/w/cpp/memory>  

Если пройдешь по ссылке то увидишь много новых и интересных слов например аллокаторы или неинициализированные хранилища.   
  

И я надеюсь мой юный друг, что ты уже понял, что до джуна тебе еще очень и очень много непонятных слов. Вот когда сможешь shared\_ptr свелосипедить, тогда свелосипедь себе еще и резюме и вперед на собеседования. 

> Я выбрал четыре языка

  

Too many.  
  

> так как и платят немало 

  

Как узнали? Смотрели вакансии или Хаброчки начитались?  
  

> Питон и Шарп я знаю на уровне джуна

  

То есть вы знаете назубок все фишки C# и имеете минимум полгода опыта работы? Сможете написать мне с использованием MVC службу, к которой я буду подрубаться через HTTP? Знаете ASP.NET, LINQ, сможете накидать GUI для консольной программы? Нет? Вы не джун. Но вы не расстраивайтесь, ибо все новички думают, что что-то знают.  
  

> Питон и Шарп я знаю на уровне джуна

  

> Зачем использовать указатели?

  

Вы не знаете ни Питон, ни Шарп.  
  
[Просвещайтесь](https://ru.wikipedia.org/wiki/%D0%A3%D0%BA%D0%B0%D0%B7%D0%B0%D1%82%D0%B5%D0%BB%D1%8C_(%D1%82%D0%B8%D0%BF_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85)), это максимально доходчивая статья об указателях. 

 Странно что вы продолжительное время с таким количеством языков знакомились и нигде не применяли указатели - в питоне все на них основано, в C# их так же можно применять как и в C++.   

Я бы рекомендовал прочитать книгу по C++. Какую - не порекомендую. С десяток лет назад читал Страуструпа и вполне там понятно описано было, что такое указатель и какие возможности вытекают из его применения.   

Из того, что регулярно использую в других языках и всплывает в сознании сразу - передача параметров по ссылке. Преимущества очевидны. Да и остальное все построено на основе применения указателей - массивы, списки, строки, **переменные и константы** 

 Перечисленные вами четыре языка - сильно разные. Ваши успехи с Питоном вскружили вам голову, но Питон из них - простейший. Чтобы ваши знания трех остальных хоть чего-то стоили, в них нужно всерьез погрузиться. Ни в коем случае не смешивая друг с другом, пока у вас не накопится несколько лет опыта решения проблем именно на выбранном языке. Знание синтаксиса С/С++/С#/Java - это примерно 5% багажа, необходимого для того, чтобы считаться хотя бы джуном, то есть иметь хоть какую-то ценность для работодателя.  

А про указатели лучше всего для начала - забыть. Используйте только ссылки и STL. Лучше помучиться сейчас и разбираться с работой с памятью, имея хоть небольшой опыт, чем сразу научиться говнокодить и потом мучиться с плохими привычками. На современном С++ вполне можно писать, не используя указатели вовсе.  

А вообще после Питона лучше бы вы за Java взялись, и только если она не отпугнет - лезли глубже. 

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

 Вот это крутяк - 
> Я выбрал четыре языка, так как и платят немало и работа интересная(python, c#, java, c++).

. А зачем? Ну понятно JAVA и C# конкуренты в Enterprise (Благодаря Xamarin еще и в Mobile). Про Python и C++ - пригодятся в ML и Data Science. Ну кто знает. Фишек у каждого языка тьма, как и недостатков. Люди годами по локоть в кодине и бывает сложно разобраться в одном-то. Они зараза развиваются ещё. Просто знания синтаксиса недостаточно. Junior - это человек всё же с опытом работы. Он был? Денег платили?  
  

Странный вопрос про указатели. Вообще то, что в C# чаще приходиться работать с ссылками не значит, что с указателями там не работают (просто Вы об этом не знаете, видимо).  
  

Джуниор вот сможет объяснить следующие конструкции, где память выделена (хотя бы рядом с истиной ткнуть), где указатель на указатель, а где копирование значения:  

```
class Sample 
{
  private int _a;

  public void Method1(int a) 
  {
        // Logic...
  }
  
  public void Method2(ref int a, ref Sample s) 
  {  
        // Logic...
  }

   static unsafe void Method3() {
         int a = 5;
         int* p = &a;

        // Logic...
  }
}
```
  
  

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

 - Супир! Вы ещё пока не поднимали упавший продукт банка и не писали патч за пару часов, чтобы клиенты с говном не съели. А так да - скукота. Поседеть от скуки можно.  
  

Возьмите ASSEMBLER для x86 (эмулятор emu8086 где-то можно было дёрнуть нахаляву) встанет что-нибудь на места. По отладчику походите. 

 Если кратко, то экономия памяти и тактов проца, когда алгоритм не сложный, это не заметно, но вот вы делаете генерацию мира в 2D игре и перебираете в цикле десятки сотен тысяч массивов с тысячами элементами, и каждый раз проц берет и по одному копирует каждый элемент массива в новый  
  

И вот ваша генерация жрет 5 минут и 10 гигабайт ОЗУ, вместо 10 секунд и 50 мегабайт