Подтвердить что ты не робот

Почему С++ использует указатели?

Почему С++ нужен и использует указатели? Я знаю, что они добавляют власть языку, но они делают его намного сложнее понять для новичков. Такие языки, как F #, Java, Ruby, Python, Lua и т.д., Без особого внимания, и они достаточно мощные.

4b9b3361

Ответ 1

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

С++ - это более сложный и более сложный язык, поскольку он позволяет программировать на очень низких уровнях абстракции (очень близко к машине) И на довольно высоких уровнях (рядом со многими языками, которые вы упоминаете) на одном языке, те же исходные файлы.

Начинающим хорошо рекомендуется оставаться вдали от этого количества энергии и (неизбежно) осложнений - но не каждый программист является новичком, а не каждый бит кода (или, фактически, может вообще стоять!)) находясь в среде, которая "позволила защитить бедных shmucks от самих себя" в качестве главной цели проекта!)

Ответ 2

Возможно, С++ не для новичков.

Указатели уже давно существуют. Они были в Паскале и C. Когда С++ вышел, он потерялся бы из ворот без указателей.

Ответ 3

Одна из причин, по которой я еще не читал:

С++ был разработан с совместимостью с C в качестве цели, поэтому просто поставить С++ - это надмножество C (что не является 100% истинным, но почти). Поскольку C имеет указатели (и, из-за его низкого уровня, он нуждается в них), С++ также должен их поддерживать.

Ответ 4

У С# есть указатели, и без них я не мог бы справиться. Это полностью зависит от того, что вы делаете, а учебные указатели очень полезны для вас как разработчика. Вопрос не в том, почему, когда использовать их.

Ответ 5

Здесь много хороших ответов, но не так много хороших примеров того, почему он нужен.... Или почему C иногда называют "Portable Assembly Language".

На самом низком уровне абстракции на машине существует большое количество аппаратных функций, к которым обращаются через диапазоны памяти. Эти адреса памяти часто довольно стандартизированы с использованием различных типов оборудования.

Например, когда компьютер x86 запускается первым, а BIOS загружает и запускает загрузочный сектор, CPU находится в режиме "16-разрядный режим реального времени" для адресации памяти. Для доступа к аппаратным периферийным устройствам существует несколько методов, включая области памяти и инструкции по сборке IN и OUT. Видео доступно в диапазоне адресов памяти 0xA0000-0xBFFFF. Запись в эту ячейку памяти приведет к отображению символов на экране. Запись в определенные области выше 0xC0000 управляет регистрами видео BIOS, которые могут, например, изменять режимы видео.

C первоначально был создан для переноса UNIX в PDP-11, который использует схему ввода-вывода с отображением памяти, подобную сегодняшней x86. UNIX никогда не будет работать на PDP-11 без указателей.

Языки, такие как F #, С#, Ruby, Python, Lua и т.д., не могут сделать это без изменения основного языка. C и С++ могут:

