«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Невысказанный вопрос: «Почему существуют указатели?»

Невысказанный вопрос: «Почему существуют указатели?»

Опубликовано 17 августа 2024 г.
Просматривать:639

The unspoken question: \

Это действительно правильный вопрос

Это не типичный вопрос ненавистников указателей, а скорее очень интересный.


Вот что я имею в виду

Указатели — это очень мощная концепция, но это именно то, что есть: концепция. Так почему же компилятор C был изобретен с таким изолированным фрагментом логики и синтаксиса, предназначенным для указателей?

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


Более глубокий взгляд

Если вы посмотрите на структуру указателя, то это, по сути, беззнаковый long (он же 4[32-битная система] или 8 байтов в памяти). То, что отличает указатели от беззнаковых длинных значений, — это особенности, специфичные для указателей.

Синтаксис и оператор разыменования

Указатель имеет собственный синтаксис объявления и собственный оператор: разыменование.

int a = 5;
int *ptr = &a; //declaration
int value = *ptr; //dereference

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

int a = 5;
unsigned long adress = &a;
int value = *adress;

В этом случае вы можете сделать что-то вроде этого:

int firstIntInMemory = *(0); //manually dereferences (4bytes at) adress 0`

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

Указательная арифметика

Единственная особенность арифметики указателей — это учет размеров шрифтов при вычислениях. Когда у меня есть массив и я хочу получить второй элемент, я просто добавляю 1 к указателю. Если это указатель int, это неявно фактически добавит к адресу значение 4 (если sizeof(int) == 4 в вашей системе):

int arr[5] = {1,2,3,4,5};
int second = *(arr   1);

Но давайте будем честными, следующее на самом деле гораздо более логично, если вы интуитивно думаете о памяти:

int arr[5] = {1,2,3,4,5};
int second = *(arr   sizeof(int));

И это будет просто стандартная целочисленная арифметика. Если посмотреть на это с такой стороны, то вообще нет смысла изобретать арифметику указателей.


Это еще не все

Конечно, синтаксис '*' делает предполагаемое использование намного более ясным. Если вы это увидите, вы сразу поймете, что эта переменная используется для манипуляций с памятью. Кроме того, каждая библиотечная функция управления памятью предназначена для указателей.

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


Последнее слово

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

Я считаю эту историю интересной для более глубокого изучения.
Почему C изобрел указатель?
Была ли это именно та причина, по которой мы ожидаем: последовательность, ясность и безопасность от неправильного использования разыменования?
Или есть более глубокая причина и гораздо более сложная логика, чем то, что я рассмотрел в этом посте об указателях, что делает их на самом деле значительно более эффективными, чем то же самое с целыми числами общего назначения?

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/ebbewertz/a-dangerous-question-why-do-pointers-exist-dkd. Если есть какие-либо нарушения, свяжитесь с [email protected], чтобы удалить их.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3