Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
C_lect.doc
Скачиваний:
29
Добавлен:
12.11.2018
Размер:
856.06 Кб
Скачать

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

7.4.1. Передача в функцию массивов, не являющихся строками

Имя массива без скобок является указателем на массив, в функцию массив передается по указателю (передается адрес первого элемента) и в качестве отдельного параметра передается число элементов массива (за исключением случая, когда размерность заранее определена и задается константой).

Ниже представлен пример функции, которая считает сумму элементов массива.

#include <stdio.h>

int GetSum(int *p, int n) // p - указатель на массив, n - число элементов

{

int sum=0; // Начальное значение суммы

int i;

for(i=0; i<n; i++) sum+=p[i]; // Прибавляем к сумме элементы массива

return sum;

}

void main()

{

int M[]={1, 2, 3, 4, 5};

int sum=GetSum(M, 5); // Вызов функции

printf("sum=%d", sum); // sum=15

}

При передаче массивов в функцию разрешена другая форма записи заголовка функции:

int GetSum(int p[], int n)

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

При передаче строк достаточно передать адрес первого символа строки, число символов определяется по символу с кодом 0 (признак конца строки), число элементов массива можно не передавать. Ниже представлен пример функции для расчета длины строки.

#include <stdio.h>

int GetLen(char *str) // str - указатель на строку

{

int len;

for(len=0; str[len]; len++); // Пока не встретится 0 увеличиваем индекс len

return len;

}

void main()

{

char S[]="Hello world";

printf("len=%d", GetLen(S)); // Будет напечатано len=11

}

7.5. Функции с переменным количеством параметров

В языке Си существуют функции, количество параметров в которых заранее неизвестно (когда пишется исходный код функции), точное число параметров определяется только в момент вызова. Эти функции называются функция с переменным количеством параметров.

Формат функции:

<тип_возвращаемого_значения> <имя_функции>

(<спецификация_обязательных_параметров>, …) { …. }

В таких функциях должен быть хотя бы один обязательный параметр.

Функция с переменным количеством параметров должна иметь при своем выполнении механизм определения количества параметров и их типов. Возможны два подхода:

  • передача в функцию числа реально используемых параметров в качестве одного из обязательных параметров;

  • добавление в конец списка параметров параметра с уникальным значением.

Во всех случаях переход от одного параметра к другому осуществляется с помощью указателей. При этом следует учитывать порядок размещения параметров в стеке. В Си по умолчанию первым в стек помещается последний параметр, при этом он имеет максимальный адрес. Можно задать противоположный порядок, если функцию определить с модификатором pascal (противоположный ему модификатор cdecl, функция имеет по умолчанию). Функции с модификатором pascal не могут иметь переменное количество параметров.

Ниже представлены две функции с переменным количеством параметров, демонстрирующих два описанных выше подхода для определения числа реальных параметров.

#include <stdio.h>

int GetSum(int n,...) // Функция считает сумму параметров n - число параметров

{

int *p=&n; // Настраиваем указатель на 1-ый параметр

int sum=0; // Начальное значение суммы

int i; // Индексная переменная

for(i=0; i<n; i++) // Суммируем n параметров

sum+=*++p; // Суммируем параметры (увеличиваем указатель на 1 и

// обращаемся по адресу)

return sum;

}

double GetProiz(double par1,...) // Функция считает произведение параметров, признак окончания списка параметров значение 0.0

{

double pr=1; // Начальное значение произведения

double *p=&par1; // Настраиваем указатель на 1-ый параметр

for(; *p; p++) pr*=*p; // Умножаем на очередной параметр пока не встретится 0

return pr;

}

void main()

{

printf("sum=%d", GetSum(5, 1, 2, 3, 4, 5)); // Будет напечатано sum=15

printf("\nproiz=%f", GetProiz(2.0, 3.0, 4.0, 1.5, 0.0));

// Будет напечатано proiz=36.000000

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]