/* Assuming 16-bit DOS environment, 80x25 character video mode. */
char* video = 0xA0000;
video[1] = 'H';
video[3] = 'e';
video[5] = 'l';
video[7] = 'l';
video[9] = 'o'; /* prints "Hello" in the top-left corner of the screen.

Ответ 6

Вы смешиваете арифметику указателя с неизменяемыми указателями, AKA, ссылки. Все эти языки, включая Java, которые вы не упомянули, имеют ссылки. Ссылки немного менее мощные, чем указатели, но вы не заметите этого до тех пор, пока не дойдете до сцены, где вам понадобятся арифметические указатели или двойные или тройные указатели. Но под капотом ссылки на самом деле то же самое, что и указатели, только то, что язык не позволит вам делать то, что вы им захотите (т.е. Они не являются первоклассными объектами).

Рассмотрим этот код python:

class X: z=13

y=X()
def f(aa): aa.z = aa.z+1

print(y.z)
f(y)
print(y.z)

f() изменяет значение y.z, и это именно то, что произойдет в соответствующем коде C или С++, написанном с указателями.

Ответ 7

Короче говоря, потому что С++ нацеливает системное программирование.

Это означает, что С++ ориентирован на реализацию практически всего, сверху донизу.

Это включает в себя операционные системы, где вам нужно иметь контроль над тем, что происходит с машинным адресом, а не только с отображенными логическими адресами VM.

Это также включает компиляторы для С++ или любого другого языка, который требует фактического выполнения абстракций, используемых этими языками.

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

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

Ответ 8

Почему С++ нужен и использует указатели?

С++ ничего не нужно. Программисты нуждаются в них, и есть программисты, которым нужны действительно. Как программисты, которые строят драйверы устройств.

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

Ответ 9

Указатели предоставляют средство для передачи по ссылке, что имеет решающее значение в некоторых программах, которые передают большие структуры данных. Вместо передачи 100mb вы просто передаете небольшой указатель. Языки без "указателей" обычно имеют механизм для передачи по ссылке.

Ответ 10

Большинство языков более высокого уровня не имеют указателей как таковых, но они используют аналогичные конструкции. Вот пример. В С++, если у вас есть что-то вроде:

Foo myObject();

вы объявили экземпляр Foo, который всегда будет иметь тип Foo. Вы не можете объявить Foo и создать экземпляр другого типа без использования указателя. Однако в С# вы можете сделать это легко:

Foo myObject = new Bar(); // assuming Bar derives from class Foo

Единственный способ сделать это в С++ - это указатель (и благодаря полиморфизму). С# использует указатель рода, но абстрагирует беспорядочный материал, который делает так называемые "жесткие" указатели.

Ответ 11

Вы можете много сделать на С++ без использования указателей. Придерживайтесь ссылок и вещей более высокого уровня, таких как STL. Читайте Ускоренный С++ для хорошего новичка (пусть и того, кто запрограммировал на другом языке) книгу. С++ может быть запрограммирован намного выше, чем C. Держитесь подальше от таких вещей, как множественное наследование, написание собственных шаблонов и указателей в начале, и все будет в порядке. Узнайте о виртуальных функциях и объектно-ориентированном программировании с самого начала, если вы только начинаете. Держитесь подальше от перегрузки. Получите первые 50% языка, и трудные для изучения дополнительные 50% будут казаться намного менее неприятными.

Ответ 12

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

В языках разума, таких как ruby, python и другие, находятся на другом уровне кодирования. Они более абстрактны дальше от машинного языка. Но, возможно, медленнее.

Другая причина в том, что С++ - очень старый язык. Многие концепции - это времена, когда люди не знали ничего лучшего, и я думаю, что это серьезная проблема. У С++ есть свои преимущества, он позволяет писать очень быстрый код и отлично сочетать ярлыки. Но компромисс - это язык, который трудно понять, и программы, которые выглядят как искусство, но головоломки лиц, работающих с ним позже.

Ответ 13

Предполагается, что сбор мусора (GC) слишком велик для некоторых сред, где С++ будет использоваться, например. встроенные системы, операционные системы. При использовании высокоуровневых ссылок невозможно удалить объект, если он все еще доступен. Эта гарантия безопасности становится возможной благодаря предположению о наличии GC. Не принимая GC в качестве основного предположения, С++ всегда будет иметь необработанные указатели.

Неудивительно, что одним из самых популярных вопросов на С++ на этом сайте является "Как я могу решить проблему оборванных указателей в общем виде?", и наиболее популярным ответом является использование интеллектуального указателя для подсчета ссылок, который является как бедный человек GC. Другой ответ заключается в том, чтобы использовать правильный инструмент для задания - если вы не выполняете низкоуровневое или встроенное системное программирование, возможно, С++ - неправильный инструмент. С++ используется гораздо шире в высокоуровневом программировании приложений, чем это, вероятно, должно быть. Многие люди тратят время на отладку утечек памяти, повреждение памяти и т.д. Только потому, что используют неправильный инструмент для работы.

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