Как передать массив строк функции на чистом си?
Изучая си, столкнулся с проблемой: получается, не могу передать массив строк ( или структур? ) в функцию.
На уровне сухой педантичной терминологии языка С массив, как таковой, невозможно никуда передать. Голые массивы в С являются некопируемыми объектами. Передать куда-то можно либо указатель на весь массив, либо указатель на его начальный элемент.
Именно указатель на начальный элемент массива вы и передаете в своем коде. Но после такой передачи определить размер исходного массива внутри функции уже невозможно, ибо никакого массива у вас там уже нет — есть только указатель на элемент.
Поэтому вот про это внутри вашей функции
вы можете сразу забыть. Это работает только с массивами, но не с указателями. Поэтому если вы собрались передавать указатель на элемент, то размер массива придется передавать отдельно
(Я бы предпочел использовать unsigned или size_t для представления размера массива, но раз уж вы используете int , то пусть будет int ).
Соответственно вызывать вашу функцию вы сможете как
В этом контексте трюк с sizeof сработает, т.е. здесь massive — это именно массив.
Что вы пытаетесь делать дальше внутри find_repeat и почему — не совсем понятно. (Идея, конечно, ясна, но реализация — хромает). В цикле у вас идет сравнение значений с элементами некоего массива temp_massive . Но temp_massive в это время не инициализирован и содержит мусор.
Как передать массив в функцию си
При рассмотрении передачи параметров в функцию указывалось, что параметры передаются в функцию по значению. То есть функция не изменяет значения передаваемых аргументов. Однако, используя в качестве параметров указатели, мы можем получить доступ к значению аргумента и изменить его.
Например, пусть у нас будет простейшая функция, которая увеличивает число на единицу:
Здесь переменная n передается в качестве аргумента для параметра x. Передача происходит по значению, поэтому любое изменение параметра x в функции increment никак не скажется на значении переменной n. Что мы можем увидеть, запустим программу:
Теперь изменим функцию increment, использовав в качестве параметра указатель:
Теперь в функции increment разыменовываем указатель, получаем его значение и увеличиваем его на единицу.
Это изменяет значение, которое находится по адресу, хранимому в указателе x.
Поскольку теперь функция в качестве параметра принимает указатель, то при ее вызове необходимо передать адрес переменной: increment(&n); .
В итоге изменение параметра x также повлияет на переменную n:
Еще один показательный пример применения указателей в параметрах — функция обмена значений:
Функция swap() в качестве параметров принимает два указателя. Посредством переменной temp происходит обмен значениями.
При вызове функции swap в нее передаются адреса переменных x и y, и в итоге их значения будут изменены.
Константые параметры
Если необходимо запретить изменять значение параметра-указателя внутри функции, то можно определить такой параметра как константный:
Фактически такой константный параметр будет работать как указатель на константу — мы не сможем изменить его значение внутри функции.
Массивы в параметрах
Если функция принимает в качестве параметра массив, то фактически в эту функцию передается только адрес начала массива. То есть как и в случае с указателями нам доступен адрес, по которому мы можем менять значения. В отличие от параметров примитивных типов, которые передаются по значению.
Например, определим функцию для увеличения элементов массива в два раза:
Функция twice в качестве параметров принимает массив и число его элементов и в цикле увеличивает их в два раза.
В функции main передаем массив в функцию twice и затем выводим его на консоль. В результате мы увидим, что массив nums был изменен:
Так как передача массива в функцию фактически представляет передачу адреса первого элемента, то массивы в параметрах мы можем заменить указателями:
В итоге в данном случае не будет большой разницы, какой тип имеет параметр — массив или указатель.
Передать 2D-массив функции в качестве параметра в C
В этом посте будет обсуждаться, как передать 2D-массив функции в качестве параметра в C.
в предыдущий пост, мы обсудили, как динамически выделять память для двумерного массива. В этом посте мы обсудим, как мы можем передать 2D-массив в функцию языка программирования C.
1. Для статического массива
Если мы знаем границы массива во время компиляции, мы можем передать статический 2D-массив функции на C, как показано ниже:
Массивы в языке Си
При решении задач с большим количеством данных одинакового типа использование переменных с различными именами, не упорядоченных по адресам памяти, затрудняет программирование. В подобных случаях в языке Си используют объекты, называемые массивами.
Массив — это непрерывный участок памяти, содержащий последовательность объектов одинакового типа, обозначаемый одним именем.
Массив характеризуется следующими основными понятиями:
Элемент массива (значение элемента массива) – значение, хранящееся в определенной ячейке памяти, расположенной в пределах массива, а также адрес этой ячейки памяти.
Каждый элемент массива характеризуется тремя величинами:
- адресом элемента — адресом начальной ячейки памяти, в которой расположен этот элемент;
- индексом элемента (порядковым номером элемента в массиве);
- значением элемента.
Адрес массива – адрес начального элемента массива.
Имя массива – идентификатор, используемый для обращения к элементам массива.
Размер массива – количество элементов массива
Размер элемента – количество байт, занимаемых одним элементом массива.
Графически расположение массива в памяти компьютера можно представить в виде непрерывной ленты адресов. 
Представленный на рисунке массив содержит q элементов с индексами от 0 до q-1 . Каждый элемент занимает в памяти компьютера k байт, причем расположение элементов в памяти последовательное.
Адреса i -го элемента массива имеет значение
n+k·i
Адрес массива представляет собой адрес начального (нулевого) элемента массива. Для обращения к элементам массива используется порядковый номер (индекс) элемента, начальное значение которого равно 0 . Так, если массив содержит q элементов, то индексы элементов массива меняются в пределах от 0 до q-1 .
Длина массива – количество байт, отводимое в памяти для хранения всех элементов массива.
ДлинаМассива = РазмерЭлемента * КоличествоЭлементов
Для определения размера элемента массива может использоваться функция
Объявление и инициализация массивов
Для объявления массива в языке Си используется следующий синтаксис:
тип имя[размерность]=<инициализация>;
Инициализация представляет собой набор начальных значений элементов массива, указанных в фигурных скобках, и разделенных запятыми.
Если количество инициализирующих значений, указанных в фигурных скобках, меньше, чем количество элементов массива, указанное в квадратных скобках, то все оставшиеся элементы в массиве (для которых не хватило инициализирующих значений) будут равны нулю. Это свойство удобно использовать для задания нулевых значений всем элементам массива.
Если массив проинициализирован при объявлении, то константные начальные значения его элементов указываются через запятую в фигурных скобках. В этом случае количество элементов в квадратных скобках может быть опущено.
При обращении к элементам массива индекс требуемого элемента указывается в квадратных скобках [] .
Результат выполнения программы: 
Однако часто требуется задавать значения элементов массива в процессе выполнения программы. При этом используется объявление массива без инициализации. В таком случае указание количества элементов в квадратных скобках обязательно.
Для задания начальных значений элементов массива очень часто используется параметрический цикл:
Результат выполнения программы 
Многомерные массивы
В языке Си могут быть также объявлены многомерные массивы. Отличие многомерного массива от одномерного состоит в том, что в одномерном массиве положение элемента определяется одним индексом, а в многомерном — несколькими. Примером многомерного массива является матрица.
Общая форма объявления многомерного массива
Элементы многомерного массива располагаются в последовательных ячейках оперативной памяти по возрастанию адресов. В памяти компьютера элементы многомерного массива располагаются подряд, например массив, имеющий 2 строки и 3 столбца,

