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