C — это урезанный язык. Он предоставляет доступ к «голубому металлу» (аппаратному обеспечению). В нём даже нет функций для чтения с клавиатуры или записи на экран. Если вам это нужно, вы должны реализовать это самостоятельно.

Всё, что выходит за рамки абсолютного минимума, находится в библиотеках.

Вы знаете библиотеку stdio. Она обрабатывает стандартный ввод и вывод. Есть другие библиотеки для математики. Обработки строк. Работы со временем. Они существуют для того, чтобы вам не приходилось изобретать велосипед каждый раз, когда вы начинаете новый проект.

Но зачем останавливаться на том, что предоставляет стандарт?

Размещение кода в библиотеках делает его повторно используемым. Это позволяет разбивать огромные программы на управляемые модули. Проще тестировать. Проще отлаживать. Вы можете брать код из своих старых проектов и вставлять его в новые без копирования и вставки блоков логики.

Давайте посмотрим, как это сделать.

Извлечение логики в функции

Возьмем стандартную программу на C, которая заполняет массив случайными числами и сортирует их. Вот исходный код:

Этот код делает три вещи. Он заполняет массив случайными числами. Сортирует их с помощью пузырьковой сортировки. Выводит результат.

Чтобы создать повторно используемую библиотеку, нам нужно изолировать логику сортировки.

Шаг первый: Обобщение сортировки

Извлеките код пузырьковой сортировки. Превратите его в функцию.

Поскольку массив a и константа MAX являются глобальными, функции изначально не нужны параметры. Она также не должна возвращать значение. Просто используйте локальные переменные для x, y и t.

Теперь обновите main, чтобы вызвать эту функцию вместо выполнения встроенного цикла.

Это работает. Но оно всё ещё привязано к глобальному массиву.

Шаг второй: Передача массива

Мы можем сделать функцию сортировки по-настоящему универсальной. Передайте сам массив в качестве параметра.

Сигнатура изменится на:

Это указывает компилятору принимать целочисленный массив любого размера. Тело функции остается совершенно тем же самым. Вам нужно просто обновить вызов в main :

Заметили что-то странное? Мы передаем a, а не &a.

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

Это связано с тем, что в C массивы превращаются в указатели при передаче в функции. Функция получает ссылку на начало массива в памяти. Вот почему она может изменять исходные данные.

Понимание этого различия является ключом к освоению указателей. Без этого C-библиотеки — это просто статические блоки кода. С ним вы строите модульные, портативные системы.