Общее количество элементов в приведенном двумерном массиве определится как
КоличествоСтрок * КоличествоСтолбцов = 2 * 3 = 6.
Количество байт памяти, требуемых для размещения массива, определится как
КоличествоЭлементов * РазмерЭлемента = 6 * 4 = 24 байта.
Инициализация многомерных массивов
Значения элементов многомерного массива, как и в одномерном случае, могут быть заданы константными значениями при объявлении, заключенными в фигурные скобки <> . Однако в этом случае указание количества элементов в строках и столбцах должно быть обязательно указано в квадратных скобках [] .
Результат выполнения 
Однако чаще требуется вводить значения элементов многомерного массива в процессе выполнения программы. С этой целью удобно использовать вложенный параметрический цикл.
Результат выполнения 
Передача массива в функцию
Обработку массивов удобно организовывать с помощью специальных функций. Для обработки массива в качестве аргументов функции необходимо передать
- адрес массива,
- размер массива.
Исключение составляют функции обработки строк, в которые достаточно передать только адрес.
При передаче переменные в качестве аргументов функции данные передаются как копии. Это означает, что если внутри функции произойдет изменение значения параметра, то это никак не повлияет на его значение внутри вызывающей функции.
Если в функцию передается адрес переменной (или адрес массива), то все операции, выполняемые в функции с данными, находящимися в пределах видимости указанного адреса, производятся над оригиналом данных, поэтому исходный массив (или значение переменной) может быть изменено вызываемой функцией.
Пример на Си Дан массив из 10 элементов. Поменять местами наибольший и начальный элементы массива. Для операций поиска максимального элемента и обмена использовать функцию.
Результат выполнения
Пример на Си Дан массив размерности n. Вычислить произведение четных элементов
Результат выполнения 
Комментариев к записи: 139
<
int choice; //обраний пункт меню
double arr_C[100]; //одновимірний масив c
int n; //кількість елементів масиву c
double a, b;
int j;
int index;
double k;
//введення кількості елементів масиву B
printf( "\nУведіть кількість елементів масиву C(n)-(максимум 100) = " );
while (1)
<
if (scanf( "%d" , &n)!=1 n <= 0)
<
//якщо не виконуються умови-виведення запиту на повторне введення
printf( "Ви ввели неправильне значення. Спробуйте ще раз:\n" );
while (getchar() != '\n') //очистка буфера вводу та очікуання на правильний результат
continue;
>
else if (n > 100)
<
//якщо переповнення масиву-виведення запиту на повторне введення
printf( "Забагато елементів. Спробуйте ще раз:\n" );
while (getchar() != '\n') //очистка буфера вводу та очікуання на правильний результат
continue;
>
else
break ;
>
//введення елементів масиву B
for ( int i = 0; i < n; i++) <
printf( "arr_C[%d] = " , i);
while (scanf( "%lf" , &arr_C[i])!=1)
<
//якщо не виконуються умови-виведення запиту на повторне введення
printf( "Ви ввели неправильне значення. Спробуйте ще раз:\n" );
while (getchar() != '\n') //очистка буфера вводу та очікуання на правильний результат
continue;
>
>
a = DInput( "Введіть a:" );
b = DInput( "Введіть b:" );
k=0;
for (j=0; j<n; j++)
if ((arr_C[j]<a)(arr_C[j]>b)) <
if (k == 0)
index = j;
if (k == 1) <
arr_C[j] = arr_C[index];
arr_C[index] = arr_C[j];
break ;
>
k++;
>