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