Какова разница между использованием указателей и обычными способами при работе с массивами в программировании?

Какова разница между записями `*current = (*current-1) + (*current-2)` и `*current = *(current-1) + *(current-2)` в контексте заполнения массива числами Фибоначчи в предоставленной функции `array_fib`?
  • 5 декабря 2023 г. 10:01
Ответы на вопрос 3
Работа с массивами в программировании через указатели и через обычные индексированные переменные имеет несколько отличий:

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`.
Проблема в том, что * выполняется перед вычетанием.*(current-1)- это предыдущий элемент.(*current-1)в плохой версии - это текущее значение минус 1.
Приоритет операции * выше, чем у -
Похожие вопросы