Почему C++ использует указатели? [закрытый]

Вы можете отключить проверку SSL HttpURLConnection для целей тестирования, так как API 8:

    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    if (conn instanceof HttpsURLConnection) {
        HttpsURLConnection httpsConn = (HttpsURLConnection) conn;
        httpsConn.setSSLSocketFactory(SSLCertificateSocketFactory.getInsecure(0, null));
        httpsConn.setHostnameVerifier(new AllowAllHostnameVerifier());
    }
12
задан RCIX 4 July 2009 в 09:46
поделиться

13 ответов

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

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

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

55
ответ дан 2 December 2019 в 02:49
поделиться

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

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

17
ответ дан 2 December 2019 в 02:49
поделиться

Может быть, C ++ не для новичков.

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

26
ответ дан 2 December 2019 в 02:49
поделиться

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

12
ответ дан 2 December 2019 в 02:49
поделиться

Здесь много хороших ответов, но не так много хороших примеров, почему это необходимо . ... Или почему C иногда называют «переносимым языком ассемблера».

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

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

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

Такие языки, как F #, C #, Ruby, Python, Lua и т. Д., Не могут сделать это без изменения основного языка. C и 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.
11
ответ дан 2 December 2019 в 02:49
поделиться

Вы смешиваете арифметику указателей с неизменяемыми указателями, 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 () изменяет значение yz, и это именно то, что произошло бы в соответствующем коде C или C ++, написанном с помощью указателей.

10
ответ дан 2 December 2019 в 02:49
поделиться

Я бы не рекомендовал их использовать, так как прочитал этот комментарий:

«Самая большая проблема с классом помощники, от первого лица их использования в ваших собственных приложениях, это факт что только ОДИН помощник класса для данного class может быть в области видимости в любое время ". ... "То есть, если у вас есть два помощника по объему будет признан только ОДИН компилятором. Вы не получите ничего предупреждения или даже намеки на любые другие размера кода и любых других ограниченных ресурсов.

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

4
ответ дан 2 December 2019 в 02:49
поделиться

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

1
ответ дан 2 December 2019 в 02:49
поделиться

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

Foo myObject();

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

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

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

1
ответ дан 2 December 2019 в 02:49
поделиться

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

1
ответ дан 2 December 2019 в 02:49
поделиться

Зачем C ++ нужны и используются указатели?

C ++ ничего не нужно. Они нужны программистам, и есть программисты, которым действительно они нужны. Как программисты, создающие драйверы устройств.

Итак, должны быть некоторые языки, разрешающие прямой доступ к памяти. C ++ оказывается одним из таких языков.

4
ответ дан 2 December 2019 в 02:49
поделиться

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

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

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

0
ответ дан 2 December 2019 в 02:49
поделиться

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

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

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

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

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

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

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

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

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

0
ответ дан 2 December 2019 в 02:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: