Menu
Coddy logo textTech

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

Часть раздела Logic & Flow путешествия по 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 присвоено имя массива.

Шпаргалка

Имена массивов в C действуют как константные указатели на первый элемент массива.

Когда вы объявляете массив, имя массива указывает на первый элемент:

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

Вы можете присвоить имя массива указателю:

int *ptr;
ptr = numbers;  // ptr теперь указывает на первый элемент

Доступ к значениям с использованием нотации указателей:

*numbers  // Значение первого элемента через имя массива
*ptr      // Значение первого элемента через указатель

Ключевое отличие: Имена массивов являются константными указателями — вы не можете изменить то, на что они указывают, в отличие от обычных указателей.

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

#include <stdio.h>

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

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

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