Menu
CoddyTech

Имена массивов как указатели

Часть раздела Логика и управление потоком путешествия по C на Coddy. Урок 7 из 63.

Массивы и указатели в C тесно связаны, и эта связь лежит в основе того, как C работает с данными в памяти. Когда вы объявляете массив, само имя массива ведёт себя как константный указатель на первый элемент массива.

Это значит, что если у вас есть массив вроде int numbers[5];, то имя numbers по сути является указателем, который всегда указывает на numbers[0]. Имя массива можно считать встроенным указателем, который не нужно объявлять отдельно.

int numbers[5] = {10, 20, 30, 40, 50};
// 'numbers' указывает на первый элемент
// numbers == &numbers[0]  // Они эквивалентны!

Эта эквивалентность очень важна: numbers и &numbers[0] дают один и тот же адрес в памяти. Имя массива — просто более удобный способ сослаться на адрес первого элемента, не используя оператор взятия адреса.

Понимание этой связи позволяет применять к массивам приёмы работы с указателями, благодаря чему код становится гибче и эффективнее. Главное отличие в том, что, в отличие от обычных указателей, имена массивов — константные указатели: изменить то, на что они указывают, нельзя.

challenge icon

Задание

Легко

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

  1. Объявить целочисленный массив с именем numbers из 4 элементов и инициализировать его значениями {10, 20, 30, 40}
  2. Объявить указатель на целое число с именем ptr
  3. Присвоить имя массива numbers указателю ptr
  4. Вывести адрес, хранящийся в numbers, с помощью printf и спецификатора формата %p
  5. Вывести адрес первого элемента &numbers[0] с помощью printf и спецификатора формата %p
  6. Вывести адрес, хранящийся в ptr, с помощью printf и спецификатора формата %p
  7. Вывести значение первого элемента через имя массива: *numbers
  8. Вывести значение первого элемента через указатель: *ptr

Результат должен выводиться в следующем формате:

Array name address: [address]
First element address: [address]
Pointer address: [address]
Value via array name: 10
Value via pointer: 10

Это задание показывает, что имя массива ведёт себя как константный указатель на первый элемент и что numbers, &numbers[0] и ptr содержат один и тот же адрес в памяти, когда ptr присвоено имя массива.

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

#include <stdio.h>

int main() {
    // TODO: Напишите ваш код здесь
    // 1. Объявите и инициализируйте массив 'numbers' значениями {10, 20, 30, 40}
    // 2. Объявите указатель на целое число с именем 'ptr'
    // 3. Присвойте имя массива указателю
    // 4. Выведите все требуемые адреса и значения
    
    return 0;
}
quiz iconПроверьте себя

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

Все уроки раздела Логика и управление потоком

Потренируйтесь самостоятельно: Онлайн-компилятор C