Я часто изо всех сил пытаюсь увидеть преимущества указателей (за исключением программирования низкого уровня).
Зачем использовать char * вместо String или char [] или какие преимущества дает арифметика с указателями.
Так каковы плюсы и случаи использования указателей?
Ответы:
Указатели необходимы для динамического расположения в памяти, многих структур данных и эффективной обработки больших объемов данных. Без указателей вам пришлось бы распределять все программные данные глобально или в функциях или аналогичных средствах, и вы бы не обратились за помощью, если бы объем данных превысил то, что вы изначально допустили. Я не решаюсь использовать абсолюты здесь, но, насколько я знаю, все современные компьютерные языки имеют указатели в той или иной форме.
В большинстве языков, в которых используются указатели, существуют определенные виды ссылок, которые являются указателями, и, возможно, некоторые виды ссылок, которые не являются таковыми, и дальнейшая нотационная разница отсутствует.
cons
Ячейка Lisp - это пара указателей, хотя afixnum
не является указателем. В Java переменная, используемая для экземпляра класса, является указателем, но неint
является. Синтаксис языка не отражает этого.C необычен тем, что указатели являются необязательными, явными и допускают явную арифметику указателей. Вполне возможно писать
struct foo bar; struct foo * baz;
, и как только вы выделите память,baz
вы можете использовать обаbar
иbaz
для представленияstruct foo
s. Поскольку указатели являются необязательными, полезно иметь нотационные различия. (Это важно в C ++ для умных указателей, как даноboost::shared_ptr<foo> bar;
,bar.reset()
имеет одно значение иbar->reset()
, вероятно, будет иметь другое значение.)(На самом деле, явные указатели часто использовались в других языках, когда C первоначально разрабатывался, например,
^
в Pascal. C - более старый язык, чем обычно используется сегодня, и это видно.)Одной из целей разработки C было написать Unix, и, следовательно, необходимо было детально обрабатывать области памяти. (C на самом деле является одним из семейства языков реализации системы, распространенных при разработке, другой пример - Cybol для компьютеров с управляющими данными. C - тот, который стал большим хитом.) Следовательно, можно напрямую манипулировать указателями C, назначение адресов памяти и вычисление новых. Это также привело к некоторым проектным решениям в C. Массивы C в значительной степени основаны на арифметике указателей, и, действительно, массив превращается в указатель в очень многих ситуациях. Передача переменных в функции C по ссылке осуществляется указателем. Не было особой необходимости в массивах и передаче переменных по ссылке в форме, которую имели другие современные языки, поэтому Си не получил их.
Таким образом, ответ заключается в том, что в большинстве языков в настоящее время вы постоянно используете указатели, не напоминая об этом факте. В C и, в меньшей степени, в C ++ вы используете указатели либо для выполнения низкоуровневых задач, либо для выполнения высокоуровневых вещей, для которых нет специальных обозначений.
источник
Сложные структуры данных. Вы не можете создать что-то вроде связанного списка или двоичного дерева без указателей.
Здесь нет «плюсов» и «минусов» указателей. Они просто инструмент, как молоток.
источник
Ссылки на C ++, Java и другие языки того же типа - это просто «безопасные указатели». И эти ссылки часто используются в Java.
источник
NULL
и не могут быть изменены после их создания.Практически любая компьютерная программа должна проверять и изменять значения в памяти (те, кто достаточно стар), известные как «заглядывание». Вы должны контролировать, где в памяти находятся эти значения, чтобы результат был предсказуемым (и в некоторых случаях важен порядок: загрузка исполняемого кода является одним из примеров). Поэтому вам нужно иметь тип данных, который представляет местоположение в памяти. Даже если ваша среда программирования скрывает это под абстракцией, она все еще там.
источник
char*
это грязный пример указателей. Вам, вероятно, лучше использоватьstd::string
(или какой-то лучший тип, который обрабатывает вашу специальность Unicode / ANSI / Multibyte), чемchar*
. Почти для любого другого примера указателей (Employee*
,PurchaseOrder*
, ...), однако, есть много преимуществ:Фактически, указатели настолько важны, что большинство языков, у которых их нет, на самом деле имеют только их. Ссылочные типы в C # и Java по сути являются указателями, замаскированными как сплошные объекты.
Теперь манипулирование указателем (
p++
на указателе илиp += delta
) - это целая другая история. Некоторые люди думают, что это опасно, некоторые люди думают, что это здорово. Но это еще дальше от вашего вопроса.источник
Указатели могут быть более быстрыми и могут вызывать меньше накладных расходов, как в структурах данных, так и в плане сокращения объема выполнения программы. (Обратите внимание на слово «можно».)
В общем случае правило заключается в том, что если вы выделили ресурс, выполнив собственное выделение или сделав что-то, сделав это от вашего имени, то ваша задача - освободить его, когда закончите.
Бремя выполнения вышесказанного возлагает ответственность на разработчика, а не на выполнение среды выполнения. Это имеет некоторые дополнительные преимущества в том, что вещи могут быть дольше, или пересекать границы, или выбрасываться в более подходящее время, или не должны нести вес сборщика мусора.
В экзотических случаях, обычно связанных с исключениями и областью действия, существуют некоторые крайние случаи, которые требуют, чтобы один был немного более осторожным, если избегается код, который выполняет очистка. Реально, эти случаи могут быть разработаны вокруг. Мы жили без управляемого кода в течение многих десятилетий.
Часто то, что делает указатели «сложными», просто не понимает, что происходит на аппаратном уровне. Это не что иное, как косвенность.
Указатели дают вам гораздо более простой доступ, и это может быть очень полезным, умным или необходимым. Вы можете указать куда угодно и относиться к этому как к чему угодно. Если вы используете свои богоподобные силы для добра, это очень, очень хорошо.
Мошенническая сторона, как правило, тратится впустую, забывая выпустить что-то, или выпуская это более одного раза, или ссылаясь на что-то после того, как оно отпущено, или отреагировав чем-то, когда вы никуда не указываете. Эти вещи часто приводят к впечатляющим сбоям, и, честно говоря, обычно указывают на то, что у вас логическая проблема, а не указатели хрупки.
Если вы надежный разработчик, использование указателей не должно быть более проблематичным, чем любая другая структура данных. Опять же, это не ракетостроение, и люди делали это десятилетиями, даже не моргнув глазом. В наши дни этому учат менее тщательно.
Все это говорит, если только вам не нужны указатели, случайные и экзоитичные случаи, которые обеспечивает хорошая сборка мусора, делают работу в управляемой среде намного приятнее. Замечательно иметь возможность захватить некоторую память, использовать ее и отказаться от нее, зная, что через некоторое время она может быть отброшена, если это имеет смысл. Это немного меньше кода со стороны кодера, в обмен на время выполнения, которое делает некоторые дополнительные подъемы.
источник
Лучший ответ на самом деле включен в вопрос: указатели предназначены для низкоуровневого программирования. Конечно, если вы используете C, не использование указателей похоже на программирование с одной рукой, связанной за спиной, но ответом на это является использование языка более высокого уровня.
источник
Указатели обеспечивают видимость машины, которая требуется для наиболее интересного программирования. Большинство современных языков просто скрывают от вас мелкие кусочки.
источник