Menu
Coddy logo textTech

Элементы массива — указатели

Часть раздела Logic & Flow путешествия по C на Coddy — урок 8 из 63.

Теперь, когда вы понимаете, как имена массивов работают в качестве указателей, вы можете использовать эти знания для доступа к элементам массива совершенно другим способом. Вместо использования привычной нотации в квадратных скобках, такой как array[i], вы можете использовать указательную нотацию для достижения того же результата.

Ключевое понимание заключается в том, что array[i] точно эквивалентно *(array + i). Когда вы пишете array + i, вы указываете C переместиться на i позиций вперед от начала массива. Оператор разыменования * затем получает значение по этому адресу.

int numbers[5] = {10, 20, 30, 40, 50};
// Эти две строки делают одно и то же:
printf("%d", numbers[2]);    // Выводит 30
printf("%d", *(numbers + 2)); // Также выводит 30

Эта указательная нотация работает, потому что C автоматически вычисляет правильный адрес памяти на основе размера типа данных. Когда вы прибавляете 2 к указателю на целочисленный массив, C перемещается вперед на 2 × sizeof(int) байт, попадая точно на третий элемент.

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

challenge icon

Задание

Легко

Напишите программу на языке C, которая демонстрирует доступ к элементам массива с использованием указательной нотации вместо традиционной индексации массива. Ваша программа должна:

  1. Объявить целочисленный массив с именем values из 6 элементов и инициализировать его значениями {5, 15, 25, 35, 45, 55}
  2. Использовать цикл for для итерации по всем элементам массива
  3. Внутри цикла использовать указательную нотацию *(values + i) для доступа к каждому элементу (не используйте квадратные скобки, такие как values[i])
  4. Вывести каждый элемент, используя метод доступа через указательную нотацию
  5. После цикла продемонстрировать эквивалентность, выведя третий элемент (индекс 2) обоими способами:
    • Сначала с использованием указательной нотации: *(values + 2)
    • Затем с использованием традиционной нотации массива: values[2]

Ваш вывод должен отображать результаты в следующем формате:

Element 0: 5
Element 1: 15
Element 2: 25
Element 3: 35
Element 4: 45
Element 5: 55
Third element via pointer: 25
Third element via array: 25

Эта задача проверяет ваше понимание эквивалентности между array[i] и *(array + i), демонстрируя, как арифметика указателей позволяет получать доступ к элементам массива с помощью вычислений адресов памяти вместо традиционной индексации.

Шпаргалка

К элементам массива можно обращаться, используя указательную нотацию вместо нотации с квадратными скобками. Выражение array[i] эквивалентно *(array + i).

Когда вы пишете array + i, C перемещается на i позиций вперед от начала массива. Оператор разыменования * получает значение по этому адресу.

int numbers[5] = {10, 20, 30, 40, 50};
// These two lines do exactly the same thing:
printf("%d", numbers[2]);    // Prints 30
printf("%d", *(numbers + 2)); // Also prints 30

C автоматически вычисляет правильный адрес памяти на основе размера типа данных. Прибавление 2 к указателю на целочисленный массив перемещает его вперед на 2 × sizeof(int) байт.

Попробуйте сами

#include <stdio.h>

int main() {
    // TODO: Напишите свой код здесь
    // Объявите и инициализируйте массив 'values' из 6 элементов
    // Используйте цикл for для вывода каждого элемента, используя указательную нотацию *(values + i)
    // После цикла выведите третий элемент, используя как указательную, так и массивную нотацию
    
    return 0;
}
quiz iconПроверьте себя

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

Все уроки раздела Logic & Flow