Это не типичный вопрос ненавистников указателей, а скорее очень интересный.
Указатели — это очень мощная концепция, но это именно то, что есть: концепция. Так почему же компилятор 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 изобрел указатель?
Была ли это именно та причина, по которой мы ожидаем: последовательность, ясность и безопасность от неправильного использования разыменования?
Или есть более глубокая причина и гораздо более сложная логика, чем то, что я рассмотрел в этом посте об указателях, что делает их на самом деле значительно более эффективными, чем то же самое с целыми числами общего назначения?
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3