Работа с массивами в программировании через указатели и через обычные индексированные переменные имеет несколько отличий:
1. Производительность:
- Использование указателей может быть эффективнее, поскольку обращение к элементам массива через указатели устраняет необходимость многократного вычисления смещений относительно базового адреса массива.
- Индексированный доступ обычно предполагает подсчёт смещения от базового адреса на каждый доступ к элементу, что может быть менее эффективно.
2. Указатели предоставляют более низкоуровневый доступ:
- Работая с указателями, вы оперируете непосредственно адресами в памяти, что позволяет более гибко управлять данными.
- Индексированный доступ скрывает от вас работу с адресами, делая код более понятным и менее подверженным ошибкам, связанным с арифметикой указателей.
3. Арифметика указателей:
- Указатели позволяют легко перемещаться вперед и назад по массиву с помощью арифметических операций, таких как инкремент, декремент и добавление/вычитание конкретных значений.
- При использовании индексов арифметические операции выполняются над самими индексами.
Теперь давайте разберемся с разницей между записями `*current = (*current-1) + (*current-2)` и `*current = *(current-1) + *(current-2)`:
Пусть `current` является указателем на текущий элемент массива, в котором мы хотим хранить числа Фибоначчи. Поскольку речь идет о заполнении массива, мы ожидаем, что `current` будет указывать на элемент типа `int` (или другого числового типа), например.
- `*current = (*current-1) + (*current-2)`: здесь `(*current-1)` и `(*current-2)` скорее всего являются ошибками, поскольку они пытаются вычесть 1 и 2 из значения, на которое указывает `current`, а не из самого указателя. Это не имеет смысла для задачи вычисления чисел Фибоначчи, так как нам необходимо получить значения предыдущих двух чисел Фибоначчи, а не уменьшить текущее значение на 1 и 2.
- `*current = *(current-1) + *(current-2)`: эта запись корректна в контексте вычисления чисел Фибоначчи. Здесь `(current-1)` и `(current-2)` уменьшают сам указатель так, чтобы он указывал на предыдущие два элемента в массиве. Затем с помощью оператора разыменования `*` (например, `*(current-1)`) мы получаем значение элемента массива, который расположен перед текущим, и предпредыдущего элемента. Складывая эти два значения, мы получаем следующее число Фибоначчи и присваиваем его текущему элементу массива через `*current`.