Элементы массива — указатели
Часть раздела 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.
Задание
ЛегкоНапишите программу на языке C, которая демонстрирует доступ к элементам массива с использованием указательной нотации вместо традиционной индексации массива. Ваша программа должна:
- Объявить целочисленный массив с именем
valuesиз 6 элементов и инициализировать его значениями {5, 15, 25, 35, 45, 55} - Использовать цикл for для итерации по всем элементам массива
- Внутри цикла использовать указательную нотацию
*(values + i)для доступа к каждому элементу (не используйте квадратные скобки, такие какvalues[i]) - Вывести каждый элемент, используя метод доступа через указательную нотацию
- После цикла продемонстрировать эквивалентность, выведя третий элемент (индекс 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 30C автоматически вычисляет правильный адрес памяти на основе размера типа данных. Прибавление 2 к указателю на целочисленный массив перемещает его вперед на 2 × sizeof(int) байт.
Попробуйте сами
#include <stdio.h>
int main() {
// TODO: Напишите свой код здесь
// Объявите и инициализируйте массив 'values' из 6 элементов
// Используйте цикл for для вывода каждого элемента, используя указательную нотацию *(values + i)
// После цикла выведите третий элемент, используя как указательную, так и массивную нотацию
return 0;
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Logic & Flow
1Основы указателей
Что такое указатель?Объявление указателейОператор взятия адреса (&)Оператор разыменования (*)Указатели NULLИтоги: Основы указателей4Проект: Простая текстовая утилита
Обзор проектаПодсчет символов2Указатели и массивы
Имена массивов как указателиЭлементы массива — указателиАрифметика указателейСравнение указателейИтоги: Обход массива через указатели5Указатели и функции
Передача по значениюПередача указателей в функцииИзменение переменных через указателиКлассический пример: SwapПередача массивов в функцииИтоги: указатели как аргументы функций8Структуры и указатели
Указатели на структурыОператор «стрелка» (->)Передача структур по значениюПередача указателей на структурыДинамическое выделение памяти для структурИтоги: Изменение структур через указатели11Итоговые задачи на повторение
Повторение: динамическая конкатенация строкПовторение: массив структурПовторение: счетчик частоты слов3Символьные массивы и строки
Строки как массивы charНуль-терминаторВвод строк с помощью scanfИспользование strlen()Использование strcpy()Использование strcat()Использование strcmp()Итоги: основные строковые функции