Имена массивов как указатели
Часть раздела Логика и управление потоком путешествия по C на Coddy. Урок 7 из 63.
Массивы и указатели в C имеют особую взаимосвязь, которая fundamental для понимания того, как C работает с data в памяти. Когда вы объявляете массив, его имя array само действует как постоянный pointer на first element массива.
Это означает, что когда у вас есть массив, такой как 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] оба дают один и тот же точный адрес памяти. Имя array — это просто более удобный способ обратиться к адресу элемента first, не используя оператор взятия адреса.
Понимание этой взаимосвязи открывает путь к использованию методов работы с указателями вместе с массивами, что может сделать ваш код более гибким и эффективным. Ключевое различие заключается в том, что, в отличие от обычных указателей, имена массивов являются постоянными указателями — вы не можете изменить объект, на который они указывают.
Задание
ЛегкоНапишите программу на C, демонстрирующую эквивалентность имён array и указателей на их first elements. Ваша программа должна:
- Объявить integer array с именем
numbers, содержащий 4 элемента, и инициализировать его значениями {10, 20, 30, 40} - Объявить pointer на integer с именем
ptr - Присвоить имя array
numbersуказателюptr - Вывести address, хранящийся в
numbers, используяprintfсо спецификатором формата%p - Вывести address first element
&numbers[0], используяprintfсо спецификатором формата%p - Вывести address, хранящийся в
ptr, используяprintfсо спецификатором формата%p - Вывести значение first element, используя имя array:
*numbers - Вывести значение first element, используя pointer:
*ptr
Ваш вывод должен отображать результаты в следующем формате:
Array name address: [address]
First element address: [address]
Pointer address: [address]
Value via array name: 10
Value via pointer: 10Это задание демонстрирует, что имя array действует как постоянный pointer на first element и что numbers, &numbers[0] и ptr содержат один и тот же адрес памяти, когда ptr присвоено имя array.
Попробуйте сами
#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