Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
111111111.docx
Скачиваний:
3
Добавлен:
17.04.2019
Размер:
131.57 Кб
Скачать

Вопрос 23

Указатели на указатели.

В языке Си можно описать и переменную типа «указатель на указатель». Это ячейка оперативной памяти, в которой будет храниться адрес указателя на какую либо переменную. Признак такого типа данных – повторение символа «*» перед идентификатором переменной. Количество символов «*» определяет уровень вложенности указателей друг в друга. При объявлении указателей на указатели возможна их одновременная инициализация. Например:

int y=5;

int *p1=&y;

int **pp1=&p1;

int ***ppp1=&pp1;

Теперь присвоим целочисленной переменной y новое значение, например 10. Одинаковое присваивание произведут следующие операции:

y=10; *p1=10; **pp1=10; ***ppp1=10;

Для доступа к области ОП, отведенной под переменную y можно использовать и индексы. Справедливы следующие аналоги:

*p1 p1[0] **pp1 pp1[0][0] ***ppp1 ppp1[0][0][0]

Массивы указателей.

Указатели, как и переменные любого другого типа, могут объединяться в массивы. Объявление массива указателей на целые числа имеет вид:

int *b[10], y;

Теперь каждому из элементов массива можно присвоить адрес целочи­сленной переменной y, например: b[1]=&y;

Чтобы теперь найти значение переменной y через данный элемент массива а, необходимо записать *b[1].

Вопрос 24

Функции пользователя и классы памяти.

Сущность и предназначение функций.

С увеличением объема программы ее код становится все более сложным. Одним из способов борьбы со сложностью любой задачи является ее разбиение на части.

В языке Cи, как и в любом языке программирования высокого уровня, задача может быть разбита на более простые подзадачи при помощи подпрограмм-функций. После этого программу можно рассматривать в более укрупненном виде – на уровне взаимодействия созданных подпрограмм. Использование подпрограмм в коде программы ведет к упрощению ее структуры.

Разделение программы на подзадачи позволяет также избежать избыточности кода, поскольку функцию записывают один раз, а вызывать ее на выполнение можно многократно из разных точек программы. Кроме того, упрощается процесс отладки программы, содержащей подпрограммы. Часто используемые функции можно помещать в отдельные библиотеки.

Следующим шагом может являться группировка функций и связанных с ними данных в отдельные файлы (модули), компилируемые раздельно. Получившиеся в результате компиляции объектные модули объединяются в исполняемую программу с помощью компоновщика (Linker). Разбиение на модули уменьшает время перекомпиляции и облегчает процесс отладки, скрывая несущественные детали за интерфейсом модуля, что позволяет отлаживать программу по частям. Для того чтобы использовать модуль, достаточно знать только его интерфейс (названия функций и их параметры), а не все детали его реализации.

Разделение программы на максимально обособленные части (подпрограммы) является довольно сложной задачей, которая должна решаться на этапе проектирования программы.

В отличие от других языков программирования высокого уровня в языке Си нет разделения на подпрограммы-процедуры и подпрограммы-функции, здесь любая подпрограмма является функцией.

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

"Основная часть" программы в языке Си также считается функцией - функцией main (основная, главная), с которой и начинается выполнение программы. Функциями являются и обработчики событий (например, Button1Click) в оконных приложениях. Таким образом, любая программа на языке Cи состоит из функций.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]