Процедурное программирование на языке С. Часть 2. Указатели на объекты. Многоуровневая адресация: Методические указания к лабораторным работам по курсам «Алгоритмические языки и программирование» и «Процедурное программирование», страница 10

Функция f1(), тип функции – void, получая через параметры одномерный массив, определяет количество четных номеров элементов массива, формирует новый массив,  состоящий из этих элементов,  передает в точку вызова  размер нового массива и значения его элементов.

Вариант 24. В программе описать 3 функции.

Функция f1(), тип функции – void, осуществляет  ввод  m – размера  одномерного массива, а[i] –  значений элементов массива (предварительно под массив в теле функции  динамически  выделяется  память),  передает в главную m, a[i], i=1,...m,  а также a_max2, второй по величине элемент массива, который определяется в функции f1()   после 2-х вызовов функции f2().

Функция f2(), получая через параметры одномерный массив,  осуществляет поиск и возврат в точку вызова значение его максимального элемента.

Главная функция получает размер массива, значения всех его элементов (а также  a_max2) после вызова f1(),   увеличивает каждый элемент массива на a_max2 и выводит на экран  элементы нового массива.

Вариант 25. В программе описать 3 функции.

Функция f1()  осуществляет  ввод  m – размера  одномерного  массива,  а[i] –значений элементов массива (предварительно под массив в теле функции динамически выделяется память), передает в главную m и a[i], i=1,...m.

Функция f2(),  получая через параметры одномерный массив, динамически выделяет  память под новый массив. Каждый элемент нового массива – это адрес соответствующего элемента  исходного массива.

Главная функция получает размер массива и значения его  элементов после вызова f1(),   вызывает f2()  и выводит на экран элементы нового массива, сформированного в f2().

 ТЕОРЕТИЧЕСКИЙ   МАТЕРИАЛ

5.1. КОНЦЕПЦИЯ МНОГОУРОВНЕВОЙ АДРЕСАЦИИ

Многоуровневая адресация необходима для 

·  передачи значений нескольких объектов из вызываемой функции в вызывающую  с использованием адресов этих объектов;

·  моделирования многомерных массивов (и динамических, и статических).

В соответствии с оператором объявления переменных simи A_simс инициализацией                 charsim = ‘R’, * A_sim = ∼

в оперативной памяти будет выделено 2 участка:

simA_sim

R

 
 


     32000           15000  15001 

Для хранения адреса переменной A_sim необходимо объявить переменную-указатель AA_sim. В соответствии с синтаксисом языка С в операторе объявления переменной-указателя

<спецификация типа > * <имя переменной>;          объявляется переменная с

                                                                  именем, которая является

                                                                    указателем на переменную

                                                                       типа

В данном случае <имя переменной> – это идентификатор, соответствующий переменной AA_sim, предназначенной для хранения  адреса переменной A_sim,  тип которой – char *, поэтому в качестве <спецификации типа>  используется char *. Таким образом, оператор объявления переменной с инициализацией имеет вид:   char * * AA_sim = &A_sim;

и в оперативной памяти добавится третий участок:

simA_sim           AA_sim

R

 
 


     32000          15000 15001 15002 15003     

Последний оператор объявления демонстрирует двухуровневую адресацию: значением переменной-указателя AA_simявляется адрес переменной-указателя A_sim, значением которой является адрес переменной символьного типа.

Аналогично можно объявить переменную ptr, предназначенную для хранения адреса переменной        AA_sim :   char * * * ptr = &AA_sim;

тогда в оперативной памяти добавится четвертый участок: 

simA_sim              AA_sim              ptr

R

 
 


    32000           15000 15001 15002 15003 15004 15005