Имена массивов как указатели
Часть раздела 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] оба дают один и тот же адрес памяти. Имя массива — это просто более удобный способ обращения к адресу первого элемента без необходимости использовать оператор взятия адреса.
Понимание этой взаимосвязи открывает возможности для использования техник работы с указателями применительно к массивам, что может сделать ваш код более гибким и эффективным. Ключевое отличие заключается в том, что, в отличие от обычных указателей, имена массивов являются константными указателями — вы не можете изменить то, на что они указывают.
Задание
ЛегкоНапишите программу на языке C, которая демонстрирует эквивалентность имен массивов и указателей на их первые элементы. Ваша программа должна:
- Объявить целочисленный массив с именем
numbersиз 4 элементов и инициализировать его значениями {10, 20, 30, 40} - Объявить указатель на целое число с именем
ptr - Присвоить имя массива
numbersуказателюptr - Вывести адрес, хранящийся в
numbers, используяprintfсо спецификатором формата%p - Вывести адрес первого элемента
&numbers[0], используяprintfсо спецификатором формата%p - Вывести адрес, хранящийся в
ptr, используяprintfсо спецификатором формата%p - Вывести значение первого элемента, используя имя массива:
*numbers - Вывести значение первого элемента, используя указатель:
*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;
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Logic & Flow
1Основы указателей
Что такое указатель?Объявление указателейОператор взятия адреса (&)Оператор разыменования (*)Указатели NULLИтоги: Основы указателей4Проект: Простая текстовая утилита
Обзор проектаПодсчет символов2Указатели и массивы
Имена массивов как указателиЭлементы массива — указателиАрифметика указателейСравнение указателейИтоги: Обход массива через указатели5Указатели и функции
Передача по значениюПередача указателей в функцииИзменение переменных через указателиКлассический пример: SwapПередача массивов в функцииИтоги: указатели как аргументы функций8Структуры и указатели
Указатели на структурыОператор «стрелка» (->)Передача структур по значениюПередача указателей на структурыДинамическое выделение памяти для структурИтоги: Изменение структур через указатели11Итоговые задачи на повторение
Повторение: динамическая конкатенация строкПовторение: массив структурПовторение: счетчик частоты слов3Символьные массивы и строки
Строки как массивы charНуль-терминаторВвод строк с помощью scanfИспользование strlen()Использование strcpy()Использование strcat()Использование strcmp()Итоги: основные строковые функции