Как передавать одномерные и двумерные массивы в функции в C — практическое руководство
Как передавать одномерные и двумерные массивы в функции в C
В этом руководстве объясняется, как передавать целые массивы — как одномерные, так и многомерные — в функции на языке C, с понятными примерами кода и рекомендациями по лучшим практикам.
В C имя массива при передаче в функцию преобразуется в указатель, что позволяет функции работать с исходными данными без их копирования. Понимание этого поведения необходимо для написания эффективного и поддерживаемого кода.
Передача отдельных элементов массива
Передача отдельного элемента ничем не отличается от передачи любого примитивного типа.
Пример 1: Передача отдельных элементов массива
#include <stdio.h>
void display(int age1, int age2) {
printf("%d\n", age1);
printf("%d\n", age2);
}
int main() {
int ageArray[] = {2, 8, 4, 12};
// Передаем второй и третий элементы в display()
display(ageArray[1], ageArray[2]);
return 0;
}
Вывод
8 4
Здесь мы передаем ageArray[1] и ageArray[2] как обычные переменные. Функция получает их по значению, поэтому исходный массив остается неизменным.
Передача целых одномерных массивов
Чтобы передать весь массив в функцию, достаточно указать имя массива. Прототип функции должен указывать параметр-массив, но фактический размер можно опустить. Компилятор рассматривает параметр как указатель на первый элемент.
Пример 2: Вычисление суммы элементов массива
#include <stdio.h>
float calculateSum(float num[]);
int main() {
float result, num[] = {23.4, 55, 22.6, 3, 40.5, 18};
// Передаем весь массив в calculateSum()
result = calculateSum(num);
printf("Result = %.2f", result);
return 0;
}
float calculateSum(float num[]) {
float sum = 0.0;
for (int i = 0; i < 6; ++i) {
sum += num[i];
}
return sum;
}
Вывод
Result = 162.50
Сигнатура функции float calculateSum(float num[]) сообщает компилятору, что num — это указатель на массив float. Цикл обрабатывает массив на месте без копирования.
Передача многомерных массивов
Многомерные массивы следуют тому же принципу: имя массива преобразуется в указатель на первую строку. Однако компилятор должен знать размеры всех измерений, кроме первого. Это необходимо для вычисления правильных смещений в памяти.
Пример 3: Передача двумерного массива
#include <stdio.h>
void displayNumbers(int num[2][2]);
int main() {
int num[2][2];
printf("Введите 4 числа:\n");
for (int i = 0; i < 2; ++i) {
for (int j = 0; j < 2; ++j) {
scanf("%d", &num[i][j]);
}
}
// Передаем двумерный массив в функцию
displayNumbers(num);
return 0;
}
void displayNumbers(int num[2][2]) {
printf("Вывод:\n");
for (int i = 0; i < 2; ++i) {
for (int j = 0; j < 2; ++j) {
printf("%d\n", num[i][j]);
}
}
}
Вывод
Введите 4 числа: 2 3 4 5 Вывод: 2 3 4 5
Прототип функции void displayNumbers(int num[2][2]) объявляет целочисленный массив 2×2. При вызове функции мы просто передаем num; компилятор автоматически обрабатывает преобразование указателя.
Обратите внимание: размер строки можно опустить, но размер столбца обязателен: int num[][2] — допустимо, тогда как размер столбца необходим для вычисления адресов.
Важно: C позволяет передавать массивы в функции, но не поддерживает возврат массивов из функций напрямую. Используйте указатели или структуры, если нужно вернуть сложные данные.
Язык C
- Массивы в C#: объявление, инициализация и операции
- Типы данных в C: int, float, char и другие — полное руководство
- Оператор pass в Python: практическое руководство
- Аргументы функций в Python: позиционные, именованные и параметры по умолчанию
- Замыкания в Python: как вложенные функции захватывают переменные
- Битовые поля в C: компактное хранение флагов и малых целых чисел
- Освоение ввода-вывода файлов в C: создание, открытие и управление файлами
- Функции с переменным числом аргументов в C: практическое руководство
- Полиморфизм в C++: практическое руководство
- Методы в C#: определение, вызов, рекурсия и параметры