Очевидно, что массив ages
состоит из 50 элементов. А что можно сказать о массиве years? Оказывается, в программе нет такого массива. Описательсоздает не
Вот вызов нашей функции:
ages
- аргумент функции convert. Вы помните, что имя ages являетсяДействительно, операторы
синонимы. Оба они объявляют переменную years
указателем массива целых чисел. Однако главное их отличие состоит в том, что первый из них напоминает нам, что указатель years ссылается на массив.Как теперь связать его с массивом ages
? Вспомним, что при использовании указателя в качестве аргумента, функция взаимодействует с соответствующей переменной в вызывающей программе, т. е. операторы, использующие указатель years в функции соnvert(), фактически работают с массивом ages, находящимся в теле функции main().Посмотрим, как работает этот механизм. Во-первых, вызов функции инициализирует указатель years
, ссылаясь на ages[0]. Теперь предположим, что где-то внутри функции convert( ) есть выражение years[3]. Как вы видели в предыдущем разделе, оно аналогично *(years + 3). Однако если years указывает на ages[0], то years+3 ссылается на ages[3]. Это приводит к тому, что *(years+3) означает ages[3]. Если внимательно проследить данную цепочку, то мы увидим, что years[3] аналогично *(years + 3), которое в свою очередь совпадает с ages[3]. Что и требовалось доказать, т. е. операции над указателем years приводят к тем же результатам, что и операции над массивом ages.Короче говоря, когда имя массива применяется в качестве аргумента, функции передается указатель. Затем функция использует этот указатель для выполнения изменений в исходном массиве, принадлежащем программе, вызвавшей функцию. Рассмотрим пример.
ИСПОЛЬЗОВАНИЕ УКАЗАТЕЛЕЙ ПРИ РАБОТЕ С МАССИВАМИ
Попробуем написать функцию, использующую массивы, а затем перепишем ее, применяя указатели.
Рассмотрим простую функцию, которая находит (или пытается найти) среднее значение массива целых чисел. На входе функции мы имеем имя массива и количество элементов. На выходе получаем среднее значение, которое передастся при помощи оператора return
. Оператор вызова функции может выглядеть следующим образом:Эту программу легко переделать, применяя указатели. Объявим ра
указателем на тип int. Затем заменим элемент массива array[index] на соответствующее значение: *(ра + index).Это оказалось несложным, но возникает вопрос: должны ли мы изменить при этом вызов функции, в частности numbs
, который был именем массива в операторе mean(numbs, size)? Ничего не нужно менять, поскольку имя массиваи