Передача массива в функцию и возврат из функции

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

Это можно сделать по-разному, но результат будет одинаковый:

При этом обязательно нужно указать тип элемента массива.

Размер массива в функцию автоматически не передается, поэтому если размер массива заранее (на этапе компиляции) не оговорен, то нужно передать параметр, который содержит количество элементов в массиве, например number_of_elements:

void some_function(int array[], int number_of_elements);

Следующая программа передает массивы в функцию show_array, которая использует цикл for для вывода значений массивов:

show_array.c

#include <stdio.h>

void show_array (int array [], int number_of_elements)
{
   for (int i = 0; i < number_of_elements; i++) {
      
printf("%d\t", array[i]);
   }
   printf("\n");
}

int main()
{
   int little_numbers[5] = {1, 2, 3, 4, 5};
   int big_numbers[3] = {1000, 2000, 3000};
   show_array(little_numbers, 5);
   show_array(big_numbers, 3);
}

 

Массив просто передается в функцию по имени (а его имя — это адрес первого элемента), а также указывает параметр, который сообщает функции количество элементов, содержащихся в массиве:

    show_array(little_numbers, 5);

Изменение массива из функции

Возможно ли поменять значения элементов из функции?

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

Следующая программа использует функцию get_values, чтобы присвоить три значения массиву numbers:

values_from_keyboard.c

#include <stdio.h>
void read_array(int array[], int number_of_elements)
{
   for(int i = 0; i < number_of_elements; i++)
   {
       printf("Введите значение №%d: ", i);
       scanf("%d", &array[i]);
   }
}

int main()
{
   int numbers[3] = {0, 0, 0};
   read_array(numbers, 3); //массив будет изменен!
  
printf("Значения массива\n");
   for (int i = 0; i < 3; i++) {
      
printf("numbers [%d] \n", i);
   }

   return 0;
}

 

Как видите, программа передает массив в функцию по имени, а функция присваивает массиву элементы.

Таким образом, функция может изменить элементы массива, если ей это нужно.