Передача массивов в функции
Часть раздела Logic & Flow путешествия по C на Coddy — урок 29 из 63.
Когда вы передаете массив в функцию на языке C, за кулисами происходит кое-что интересное. Сам массив на самом деле не копируется в функцию. Вместо этого передается указатель на первый элемент массива.
Это означает, что когда вы записываете параметр функции как int arr[] или int *arr, оба варианта эквивалентны — они оба представляют собой указатель на первый элемент массива. Функция получает адрес памяти, с которого начинается массив, что дает ей прямой доступ к данным исходного массива.
void printArray(int arr[], int size) {
// arr на самом деле является указателем на первый элемент
// Функция может получать доступ к исходному массиву и изменять его
}Поскольку функция работает с адресом в памяти оригинального массива, а не с его копией, любые изменения, внесенные внутри функции, затронут исходный массив. Это отличается от передачи отдельных переменных, при которой создаются копии.
Вы также заметите, что вам нужно передать размер массива в качестве отдельного параметра, так как функция не может определить длину массива только по указателю.
Задание
ЛегкоНапишите программу на языке C, которая демонстрирует передачу массивов в функции, создав функцию для обработки данных о температуре. Ваша программа должна:
- Создать функцию с именем
analyzeTemperatures, которая принимает целочисленный массив и его размер в качестве параметров - Внутри функции
analyzeTemperaturesвычислить и вывести среднюю температуру ровно с 1 десятичным знаком в формате:Average temperature: [value] - Внутри функции
analyzeTemperaturesнайти и вывести самую высокую температуру в формате:Highest temperature: [value] - Внутри функции
analyzeTemperaturesподсчитать, сколько температур превышает 25 градусов, и вывести это количество в формате:Days above 25 degrees: [count] - В функции
mainпрочитать целое числоn, представляющее количество показаний температуры - Прочитать
nзначений температуры и сохранить их в целочисленном массиве - Вызвать функцию
analyzeTemperatures, передав ей массив и его размер
Ваша программа должна обработать данные о температуре и отобразить результаты анализа. Например, если на вход подается:
5
20 28 15 32 26Ваш вывод должен быть следующим:
Average temperature: 24.2
Highest temperature: 32
Days above 25 degrees: 3Эта задача демонстрирует, как массивы передаются в функции в виде указателей на их первый элемент, что позволяет функции получать доступ и обрабатывать все элементы исходного массива без создания копии.
Шпаргалка
При передаче массивов в функции в C сам массив не копируется. Вместо этого передается указатель на первый элемент.
И int arr[], и int *arr являются эквивалентными параметрами функции — они представляют собой указатель на первый элемент:
void printArray(int arr[], int size) {
// arr на самом деле является указателем на первый элемент
// Функция может обращаться к исходному массиву и изменять его
}Ключевые моменты:
- Функции получают адрес памяти, где начинается массив
- Изменения, внесенные внутри функции, влияют на исходный массив
- Размер массива должен передаваться как отдельный параметр, так как функция не может определить длину только по указателю
Попробуйте сами
#include <stdio.h>
// TODO: Создайте здесь функцию analyzeTemperatures
int main() {
// Считать количество показаний температуры
int n;
scanf("%d", &n);
// Объявить массив для хранения температур
int temperatures[n];
// Считать значения температуры
for (int i = 0; i < n; i++) {
scanf("%d", &temperatures[i]);
}
// TODO: Вызовите здесь функцию analyzeTemperatures
return 0;
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Logic & Flow
1Основы указателей
Что такое указатель?Объявление указателейОператор взятия адреса (&)Оператор разыменования (*)Указатели NULLИтоги: Основы указателей4Проект: Простая текстовая утилита
Обзор проектаПодсчет символов2Указатели и массивы
Имена массивов как указателиЭлементы массива — указателиАрифметика указателейСравнение указателейИтоги: Обход массива через указатели5Указатели и функции
Передача по значениюПередача указателей в функцииИзменение переменных через указателиКлассический пример: SwapПередача массивов в функцииИтоги: указатели как аргументы функций8Структуры и указатели
Указатели на структурыОператор «стрелка» (->)Передача структур по значениюПередача указателей на структурыДинамическое выделение памяти для структурИтоги: Изменение структур через указатели11Итоговые задачи на повторение
Повторение: динамическая конкатенация строкПовторение: массив структурПовторение: счетчик частоты слов3Символьные массивы и строки
Строки как массивы charНуль-терминаторВвод строк с помощью scanfИспользование strlen()Использование strcpy()Использование strcat()Использование strcmp()Итоги: основные строковые функции