2012-06-07 14 views
2

Я запрограммировал на Java довольно много, и раньше занимался C++. Я читал о указателях в различных книгах на C++ и делал различные примеры в книгах.Какова реальная «точка» указателей?

Я понимаю основы указателя, но одна вещь мне никогда не была ясна. Каково применение указателей в реальном мире? Я имею в виду, в какой ситуации использование указателей будет более выгодным, чем просто передача по ссылке (например, в Java?)

+1

Одной из наиболее важных причин существования _pointers_ является разрешение реализации языков типа «Java», где почти все - указатель ... На самом деле, это едва ли важная причина. –

+0

Это может быть дубликат, но связанный вопрос не соответствует этому вопросу. – Pubby

+0

Согласовано - это не дубликат этого вопроса. – Puppy

ответ

0

Главное отличие (по крайней мере, для меня) - это время, когда вы выбираете тот или иной. Я думаю, если вам нужно сделать арифметику указателя или присвоить ему значение NULL, тогда используйте указатели, иначе придерживайтесь ссылок; они выполняют эту работу.

+0

Или если это необходимо переустановить. –

9

Я имею в виду, в какой ситуации будет использование указателей будет более выгодным, чем просто передача по ссылке (как в Java?)

Ссылки в Java и многих других языках, в основном абстракции поверх указателей , В C (не C++) не было способа «передать по ссылке», как вы можете, в C++ со ссылками, поскольку эта абстракция не существовала, поэтому это никогда не было возможным. C++ добавил ссылки как новую абстракцию.

С C++ вы можете передавать по ссылке, и это часто бывает предпочтительным. Однако фактическое распределение динамической памяти по-прежнему будет на каком-то уровне работать с указателями.

Это, как говорится, есть некоторые вещи, которые вы можете сделать на C++ с указателями, которые могут привести к хорошей эффективности. Знание памяти и того, что там хранится, позволяет вам напрямую манипулировать этими данными без накладных расходов на абстракции, которые вы получаете на некоторых языках. Это не «безопасно» (легко сделать что-то опасное и плохое), но это часто полезно. (Полезно, что некоторые языки, такие как C#, также позволяют вам это делать, хотя они требуют, чтобы вы явно отметили этот код как «небезопасный», чтобы его разрешить.)

Как говорится, указатели обычно абстрагированы на C++. Smart Pointers обеспечивают множество преимуществ без побочных эффектов и опасностей при работе с «необработанными» указателями ...